1 /*静态链表*/
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <time.h>
5
6 #define OK 1
7 #define ERROR 0
8 #define MAXSIZE 1000
9 typedef int ElemType;
10 typedef int Status;
11
12 typedef struct
13 {
14 ElemType data;
15 int cur;
16 }Component,StaticLinkList[MAXSIZE];
17
18
19 Status InitList(StaticLinkList space) //初始化操作
20 {
21 int i;
22 for (i = 0; i < MAXSIZE; i++)
23 {
24 space[i].cur = i + 1;
25 }
26 space[MAXSIZE - 1].cur = 0;
27 return OK;
28 }
29 int Malloc_SLL(StaticLinkList space)
30 {
31 int i = space[0].cur;
32 if (space[0].cur)
33 space[0].cur = space[i].cur;
34 return i;
35 }
36
37 int ListLength(StaticLinkList L)
38 {
39 int j = 0;
40 int i = L[MAXSIZE - 1].cur;
41 while (i)
42 {
43 i = L[i].cur;
44 j++;
45 }
46 return j;
47 }
48
49 void Free_SSL(StaticLinkList L, int k) //清空线性表
50 {
51 L[k].cur = L[0].cur;
52 L[0].cur = k;
53 }
54
55 Status ListInsert(StaticLinkList L, int i, ElemType e) //在线性表L的第i个位置插入元素e
56 {
57 int j, k, l;
58 k = MAXSIZE - 1;
59 if (i<1 || i>ListLength(L)+1)
60 return ERROR;
61 j = Malloc_SLL(L);
62 if (j)
63 {
64 for (l = 1; l <= i-1; l++)
65 {
66 k = L[k].cur;
67 }
68 L[j].data = e;
69 L[j].cur = L[k].cur;
70 L[k].cur = j;
71 return OK;
72 }
73 return ERROR;
74 }
75
76 Status ListDelete(StaticLinkList L, int i, ElemType* e)//删除线性表L中第i个位置元素,并用e返回其值
77 {
78 int j, k;
79 k = MAXSIZE - 1;
80 if (i<1 || i>ListLength(L) + 1)
81 return ERROR;
82
83 for (j = 1; j <= i; j++)
84 {
85 k = L[k].cur;
86 }
87 j = L[k].cur;
88 L[k].cur = L[j].cur;
89 Free_SSL(L, j);
90 return OK;
91 }
92
93 void visit(ElemType n)
94 {
95 printf("%d ", n);
96 }
97
98 void ListTraverse(StaticLinkList L)
99 {
100 int i = L[MAXSIZE - 1].cur;
101 while (i)
102 {
103 visit(L[i].data);
104 i = L[i].cur;
105 }
106 }
107 int main()
108 {
109 StaticLinkList L;
110 int i = 0;
111 int opp = 0;
112 int pos;
113 int j;
114 ElemType e;
115 i = InitList(L);
116 printf("链表L初始化完毕,ListLength(L)=%d\n\n", ListLength(L));
117
118 printf("\n1.遍历操作 \n2.插入操作 \n3.删除操作 \n0.退出 \n请选择你的操作:\n");
119
120 while (opp != '0') {
121 scanf_s("%c", &opp);
122 switch (opp) {
123 case '1':
124 ListTraverse(L);
125 printf("\n");
126 break;
127
128 case '2':
129 srand((unsigned)time(NULL));
130 for (j = 1; j <= 10; j++)
131 {
132 i = ListInsert(L, j, rand() % 100);
133 }
134 printf("在L的表头依次插入10个随机数后:");
135 ListTraverse(L);
136 printf("\n");
137 printf("链表L创建完毕,ListLength(L)=%d\n\n", ListLength(L));
138 break;
139 case '3':
140 printf("要删除第几个元素?");
141 scanf_s("%d", &pos);
142 ListDelete(L, pos, &e);
143 printf("删除第%d个元素成功,现在链表为:\n", pos);
144 ListTraverse(L);
145 printf("\n");
146 break;
147
148 case '0':
149 exit(0);
150 }
151 }
152 }