- /*
- 静态链表用一维数组表示链表便于在不设指针的高级程序语言中实现链表结构
- 数组的一个分量表示一个结点,一个结点由两个域组成:
- 数据域:data,用于存储要处理的数据元素
- 游标域:cur,用于代替指针指示结点在数据中的位置
- 特殊处理数组的第一个位置与最后一个位置
- 最后一个位置的游标指标第一个有数据的结点(相当于链表的头结点)
- 第一个位置的游标指标一个未使用的结点
- */
- #include <stdio.h>
- #include<stdlib.h>
- #define MAXSIZE 30
- typedef int DataType;
- typedef struct{
- int cur;
- DataType data;
- }comp,slinklist[MAXSIZE];
- //init
- void init_sl(slinklist l)
- {
- int i;
- for(i=0;i<MAXSIZE-1;++i) l[i].cur = i+1;
- l[MAXSIZE-1].cur = 0;
- }
- //location
- int locateElem(slinklist l,DataType e)
- {
- int i;
- i = l[0].cur;
- while(i && l[i].data != e) i=l[i].cur;
- return i;
- }
- //malloc
- int malloc_sl(slinklist l)
- {
- int i;
- i = l[0].cur;
- if(l[0].cur) l[0].cur = l[i].cur;
- return i;
- }
- //free
- void free_sl(slinklist l, int k)
- {
- l[k].cur = l[0].cur;
- l[0].cur = k;
- }
- //insert
- int insert_s(slinklist l,int pos,DataType e)
- {
- int m,k,i;
- m = malloc_sl(l);
- if( m == 0) return 0;
- k= MAXSIZE - 1;
- for(i=1;i<pos;++i) k = l[k].cur;
- l[m].data = e;
- l[m].cur = l[k].cur;
- l[k].cur = m;
- return 1;
- }
- //delete
- int delete_s(slinklist l, int pos)
- {
- int k,d,i;
- k= MAXSIZE-1;
- for(i=1;i<pos;++i) k = l[k].cur;
- d = l[k].cur;
- l[k].cur = l[d].cur;
- free_sl(l,d);
- return 1;
- }
- void Print(slinklist l) //打印链表
- {
- int k = l[MAXSIZE - 1].cur;
- while(k)
- {
- printf("num:%d \\t",k);
- printf("data:%d \\t",l[k].data);
- printf("cur:%d \\n",l[k].cur);
- k = l[k].cur;
- }
- printf("\\n");
- }
- //main
- int main()
- {
- printf("\\ntest slinklist:\\n");
- int i,k,e;
- slinklist l;
- init_sl(l);
- //insert_s(l,2,3);
- for(i = 0;i < 8;++i) insert_s(l,1,i);
- insert_s(l,3,555);
- delete_s(l, 1);
- Print(l);
- return 1;
- }
- //该片段来自于http://www.codesnippet.cn/detail/2608201410348.html
来源: http://www.codesnippet.cn/detail/2608201410348.html