1 #include <stdio.h>
2 #include <stdlib.h>
3 //第一关代码
4 typedef int DataType;
5 typedef struct node * PNode;
6 struct node
7 {//此处填写代码,定义链表结点类型,包含一个存放整型数据的 data 成员,和一个指向下一个结点的next成员
8 DataType data;
9 PNode next;
10
11 };
12 typedef struct node * LinkList;
13 struct node *mycreateList()
14 {//此处填写代码,创建一个只有一个头结点的空链表,头节点的数据域赋值为0,并将表头结点的地址返回
15 LinkList list = (LinkList)malloc(sizeof(struct node));
16 if(list!=NULL){
17 list->data=0;
18 list->next=NULL;
19 return list;
20 }
21 }
22
23
24 //第二关代码
25
26 void myinsertHead(struct node * head, int insData )
27 {
28 /*在此处完成任务,实现在head为表头d 链表的头插数据元素insData的功能*/
29 //begin
30 PNode q= (PNode)malloc(sizeof(struct node));
31 if(q!=NULL){
32 q->data=insData;
33 //q->next=NULL;
34 q->next= head->next;
35 head->next=q;
36
37 }
38
39 //end
40 }
41
42 void myinsertTail(struct node * head , int insData )
43 {
44 /*在此处完成任务,在head为表头的单链表表尾插入数据元素insData*/
45 //begin
46 LinkList p = (LinkList)malloc(sizeof(struct node));
47 p=head;
48 while(p->next!=NULL){
49 p=p->next;
50 }
51 PNode q = (PNode)malloc(sizeof(struct node));
52 if(q!=NULL){
53 q->data=insData;
54 q->next=NULL;
55 p->next=q;
56 }
57
58 //end
59 }
60
61 void myprintList(struct node *L)
62 {
63 /*在此处完成任务,输出head为表头链表中的数据,每输出一个数据换一行*/
64 //begin
65 LinkList p = (LinkList)malloc(sizeof(struct node));
66 p=L->next;
67 while(p!=NULL){
68 printf("%d\n",p->data);
69 p=p->next;
70 }
71
72 //end
73
74 }
75
76 //第三关代码
77 void reverseList_link( struct node *L)
78 {
79 //请在此处填入代码,实现链表逆置功能
80 //begin
81 PNode pre=(PNode)malloc(sizeof(struct node));
82 int i=0,num[1000];
83 pre=L;
84 while(pre!=NULL){
85 num[i++]=pre->data;
86 pre=pre->next;
87 }
88 pre=L;
89 //i=0;
90 while(pre!=NULL){
91 pre->data=num[i--];
92 //i++;
93 pre=pre->next;
94 }
95 /*
96 pre=L;
97 cur=L->next;
98 pre->next=NULL;
99 while(cur!=NULL){
100 tmp=cur->next;
101 cur->next=pre;
102 pre=cur;
103 cur=tmp;
104 }
105 L=pre;
106 */
107 /*PNode n = (PNode)malloc(sizeof(struct node));
108 if(n!=NULL){
109 n->next=NULL;
110 n->data=L->data;
111 }
112
113
114 p=q=L->next;
115
116 while(p->next!=NULL){
117 p=p->next;
118 q->next=n;
119 n=q;
120 q=p;
121 }
122 L=p;
123 */
124 //end
125 }
126
127
128 //第四关代码
129 int locateAndChange( struct node *L, int data)
130 {
131 //请在此处填入代码,在头结点为L的链表中查找 与data值相等的第一个结点,若能找到该结点,则将该结点的值与前驱结点的值交换
132 //若未找到与data值相等的结点,则返回值为-1,若找到的结点无前驱结点,则返回值为0,否则返回值为前驱结点的值
133 //begin
134 PNode p,q;
135 q=p=L;
136 while(p!=NULL){
137 if(q!=p&&p->data==data){
138 /* int tmp=q->data;
139 q->data=p->data;
140 p->data=tmp;
141 */
142 return q->data;
143 }
144 if(q==p&&p->data==data){
145 return 0;
146 }
147 q=p;
148 p=p->next;
149 }
150 return -1;
151 //end
152 }
153
154 //第五关代码
155 int destroyList(struct node *L)
156 {
157 //请在此处填写代码,实现将链表L的结点空间回收
158 //返回值为回收结点的个数,含头结点在内
159 PNode p , q ;
160 p=q= L;
161 int cnt=0;
162 while(p!=NULL){
163 p=p->next;
164 free(q);
165 cnt++;
166
167 q=p;
168 }
169 return cnt;
170 }