1 /*
2 编译器:Dev-c++ 5.1.0
3 文件名:linkList3.cpp
4 代码版本号:1.0
5 时间:2015年9月24日11:34:16
6 */
7
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <time.h>
11 #define ERROR 0
12 #define OK 1
13 #define TRUE 1
14 #define FALSE 0
15 #define OVERFLOW -2
16
17 typedef int Status;
18 typedef int ElemType;
19
20 typedef struct lNode{
21 ElemType data;
22 struct lNode *next;
23 }lNode,*linkList;
24
25 /*初始化建立空链表 ---测试成功*/
26 Status initList(linkList *l){
27 *l=(linkList)malloc(sizeof(lNode)); //产生头结点,使L指向头结点
28 if(!*l){
29 exit(OVERFLOW);
30 return ERROR;
31 }
32 (*l)->next=NULL;
33 return OK;
34 }
35
36 /*判定是否为空表 ---测试成功*/
37 bool isEmpty(linkList l){
38 if(l->next)
39 return FALSE;
40 return TRUE;
41 }
42
43 /*清空链表 ---测试成功*/
44 Status clearList(linkList *l){
45 linkList p=(*l)->next;
46 linkList q;
47 while(!p)
48 {
49 q=p;
50 free(q);
51 p=p->next;
52 }
53 (*l)->next=NULL;//头结点指针域为空
54 return OK;
55 }
56
57 /*返回L中数据元素个数 ---测试成功*/
58 int listLength(linkList l){
59 int i=0;
60 linkList p=l->next;
61 while(p){
62 //printf("listLength()函数while语句\n") ;
63 i++;//i=1
64 p=p->next;
65 }
66 return i;
67 }
68
69 /*用e返回L中第i个数据元素的值---测试成功*/
70 Status getElem(linkList *l,int i,ElemType *e){
71 linkList p=(*l)->next;
72 int j=1;
73 if(i<1||i>listLength(*l))
74 {
75 exit(OVERFLOW);
76 return ERROR;
77 }
78
79 while(p&&j!=i)
80 {
81 p=p->next;
82 j++;
83 }
84
85 if(!p)
86 return ERROR;
87
88 *e=p->data;
89 return OK;
90 }
91
92 /*返回L中第1个与e满足关系的数据元素的位序,若没有则返回0 ---测试成功 */
93 int locateElem(linkList l,ElemType e){
94 linkList p=l->next;
95 int i=1;
96 while(p&&p->data!=e)
97 {
98 p=p->next;
99 i++;
100 }
101 if(!p)
102 return 0;
103 else
104 return i;
105 }
106
107 /*在L中第i个位置之前插入新的数据元素e,L的长度加1 ---测试成功*/
108 Status listInsert(linkList *l,int i,ElemType e){
109
110 linkList p=(*l); //p=NULL;
111 linkList q;
112 int j=0;
113
114 if(i<1||i>(listLength(*l)+1))
115 {
116 return ERROR;
117 }
118 while(p&&j<i-1) // 1<2
119 {
120 j++; //j=2
121 p=p->next;//p 第2个
122 }
123
124 q=(linkList)malloc(sizeof(lNode));
125 q->data=e; //q->data=5;
126 q->next=p->next;//q->next=NULL
127 p->next=q;//p->next=q
128 return OK;
129 }
130
131 /*删除L的第i个数据元素,并用e返回其值,L的长度减1 ---测试成功*/
132 Status deleteElem(linkList *l,int i,ElemType *e){
133 linkList p=(*l)->next;
134 int j=1;
135 if(i<1||i>listLength(*l))
136 {
137 return ERROR;
138 }
139 while(p&&j<i-1) //j指向第8个元素
140 {
141 j++;
142 p=p->next;
143 }
144 if(!p)
145 return ERROR;
146 else{
147 linkList q=p; //q指向第8个元素
148 *e=q->next->data; //第9个元素的data赋给*e
149 p->next=p->next->next;//第8个元素下一个是第10个元素
150 free(q->next);
151 return OK;
152 }
153 }
154
155 /*依次对L的每个数据元素输出---测试成功 */
156 Status listTraverse(linkList *l){
157 linkList p=(*l)->next;
158 int j=1;
159
160 while(p)
161 {
162 printf("第%d个结点的数据为%d\n",j,p->data);
163 p=p->next;
164 j++;
165 }
166 return OK;
167
168 }
169
170 /*随机产生n个元素的值,建立带表头结点的单链线性表L(头插法)---测试成功*/
171 Status createListHead(linkList *l,int n)
172 {
173 srand(time(NULL));
174 linkList q;
175 for(int i=1;i<=n;i++){
176 q=(linkList)malloc(sizeof(lNode));
177 q->data=rand()%100+1;
178 q->next=(*l)->next;
179 (*l)->next=q;
180 }
181 return OK;
182 }
183
184 /*随机产生n个元素的值,建立带表头结点的单链线性表L(尾插法)---测试成功*/
185 Status createListTail(linkList *l, int n)
186 {
187 srand(time(NULL));
188 linkList q;
189 linkList tail=(*l);
190 for(int i=1;i<=n;i++){
191 q=(linkList)malloc(sizeof(lNode));
192 q->data=rand()%100+1;
193 q->next=NULL;
194 tail->next=q;
195 tail=tail->next;
196 }
197 return OK;
198 }
199
200 int main(){
201 ElemType e;//节点的数据data
202 linkList L;
203 initList(&L);
204 if(isEmpty(L))
205 printf("循环赋值前是空表\n");
206 else
207 printf("循环赋值前不是空表\n");
208 createListTail(&L,5);
209
210 printf("链表长度为%d\n",listLength(L));
211 listTraverse(&L);
212 int n;
213 printf("请输入要删除的元素位序:");
214 scanf("%d",&n);
215 deleteElem(&L,n,&e);
216 printf("删除第%d个元素的值为%d\n",n,e);
217 printf("删除后链表的长度为%d",listLength(L));
218 return 0;
219 }