1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > C++ 静态链表(用数组模拟动态链表)

C++ 静态链表(用数组模拟动态链表)

时间:2019-08-11 04:35:53

相关推荐

C++ 静态链表(用数组模拟动态链表)

描述

主题:链表

功能:用数组模拟动态链表,分别实链表的插入、删除操作

提示:如果需要进入下一步操作,输入错误范围(如:0)即可

第一个元素的cur用于存放备用链表的第一个元素的下标

最后一个元素的cur用于存放第一个有数据的元素的下标

总的来说,静态链表其实是为了给没有指针的编程语言设计的一种实现单链表功能的方法。

尽管我们可以用单链表就不用静态链表了,但这样的思考方式是非常巧妙的,应该理解其思想,以备不时之需。

太烧脑了

思路如下:

下图为插入5个元素后的效果

代码

注释写的很清楚…

#include<iostream>#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0#define MAXSIZE 10typedef int Status;typedef struct List{int data = 0;//数据int cur;//游标}StaticLinkList;//检测链表长度int Listlength(StaticLinkList *list){int tcur = list[MAXSIZE - 1].cur;int length = 0;while (tcur != 0){tcur = list[tcur].cur;length++;}if (length >= MAXSIZE - 2){std::cout << "链表已满\n";system("pause");}return length;}//初始化Status Initlist(StaticLinkList *list){int i;for (i = 0; i < MAXSIZE; i++){list[i].cur = i + 1;//每一个元素的游标,都记录着下一个元素的下标}list[MAXSIZE - 1].cur = 0;return OK;}//插入int Malloc_SLL(StaticLinkList *list)//返回第一个空闲分量的下标,同时把下一个空闲分量留作备用{int i = list[0].cur;//将第一个空闲分量(代插入位置)的下标,用i存下来if (list[i].cur != 0)//如果不是空链表{list[0].cur = list[i].cur;//把下一个空闲分量留作备用}return i;//返回第一个空闲分量的下标}Status ListInsert(StaticLinkList *L, int i, int e)//在i位置插入元素e{int j;//第一个空闲分量的下标int k;int l;k = MAXSIZE - 1;//数组最后一个元素的下标if (i<1 || i>Listlength(L) + 1){std::cout << "位置超出范围\n";return ERROR;}j = Malloc_SLL(L);//第一个空闲分量的下标,也就是新节点的下标if (j != 0)//如果备用链表不为空{L[j].data = e;//把数据放进备用位置for (l = 1; l < i; l++)//根据想要插入的位置i,找到被插入节点的下标j{k = L[k].cur;}L[j].cur = L[k].cur;//L[j].cur是新节点游标,另其指向被插入的节点游标L[k].curL[k].cur = j;//L[k].cur是被插入的节点的游标指向,另其指向新节点下标jreturn OK;}return ERROR;}//删除//将下标为k的空闲节点回收到备用链表void Free_SLL(StaticLinkList *L, int k){L[k].cur = L[0].cur;//让k节点的游标指向第一个备用链表节点L[0].cur = k;//让数组第一个元素的游标指向k节点}Status ListDelete(StaticLinkList *L, int i){int j;int k;if (i<1 || i>Listlength(L)){std::cout << "位置超出范围\n";return ERROR;}k = MAXSIZE - 1;for (j = 1; j < i; j++){k = L[k].cur;}j = L[k].cur;L[k].cur = L[j].cur;Free_SLL(L, j);return OK;}//打印void print(StaticLinkList *L){int tcur = L[MAXSIZE - 1].cur;while (tcur != 0){std::cout << L[tcur].data << " ";tcur = L[tcur].cur;}std::cout << std::endl;}int main(){Status checker;StaticLinkList staticLinkList[MAXSIZE];checker = Initlist(staticLinkList);int i;//想插入的位置int e;//想插入的数据for (checker = TRUE; checker != ERROR;){print(staticLinkList);std::cout << "\n(最大长度" << MAXSIZE - 2 << ") 插入:位置 数据 ";std::cin >> i >> e;checker = ListInsert(staticLinkList, i, e);}//删除for (checker = TRUE; checker != ERROR;){print(staticLinkList);std::cout << "删除:位置 ";std::cin >> i;checker = ListDelete(staticLinkList, i);}system("pause");}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。