1 #include "stdio.h"
2 #include "malloc.h"
3 #define OK 1
4 #define ERROR 0
5
6 typedef int Status;
7 typedef int ElemType;
8
9 typedef struct LNode
10 {
11 ElemType data;
12 struct LNode* next;
13 }LNode, * LinkList; //结点类型LNode,链表类型的定义LinkList
14
15 void CreateList(LinkList& L, int n);//初始化单链表
16 int LocateElem(LinkList L, ElemType e);//返回表中第一个与e相等的元素位序。若不存在,返回0
17 Status GetElem(LinkList L, int i, ElemType& e);//获取ai元素的值返回在e中。如果i不合法,返回ERROR,否则为e赋值,返回OK
18 void ListPrint(LinkList L);//打印链表
19 Status ListDelete(LinkList& L, int i, ElemType& e);//实现在 链表L上删除ai元素,并将该元素在e中返回。需要判断输入i的合法性。
20 Status ListInsert(LinkList& L, int i, ElemType e);//实现在链表中ai元素之前插入元素e,需要判断输入i的合法性。
21 Status Intersection(LinkList La, LinkList Lb, LinkList& Lc); //实现La和Lb的交集Lc
22 Status Difference(LinkList La, LinkList Lb, LinkList& Lc); //实现La和Lb的差集Lc
23 Status PTR_AI(LinkList& Lc, ElemType i, ElemType s);
24 Status ListOrderInsert(LinkList& L, ElemType e);
25 void Reverse(LinkList La, LinkList& Lb);
26 int main()
27 {
28 LinkList La, Lb;
29 int n;
30
31 scanf("%d", &n);
32 CreateList(La, n);//构造有n个元素的表
33 Reverse(La, Lb);
34 ListPrint(Lb);
35 return 0;
36 }
37 /* 请在这里填写答案 */
38 void ListPrint(LinkList L)//打印整张表
39 {
40 LinkList p;
41 p = L->next;
42 if (p == NULL) //空表,输出NULL
43 {
44 printf("NULL");
45 return;
46 }
47 while (p != NULL) //表非空,依次输入各个元素的值,用空格隔开。注意最后一个元素后面没有空格
48 {
49 if (p == L->next)
50 {
51 printf("%d", p->data);
52 }
53 else printf(" %d", p->data);
54 p = p->next;
55 }
56 }
57 void CreateList(LinkList& L, int n) {
58 LinkList q, p;
59 L = (LinkList)malloc(sizeof(LNode));
60 L->next = NULL;
61 q = L;
62 for (int i = 1; i <= n; i++)
63 {
64 p = (LinkList)malloc(sizeof(LNode));
65 scanf("%d", &p->data);
66 q->next = p;
67 q = q->next;
68 }
69 } //初始化单链表
70 Status GetElem(LinkList L, int i, ElemType& e) {
71 LinkList p;
72 p = L->next; int j = 1;
73 while (p && j < i)
74 {
75 p = p->next;
76 j++;
77 };
78 if (!p)
79 {
80 return ERROR;
81 }
82 e = p->data;
83 return OK;
84
85
86 }
87 int LocateElem(LinkList L, ElemType e) {
88 LinkList p;
89 p = L->next;
90 int j = 1;
91 while (p)
92 {
93 if (p->data == e)
94 {
95 return j;
96 }
97 p = p->next;
98 j++;
99 };
100 return ERROR;
101
102 }
103 Status ListDelete(LinkList& L, int i, ElemType& e)//实现在 链表L上删除ai元素,并将该元素在e中返回。需要判断输入i的合法性。
104 {
105 LinkList p, s;
106 p = L; int j = 0;
107 while (p && j < i - 1)
108 {
109 p = p->next;
110 j++;
111 };
112 if (!p) return ERROR;
113
114 s = p->next;
115 e = s->data;
116
117 p->next = s->next;
118 free(s);
119 return OK;
120 }
121 Status ListInsert(LinkList& L, int i, ElemType e)//实现在链表中ai元素之前插入元素e,需要判断输入i的合法性。
122 {
123 LinkList s, p;
124 int j;
125 p = L; j = 0;
126 while (p && j < i - 1)
127 {
128 p = p->next;
129 ++j;
130 }
131 if (!p) return ERROR;
132
133 s = (LinkList)malloc(sizeof(LNode));
134 if (!s) return ERROR;
135 s->data = e;
136
137 s->next = p->next;
138 p->next = s;
139
140 return OK;
141 }
142 Status Intersection(LinkList La, LinkList Lb, LinkList& Lc)
143 {
144 LNode* q1, * q2, * q3, * p;
145 q3 = Lc;
146 q1 = La->next;
147 while (q1 != NULL)
148 {
149 q2 = Lb->next;
150 while (q2 && q1->data != q2->data)
151 {
152 q2 = q2->next;
153 }
154 if (q2 != NULL)
155 {
156 p = (LNode*)malloc(sizeof(LNode));
157 p->data = q1->data;
158 q3->next = p;
159 q3 = q3->next;
160 }
161 q1 = q1->next;
162 }
163 q3->next = NULL;
164 return OK;
165 }
166 Status Difference(LinkList La, LinkList Lb, LinkList& Lc)
167 {
168 LinkList p1, p2, p3, q;
169 p3 = (LinkList)malloc(sizeof(LNode));
170 p1 = La->next;
171 p3 = Lc;
172 while (p1)
173 {
174 p2 = Lb->next;
175 while (p2 && p1->data != p2->data)
176 {
177 p2 = p2->next;
178 }
179 if (p2 == NULL)
180 {
181 q = (LinkList)malloc(sizeof(LNode));
182 q->data = p1->data;
183 p3->next = q;
184 p3 = p3->next;
185 }
186 p1 = p1->next;
187 }
188 p3->next = NULL;
189 return OK;
190 }
191 Status PTR_AI(LinkList& La, ElemType i, ElemType s)//i=位序 s=输入的数值
192 {
193 LinkList p,e;
194 int temp;
195 p = La->next; int j = 1;
196 while (j<i)
197 {
198 p = p->next;
199 j++;
200 }//遍历到ai而不是ai-1
201 e = (LinkList)malloc(sizeof(LNode));
202 e->data = s;
203
204 e->next = p->next;
205 p->next = e;//在ai后面开辟新节点
206
207 temp= p->data;
208 p->data = e->data;
209 e->data = temp;//两数交换
210
211 return 0;
212 }//211806141
213 Status ListOrderInsert(LinkList& L, ElemType e) {
214 LinkList p,q;
215 int temp;
216 p = L;
217 if (!p) return ERROR;
218
219 q = (LinkList)malloc(sizeof(LNode));
220 q->data = e;
221
222 while (p->next != NULL )
223 {
224 if (p->data <= e && p->next->data >= e )
225 {
226 q->next = p->next;
227 p->next = q;
228 return OK;
229 }
230 p = p->next;
231 }
232 q->next = p->next;
233 p->next = q;
234 return OK;
235 }
236 void Reverse(LinkList La, LinkList& Lb) {
237 LinkList q, p;
238 q = La;
239
240 Lb = (LinkList)malloc(sizeof(LNode));
241 Lb->next = NULL;
242
243
244 while (q)
245 {
246 p = (LinkList)malloc(sizeof(LNode));
247
248 p->data = q->data;
249
250 p->next = Lb->next;
251 Lb->next = p;
252
253 q = q->next;
254 }
255
256
257
258
259 }