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