1 /*
2 * LinkNode.c
3 *
4 * Created on: Jan 14, 2014
5 * Author: root
6 */
7 #include <stdlib.h>
8 #include <stdio.h>
9 #include <malloc.h>
10 typedef struct node
11 {
12 char *data;
13 struct node *next;
14 }Node,*pNode;
15
16 pNode create();
17 void printList(pNode pHead);
18 int InsertNode(pNode pHead,int front,char *data);
19 char* DeleteNode(pNode pHead,int pos);
20 int LengthList(pNode pHead);
21 void Sort_List(pNode pHead);
22 pNode Reverse_List(pNode pHead);
23 int main()
24 {
25
26 pNode pHead = NULL;
27 int front;
28 int choose;
29 char* return_val=NULL;
30 pHead=create();
31 printf("你输入的数据是,\n");
32 int length;
33 length = LengthList(pHead);
34 printf("(长度为%d的单链表):\n",length);
35 printList(pHead);
36 while(1)
37 {
38 printf("是否还要进行如下操作:\n");
39 printf("1.插入数据 2.删除数据 3.修改数据 4.链表排序 5.链表逆序 6.退出\n");
40 scanf("%d",&choose);
41 if(choose!=1&&choose!=2&&choose!=3&&choose!=4&&choose!=5)
42 {
43 printf("error:请输入正确的数字!\n");
44 break;
45 }
46 switch(choose)
47 {
48 case 1:
49 {
50 printf("请输入要在第几个节点前插入数据:");
51 scanf("%d",&front);
52 if(front>length)
53 {
54 front = length;
55 printf("Warning:输入结点位置大于链表长度,默认在表尾部添加!\n");
56 }
57 printf("请输入要插入的数据:");
58 char *data = (char*)malloc(sizeof(char*));
59 scanf("%s",data);
60 if(InsertNode(pHead,front,data)==1)
61 {
62 printf("插入成功\n插入后的数据是:\n");
63 printList(pHead);
64 }else
65 {
66 printf("插入失败\n");
67 }
68 break;
69 }
70 case 2:
71 {
72 printf("请输入要删除第几个节点的数据:");
73 scanf("%d",&front);
74 if(front>length)
75 {
76 front=length;
77 printf("Warning:输入结点位置大于链表长度,默认删除表最后一个结点!\n");
78 }
79 return_val = DeleteNode(pHead,front);
80 if(return_val==NULL)
81 {
82 printf("删除失败。\n");
83 }else
84 {
85 printf("删除成功。删除的元素是:%s\n",return_val);
86 }
87 printf("操作完成后的数据是:\n");
88 printList(pHead);
89 break;
90 }
91 case 3:
92 {
93 printf("暂时没有做这个功能!\n");
94 break;
95 }
96 case 4:
97 {
98 Sort_List(pHead);
99 break;
100 }
101 case 5:
102 {
103 Reverse_List(pHead);
104 break;
105 }
106 case 6:
107 {
108 exit(1);
109 }
110 return 0;
111 }
112
113 }
114
115 return 0;
116 }
117
118 pNode create()
119 {
120 int i;
121 int len;
122 pNode pHead = (pNode)malloc(sizeof(struct node));
123 pNode pTail = pHead;
124 pTail->next = NULL;
125 printf("请输入节点个数:");
126 scanf("%d",&len);
127 for(i=0;i<len;i++)
128 {
129 char *val=(char*)malloc(sizeof(char*));//Warning.malloc
130 printf("第 %d 个节点的数值:",i+1);
131 scanf("%s",val);
132 pNode pNew = (pNode)malloc(sizeof(Node));
133 pNew->data = val;
134 /*
135 * 有序的
136 * 1.将尾节点的next指针指向新节点
137 * 2.然后把新节点next指针设置为空
138 * 3. 最后将新节点作为尾节点
139 */
140 pTail->next=pNew;
141 pNew->next=NULL;
142 pTail = pNew;
143 }
144 printf("create list success!");
145 return pHead;
146 }
147
148
149 void printList(pNode pHead)
150 {
151 pNode p = pHead->next;
152 while(p!=NULL)
153 {
154 printf("%s\n",p->data);
155 p=p->next;
156 }
157 printf("\n");
158 }
159 int InsertNode(pNode pHead,int front,char *data)
160 {
161 int i = 0;
162 pNode _node = pHead;
163 pNode pSwap ;
164
165 if((front<1) || (_node==NULL))
166 {
167 printf("error:List is NULL or front<1");
168 return -1;
169
170 }
171 while(i<front-1)
172 {
173 _node = _node->next;
174 ++i;
175 }
176 pNode pNew = (pNode)malloc(sizeof(Node));
177
178 pNew->data=data;
179 pSwap = _node->next;
180 _node->next = pNew;
181 pNew->next = pSwap;
182
183 return 1;
184 }
185
186 char* DeleteNode(pNode pHead,int pos)
187 {
188 int i=0;
189 char *data;
190 pNode _node =pHead;
191 pNode pSwap ;
192 if((pos < 1) && (NULL == _node->next))
193 {
194 printf("failed to delete ! \n");
195 return 0;
196 }
197 while(i < pos-1)
198 {
199 _node = _node->next;
200 ++i;
201 }
202 pSwap = _node->next;
203 data = pSwap->data;
204 _node->next = _node->next->next;
205 free(pSwap);
206 return data;
207 }
208
209 int LengthList(pNode pHead)
210 {
211 int length = 0;
212 pNode temp = pHead->next;
213 while(temp!=NULL)
214 {
215 temp=temp->next;
216 length++;
217 }
218 return length;
219 }
220
221 void Sort_List(pNode pHead)
222 {
223 int i , j;
224 char* swap ;
225 int len=LengthList(pHead);
226 pNode m,n;
227 for(i=0,m=pHead->next;i<len-1;i++,m=m->next)
228 {
229 for(j=i+1,n=m->next;j<len;j++,n=n->next)
230 {
231 if(m->data > n->data)
232 {
233 swap = m->data;
234 m->data = n->data;
235 n->data = swap;
236 }
237 }
238 }
239 printf("排序完后结果为:\n");
240 printList(pHead);
241 }
242 pNode Reverse_List(pNode pHead)
243 {
244 if(pHead->next==NULL || pHead->next->next ==NULL)
245 {
246 return pHead;
247 }
248 pNode t=NULL;
249 pNode p=pHead->next;// first element
250 pNode q=pHead->next->next;//second element
251
252 while(q!=NULL)
253 {
254 t = q->next;
255 q->next = p;
256 p=q;
257 q=t;
258 }
259 pHead->next->next = NULL;
260 pHead->next = p;
261 printf("逆序后结果为:\n");
262 printList(pHead);
263 return pHead;
264
265 }