线性表的链式存储
链式结构存储密度小,存储空间利用率低
只能顺序存储(其中指针域用来表明节点间的关系)
插入和删除操作方便
初始化线性表 InitList(L)
销毁线性表 DestoryList(L)
判断线性表是否为空 Listempty(L)
求线性表的长度 ListLength(L)
求线性表中某个数据元素值 GetElem(L,i,e)
按元素值查找 LocateElem(L,e)
插入数据元素 ListInsert(L,e)
删除数据元素 ListDelete(L,e)
代码如下:
1 #include
2 #include
3 typedef int ElemType;
4
5 typedef struct LNode {
6 ElemType data;
7 struct LNode *next;
8 } LinkList;
9
10 /*建立单链表*/
11 /*头插法*/
12 void CreateListF(LinkList* &L,ElemType a[],int n) {
13 L = (LinkList *)malloc(sizeof(LinkList));
14 L -> next = NULL;
15
16 int i;
17 LinkList *s;
18 for(i = 0; i < n; i++) {
19 s = (LinkList *)malloc(sizeof(LinkList));
20 s -> data = a[i];
21 s -> next = L -> next;
22 L -> next = s;
23 }
24 }
25
26 /*尾插法*/
27 void CreateListR(LinkList* &L,int n) {
28 L = (LinkList *)malloc(sizeof(LinkList));
29 L -> next = NULL;
30
31 LinkList *p;//指针 p 来进行操作
32 p = L;
33
34 LinkList *s;
35 int i;
36 for(i = 0; i < n; i++) {
37 s = (LinkList *)malloc(sizeof(LinkList));
38 s -> data = a[i];
39 p -> next = s;
40 p = s;
41 }
42 p -> next = NULL;
43 }
44
45 /*基本运算*/
46 /*初始化线性表 InitList(L)*/
47 void InitList(LinkList* &L) {
48 L = (LinkList *)malloc(sizeof(LinkList));
49 L -> next = NULL;
50 }
51
52 /*销毁线性表 DestoryList(L)*/
53 void DestoryList(LinkList* &L) {
54 LinkList *pre = L;
55 LinkList *p = L -> next;
56
57 while(p != NULL) {
58 free(pre);
59 pre = p;
60 p = p -> next;
61 }
62
63 free(pre);
64 }
65
66 /*判断线性表是否为空 Listempty(L)*/
67 bool Listempty(LinkList* L) {
68 return L -> next == NULL;
69 }
70
71 /*求线性表的长度 ListLength(L)*/
72 int ListLength(LinkList* L) {
73 LinkList *p = L;
74 int i = 0;
75
76 while(p -> next != NULL) {
77 p = p -> next;
78 i++;
79 }
80
81 return i;
82 }
83
85 void dispList(LinkList* L) {
86 LinkList *p = L -> next;
87
88 while(p != NULL) {
89 printf("%d ",p -> data);
90 p = p -> next;
91 }
92
93 printf("n");
94 }
95
96 /*求线性表中某个数据元素值 GetElem(L,e)*/
97 bool GetElem(LinkList* L,int i,ElemType &e) {
98 LinkList *p = L;
99
100 int k = 0;
101 while(k < i && p != NULL) {
102 k++;
103 p = p ->next;
104 }
105
106 if (p == NULL) {
107 return false;
108 } else {
109 e = p -> data;
110 return true;
111 }
112 }
113
114 /*按元素值查找 LocateElem(L,e)*/
115 int LocateElem_wq(LinkList* L,ElemType e) {
116 LinkList *p = L;
117
118 int k = 0;
119 while(p != NULL) {
120 if (e == p -> data) {
121 return k;
122 }
123 p = p -> next;
124 k++;
125 }
126
127 return 0;
128 }
129
130 int LocateElem(LinkList* L,ElemType e) {
131 LinkList *p = L -> next;
132
133 int k = 1;
134 while(p != NULL && e != p -> data) {
135 p = p -> next;
136 k++;
137 }
138
139 if (p == NULL) {
140 return 0;
141 } else {
142 return k;
143 }
144 }
145
146 /*插入数据元素 ListInsert(L,e)*/
147 bool ListInsert(LinkList* &L,ElemType e) {
148 LinkList *p = L;
149
150 int k = 0;
151 while(k < i - 1 && p != NULL) {//找到前驱节点
152 p = p -> next;
153 k++;
154 }
155
156 if (p == NULL) {
157 return false;
158 } else {
159 LinkList *s;
160 s = (LinkList *)malloc(sizeof(LinkList));
161 s -> data = e;
162 s -> next = p -> next;
163 p -> next = s;
164 return true;
165 }
166 }
167
168 /*删除数据元素 ListDelete(L,e)*/
169 bool ListDelete_wq(LinkList* &L,ElemType &e) {
170 LinkList *pre = L;//保存第 i 个指针的前驱
171 LinkList *p = L -> next;//保存第 i 个指针的位置
172
173 int k = 1;
174 while(k < i && p != NULL) {
175 pre = pre -> next;
176 p = p -> next;
177 k++;
178 }
179
180 if (p == NULL) {
181 return false;
182 } else {
183 e = p ->data;
184 pre -> next = p -> next;
185 free(p);
186 return true;
187 }
188 }
189
190 bool ListDelete(LinkList* &L,ElemType &e) {
191 LinkList *pre = L;//保存第 i 个指针的前驱
192
193 int k = 0;
194 while(k < i - 1 && pre != NULL) {
195 pre = pre -> next;
196 k++;
197 }
198
199 if (pre == NULL) {
200 return false;
201 } else {
202 LinkList *p;
203 p = pre -> next;
204 if (p == NULL) {
205 return false;
206 }
207 e = p -> data;
208 pre -> next = p -> next;
209 free(p);
210 return true;
211 }
212 }
213
214 int main(int argc,char const *argv[]) {
215 int a[] = {1,2,3,4,5,6,7,8,9};
216 LinkList *L;
217 InitList(L);
218 //CreateListR(L,a,9);
219 CreateListF(L,9);
220 dispList(L);
221 printf("length = %dn",ListLength(L));
222 ElemType e;
223 GetElem(L,e);
224 printf("fourth number = %dn",e);
225 printf("%d is located at %dn",e,LocateElem_wq(L,6));
226 ListInsert(L,10);
227 dispList(L);
228 ListDelete_wq(L,e);
229 dispList(L);
230 return 0;
231 }
加号求调戏
这儿是运行结果哦:
9 8 7 6 5 4 3 2 1
length = 9
fourth number = 6
6 is located at 4
9 10 8 7 6 5 4 3 2 1
9 8 7 6 5 4 3 2 1
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。