静态链表的实现

来源:互联网 发布:人事考勤软件 编辑:程序博客网 时间:2024/06/13 03:29
/*  静态链表用一维数组表示链表便于在不设指针的高级程序语言中实现链表结构数组的一个分量表示一个结点,一个结点由两个域组成:数据域:data,用于存储要处理的数据元素游标域:cur,用于代替指针指示结点在数据中的位置特殊处理数组的第一个位置与最后一个位置最后一个位置的游标指标第一个有数据的结点(相当于链表的头结点)第一个位置的游标指标一个未使用的结点 */
#include <stdio.h>#include <stdlib.h>#define MAXSIZE 1000  //设定数组的最大值typedef int ElemType; //设定数组的数据类型typedef struct{ElemType data; //结点的数据域int cur;  //结点的游标域}Node,SLinkList[MAXSIZE];void InitList(SLinkList l); //初始化链表void InsertList(SLinkList l,int i,ElemType e); //在链表的第i个位置插入元素void DeleteList(SLinkList l,int i); //删除链表的第i个元素int  Malloc_SLL(SLinkList l); //申请空间void Free_SLL(SLinkList l); //释放空间int  GetListLength(SLinkList l); //返回链表的长度void Print(SLinkList l); //打印链表void InitList(SLinkList l) //初始化链表{for(int i = 0;i < MAXSIZE - 1;++i) //初始化链表的游标,使其全部形成链接l[i].cur = i + 1;l[MAXSIZE - 1].cur = 0; //初始化最后一个结点的游标为0}int Malloc_SLL(SLinkList l) //申请链表的剩余空间{int j = l[0].cur;if(l[0].cur)l[0].cur = l[j].cur;return j;}void Free_SLL(SLinkList l,int j) //释放链表的空间{l[j].cur = l[0].cur;l[0].cur = j;}void InsertList(SLinkList l,int i,ElemType e) //在链表的第i个位置插入元素e{if(i < 1 || i > GetListLength(l) + 1) //超出范围退出return;int k = MAXSIZE - 1; //使K为最后一个结点游标for(int j = 0;j < i - 1;++j) k = l[k].cur;int v = Malloc_SLL(l); //申请空间if(v) //如果有空间{l[v].data = e;l[v].cur = l[k].cur;l[k].cur = v;}}void DeleteList(SLinkList l,int i) //删除第i个位置的元素{if(i < 1 || i > GetListLength(l)) //超出范围退出return;int k = MAXSIZE - 1; //K指示链表的最后一个结点for(int j = 0;j < i - 1;++j) //使k指示要删除的结点的前一个结点k = l[k].cur;int temp = l[k].cur;l[k].cur = l[temp].cur;Free_SLL(l,temp);}int GetListLength(SLinkList l) //返回链表的当前长度{int j = 0;int k = l[MAXSIZE - 1].cur;while(k){++j;k = l[k].cur;}return j;}void Print(SLinkList l) //打印链表{int k = l[MAXSIZE - 1].cur;while(k){printf("%d ",l[k].data);k = l[k].cur;}printf("\n");}int main(){SLinkList l;InitList(l); //初始化链表for(int i = 0;i < 8;++i)InsertList(l,1,i);Print(l); //输出链表InsertList(l,3,22); //在链表的第3个位置插入22Print(l);DeleteList(l,7); //删除第8个位置的元素Print(l);return 0;}

转载自 http://blog.csdn.net/flying0033/article/details/7090665
0 0