静态链表-数据结构(3)

来源:互联网 发布:mac系统xampp使用教程 编辑:程序博客网 时间:2024/05/22 14:16

一、解析

对于静态链表,链表就是结点中保存下一个元素的地址。而静态呢就是一个数组保存下个地址的索引位置达到节省空间位置。参考书上P31-P34

二、存储结构

//静态链表typedef struct{ElemType data;int cur;//这个cur跟链表的next差不多}component, SLinkList[MAXSIZE];

三、操作

//======================================静态链表===============#define MAXSIZE 100//链表的最大长度//静态链表typedef struct{ElemType data;int cur;//这个cur跟链表的next差不多}component, SLinkList[MAXSIZE];//空链表的头位置为0;//int start = -1;//非空链表头 -1代表还没生成int LocateElem_SL(SLinkList S, ElemType e){//在静态链表中查找第1个值为e的元素//若找到,则返回它在L中的为序,否则返回0return 0;}void InitSpace_SL(SLinkList &space){//将一维数组space中各分量链成一个备用链表,space[0],cer为头指针 空链的头指针for (int i = 0; i < MAXSIZE - 1; i++){space[i].cur = i + 1;//space[i].data = i + 1;}space[MAXSIZE - 1].cur = 0;//space[MAXSIZE - 1].data = 0;}int Malloc_SL(SLinkList &space){//若备用空间非空,则返回分配的结点下标,否则返回0int i = space[0].cur;//从空链分配下来的一个空的空闲下标if (i){//如果这个i不等于0的情况 证明空链表还有空间 将这个i分配出去//更新空链表的头结点的curspace[0].cur = space[i].cur;return i;}//空链表没有空间了return 0;}void Free_SL(SLinkList &space, int k){//将下标为k的空闲结点回收到备用链表 //这里无视了k的合法性space[k].cur = space[0].cur;space[0].cur = k;}void ListDelete_SL(SLinkList &space, int i, int start){//删除静态链表的第i个元素 start指明静态链表中元素的首结点//这里不做i的非法判断了//要删掉第i和位置 先去到第i-1个位置int p = space[start].cur;//跳过头结点的第0个元素的位置for (int j = 0; j < i - 1; j++){p = space[p].cur;}int k = space[p].cur;space[p].cur = space[k].cur;Free_SL(space, k);//printf("\n第i-1个位置 %d\n",space[p].data);}void CreateList_SL(SLinkList &space, int* nums, int size, int &start){//创建静态链表 nums是放置的元素 num是放置的元素个数InitSpace_SL(space);start = Malloc_SL(space);//分配的头结点的位置int tail = start;//有数据链表的最后位置for (int i = 0; i < size; i++){int j = Malloc_SL(space);//分配出的J位置是空闲位置 space[j].data = nums[i];space[tail].cur = j;tail = j;}space[tail].cur = 0;//尾指针指向空的头}void PrintfList_SL(SLinkList &space, int start){int i = start;if (start == -1){//链表中还没元素printf("链表中还没元素");return;}while (space[i].cur){i = space[i].cur;//移动下个结点printf("%d:", space[i].data);}}void difference(SLinkList lA, SLinkList lB, SLinkList &lC){//(A-B)U(B-A)对于算法2.17感觉没什么好说的 书上的写法感觉很乱 用scanf搞事情,我改了下 参数//将A集合与B集合进行算法2.17然后保存到lC}

四、执行

 //静态链表 SLinkList listA; int numsA[4] = { 1, 2, 3, 4 }; int startA = -1; CreateList_SL(listA,numsA,4,startA); ListDelete_SL(listA,2,startA); PrintfList_SL(listA,startA);

输出:
1:2:4:请按任意键继续. . .




原创粉丝点击