1 /*
2 list.c
3 代码是在看视频时跟着敲的,如有错误请指正
4 用的编译器:c-free
5 */
6 #include<stdio.h>
7 #include<stdlib.h>
8 #include<stdbool.h>
9
10 typedef struct Node
11 {
12 int data;// 数据域
13 struct Node * pNext;//指针域
14 }NODE, *PNODE;//NODE等价于struct Node PNODE等价于struct Node *
15 PNODE create_list(void);
16 void traverse_list(PNODE phead);
17 bool is_empty(PNODE pHead);
18 int length_list(PNODE);
19 bool insert_list(PNODE,int,int);//在pHead所指向链表的第pos个节点的前面 插入一个新的结点,该节点的值是val ,并且pos的值是从1开始
20 bool delete_list(PNODE,int,int *);
21 void sort_list(PNODE);
22
23 int main(void)
24 {
25 PNODE pHead = NULL; //等价于 struct Node * pHead = NULL;
26 int val;
27
28 pHead = create_list();//创建一个非循环单链表
29 traverse_list(pHead);
30
31 //insert_list(pHead, 4, 33);
32 if(delete_list(pHead, 4, &val))
33 {
34 printf("删除成功,您删除的元素是:%d\n",val);
35 }
36 else
37 {
38 printf("删除失败!你删除的元素不存在!\n");
39 }
40 traverse_list(pHead);
41 //int len = length_list(pHead);
42 // printf("链表的长度是%d\n",len);
43
44 //sort_list(pHead);
45 //traverse_list(pHead);
46 /*if (is_empty(pHead))
47 printf("链表为空!\n");
48 else
49 printf("链表不空!\n");
50 */
51 return 0;
52
53 }
54
55 PNODE create_list(void)
56 {
57 int len;//用来存放有效节点的个数
58 int i;
59 int val;//用来临时存放用户输入的结点的值
60
61 //分配 了一个不存放有效数据的头结点
62 PNODE pHead = (PNODE)malloc(sizeof(NODE));
63 if(NULL == pHead)
64 {
65 printf("分配失败,程序终止!\n");
66 exit(-1);
67 }
68 PNODE pTail = pHead;
69 pTail->pNext = NULL;
70
71 printf("请输入你需要生成的链表节点数:len = ");
72 scanf("%d", &len);
73
74 for(i=0; i<len; ++i)
75 {
76 printf("请输入第%d个节点的值:", i+1);
77 scanf("%d", &val);
78
79 PNODE pNew = (PNODE)malloc(sizeof(NODE));
80 if(NULL == pNew)
81 {
82 printf("分配失败,程序终止!\n");
83 exit(-1);
84 }
85 pNew->data = val;
86 pTail->pNext = pNew;
87 pNew->pNext = NULL;
88 pTail = pNew;
89 }
90
91 return pHead;
92 }
93
94 void traverse_list(PNODE pHead)
95 {
96 PNODE p = pHead->pNext;
97
98 while(NULL != p)
99 {
100 printf("%d ", p->data);
101 p = p->pNext;
102 }
103 printf("\n");
104
105 return;
106 }
107
108 bool is_empty(PNODE pHead)
109 {
110 if(NULL == pHead->pNext)
111 return true;
112 else
113 return false;
114
115 }
116 int length_list(PNODE pHead)
117 {
118 PNODE p = pHead->pNext;
119 int len = 0;
120
121 while (NULL != p)
122 {
123 ++len;
124 p = p->pNext;
125 }
126 return len;
127 }
128
129 void sort_list(PNODE pHead)
130 {
131 int i, j, t;
132 int len = length_list(pHead);
133 PNODE p, q;
134
135 for(i=0,p=pHead->pNext; i<len-1; ++i,p=p->pNext)
136 {
137 for(j=i+1,q=p->pNext; j<len; ++j,q=q->pNext)
138 {
139 if(p->data > q->data)//类似于数组中的 a[i] > a[j]
140 {
141 t = p->data;//类似于数组中的:t = a[i];
142 p->data = q->data;//类似于数组中的:a[i] = a[j];
143 q->data = t;//类似于数组中的 a[j] = t;
144 }
145 }
146 }
147 }
148
149 //在pHead所指向链表的第pos个节点的前面 插入一个新的结点,该节点的值是val ,并且pos的值是从1开始
150 bool insert_list(PNODE pHead,int pos,int val)
151 {
152 int i = 0;
153 PNODE p = pHead;
154
155 while (NULL != p && i<pos-1)
156 {
157 p = p->pNext;
158 ++i;
159 }
160 if(i>pos-1 || NULL==p)
161 return false;
162
163 PNODE pNew = (PNODE)malloc (sizeof(NODE));
164 if(NULL == pNew)
165 {
166 printf("动态内存分配失败!\n");
167 exit(-1);
168 }
169 pNew->data = val;
170 PNODE q = p->pNext;//q的作用就是临时temp变量
171 p->pNext = pNew;
172 pNew->pNext = q;
173
174 return true;
175 }
176
177 bool delete_list(PNODE pHead,int pos,int *pVal)
178 {
179 int i = 0;
180 PNODE p = pHead;
181
182 while (NULL != p->pNext && i<pos-1)
183 {
184 p = p->pNext;
185 ++i;
186 }
187 if(i>pos-1 || NULL==p->pNext)
188 return false;
189
190 PNODE q = p->pNext;
191 *pVal = q->data;
192
193 //删除p节点后面的结点
194 p-> pNext = p->pNext->pNext;
195 free(q);
196 q = NULL;
197
198 return true;
199 }