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 }