线性表实现——单向循环链表

Posted 沙加的孩子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线性表实现——单向循环链表相关的知识,希望对你有一定的参考价值。

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <time.h>
  4 
  5 #define OK 1
  6 #define ERROR 0
  7 typedef int Status;
  8 typedef int ElemType;
  9 
 10 typedef struct Node
 11 {
 12 ElemType data;
 13 struct Node* next;
 14 }Node;
 15 
 16 typedef struct Node* LinkList;
 17 
 18 Status InitList(LinkList* L)  //初始化操作,建立一个空的线性表.想把头指针里面的值改掉,所以传个头指针的地址
 19 {
 20     *L = (LinkList)malloc(sizeof(Node));
 21     if (!(*L))
 22         return ERROR;
 23     (*L)->next = *L;
 24     return OK;
 25 }
 26 Status ListEmpty(LinkList L)  //若线性表为空,返回true,否则返回false
 27 {
 28     if (L->next == L)
 29         return OK;
 30     return ERROR;
 31 }
 32 Status ClearList(LinkList* L) //清空线性表
 33 {
 34     LinkList p = (*L)->next;
 35     LinkList q;
 36     while (p != *L)
 37     {
 38         q = p;
 39         p = p->next;
 40         free(q);
 41     }
 42     (*L)->next = (*L);
 43     return OK;
 44 }
 45 Status GetElem(LinkList L, int  i, ElemType *e)  //查找线性表中的第i个位置的元素值,并赋值给e
 46 {
 47     int j = 1;
 48     LinkList p = L->next;
 49     while ((p!=L) && j < i)
 50     {
 51         p = p->next;
 52         j++;
 53     }
 54     if ((p==L) || j > i)
 55         return ERROR;
 56     *e = p->data;
 57     return OK;
 58 }
 59 Status LocateElem(LinkList L, ElemType e) //查找线性表L中与给定值e相等的元素,如果查找成功,则返回第一个相同的元素在L中的下标;否则,返回0表示失败
 60 {
 61     int i = 1;
 62     LinkList p = L->next;
 63     while (p != L && p->data != e)
 64     {
 65         p = p->next;
 66         i++;
 67     }
 68     if (!p)
 69         return ERROR;
 70     return i;
 71 }
 72 Status ListInsert(LinkList* L, int i, ElemType e)  //在线性表L的第i个位置插入元素e
 73 {
 74     LinkList p, q;
 75     p = (*L)->next;
 76     int j = 1;
 77     while ((p!=*L) && j < i)    //尾部插入时,p指向最后一个值,而j=i-1
 78     {
 79         p = p->next;
 80         j++;
 81     }
 82     if (!p || j > i)
 83         return ERROR;
 84 
 85     q = (LinkList)malloc(sizeof(Node));
 86     q->data = e;
 87     q->next = p->next;
 88     p->next = q;
 89 
 90     return ERROR;
 91 }
 92 Status ListDelete(LinkList*L, int i, ElemType* e) //删除线性表L中第i个位置元素,并用e返回其值
 93 {
 94     LinkList p, q;
 95     p = *L;
 96     int j = 1;
 97     //while (p && j<i)
 98     while ((p->next!=*L) && j < i)
 99     {
100         p = p->next;
101         j++;
102     }
103     //if (!p || j > i)
104     if (!(p->next) || j > i)
105         return ERROR;
106     q = p->next;
107     *e = q->data;
108     p->next = q->next;
109     free(q);
110     return OK;
111 }
112 Status CreateListHead(LinkList *L, int n)
113 {
114     LinkList p;
115     int i;
116     (*L) = (LinkList)malloc(sizeof(Node));
117     (*L)->next = *L;
118     for (i = 0; i < n; i++)
119     {
120         p = (LinkList)malloc(sizeof(Node));
121         p->data = i;
122         p->next = (*L)->next;
123         (*L)->next = p;
124     }
125     return OK;
126 }
127 Status CreateListTail(LinkList *L, int n)
128 {
129     LinkList p;
130     int i;
131     (*L) = (LinkList)malloc(sizeof(Node));
132     //(*L)->next = NULL;
133     LinkList q = (*L);
134     for (i = 0; i < n; i++)
135     {
136         p = (LinkList)malloc(sizeof(Node));
137         p->data = i + 10;
138         q->next = p;
139         q = p;
140     }
141     q->next = *L;
142     return OK;
143 }
144 Status visit(ElemType n)
145 {
146     printf("-> %d  ", n);
147     return OK;
148 }
149 Status ListTraverse(LinkList L)
150 {
151     LinkList p = L->next;
152     while (p != L)
153     {
154         visit(p->data);
155         p = p->next;
156     }
157     return OK;
158 }
159 
160 int ListLength(LinkList L)  //返回线性表L的长度
161 {
162     int i = 0;
163     LinkList p = L->next;
164     while (p != L)
165     {
166         i++;
167         p = p->next;
168     }
169     return i;
170 }
171 
172 int main()
173 {
174     LinkList L;
175     Status i, j;
176     char opp = -1;
177     ElemType e;
178     int pos = 1;
179     int k = 0;
180 
181     i = InitList(&L);
182     printf("链表L初始化完毕,ListLength(L)=%d\n\n", ListLength(L));
183 
184     printf("\n1.遍历操作 \n2.插入操作  \n3.删除操作 \n4.获取结点数据\n5.查找某个数是否在链表中 \n6.头插法创建链表 \n7.尾插法创建链表 \n8.置空链表 \n0.退出 \n请选择你的操作:\n");
185 
186     while (opp != 0) {
187         scanf_s("%c", &opp);
188         switch (opp) {
189         case 1:
190             ListTraverse(L);
191             printf("\n");
192             break;
193 
194         case 2:
195             srand((unsigned)time(NULL));
196             for (j = 1; j <= 10; j++)
197             {
198                 i = ListInsert(&L, 1, rand() % 100);
199             }
200             printf("在L的表头依次插入10个随机数后:");
201             ListTraverse(L);
202             printf("\n");
203             printf("链表L创建完毕,ListLength(L)=%d\n\n", ListLength(L));
204             break;
205         case 3:
206             printf("要删除第几个元素?");
207             scanf_s("%d", &pos);
208             ListDelete(&L, pos, &e);
209             printf("删除第%d个元素成功,现在链表为:\n", pos);
210             ListTraverse(L);
211             printf("\n");
212             break;
213 
214         case 4:
215             printf("你需要获取第几个元素?");
216             scanf_s("%d", &pos);
217             GetElem(L, pos, &e);
218             printf("第%d个元素的值为:%d\n", pos, e);
219             printf("\n");
220             break;
221         case 5:
222             printf("输入你需要查找的数:");
223             scanf_s("%d", &pos);
224             k = LocateElem(L, pos);
225             if (k)
226                 printf("第%d个元素的值为%d\n", k, pos);
227             else
228                 printf("没有值为%d的元素\n", pos);
229             printf("\n");
230             break;
231         case 6:
232             CreateListHead(&L, 10);
233             printf("整体创建L的元素(头插法):\n");
234             ListTraverse(L);
235             printf("\n");
236             break;
237 
238         case 7:
239             CreateListTail(&L, 10);
240             printf("整体创建L的元素(尾插法):\n");
241             ListTraverse(L);
242             printf("\n");
243             break;
244 
245         case 8:
246             i = ClearList(&L);
247             printf("\n清空L后:ListLength(L)=%d\n", ListLength(L));
248             ListTraverse(L);
249             printf("\n");
250             break;
251 
252         case 0:
253             exit(0);
254         }
255     }
256 }

 

以上是关于线性表实现——单向循环链表的主要内容,如果未能解决你的问题,请参考以下文章

数据结构之单向不循环链表

线性表—不带头单向非循环链表的增删查改

java实现单向循环链表

单向循环链表

(java实现)单向循环链表

单向循环链表