【数据结构】单链表的相关笔记

  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 }

 

posted @ 2020-03-17 16:21  AsunaLGLL  阅读(232)  评论(0编辑  收藏  举报