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

  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     if ((*L)->next == *L)
 78     {
 79         if (i == 1)
 80         {
 81             goto ADD;
 82         }
 83     }
 84     while ((p!=*L) && j < i)    //尾部插入时,p指向最后一个值,而j=i-1
 85     {
 86         p = p->next;
 87         j++;
 88     }
 89     if ((p==*L) || j > i)
 90         return ERROR;
 91 ADD:
 92     q = (LinkList)malloc(sizeof(Node));
 93     q->data = e;
 94     q->next = p->next;
 95     p->next = q;
 96 
 97     return ERROR;
 98 }
 99 Status ListDelete(LinkList*L, int i, ElemType* e) //删除线性表L中第i个位置元素,并用e返回其值
100 {
101     LinkList p, q;
102     p = *L;
103     int j = 1;
104     //while (p && j<i)
105     while ((p->next!=*L) && j < i)
106     {
107         p = p->next;
108         j++;
109     }
110     //if (!p || j > i)
111     if (!(p->next) || j > i)
112         return ERROR;
113     q = p->next;
114     *e = q->data;
115     p->next = q->next;
116     free(q);
117     return OK;
118 }
119 Status CreateListHead(LinkList *L, int n)
120 {
121     LinkList p;
122     int i;
123     (*L) = (LinkList)malloc(sizeof(Node));
124     (*L)->next = *L;
125     for (i = 0; i < n; i++)
126     {
127         p = (LinkList)malloc(sizeof(Node));
128         p->data = i;
129         p->next = (*L)->next;
130         (*L)->next = p;
131     }
132     return OK;
133 }
134 Status CreateListTail(LinkList *L, int n)
135 {
136     LinkList p;
137     int i;
138     (*L) = (LinkList)malloc(sizeof(Node));
139     //(*L)->next = NULL;
140     LinkList q = (*L);
141     for (i = 0; i < n; i++)
142     {
143         p = (LinkList)malloc(sizeof(Node));
144         p->data = i + 10;
145         q->next = p;
146         q = p;
147     }
148     q->next = *L;
149     return OK;
150 }
151 Status visit(ElemType n)
152 {
153     printf("-> %d  ", n);
154     return OK;
155 }
156 Status ListTraverse(LinkList L)
157 {
158     LinkList p = L->next;
159     while (p != L)
160     {
161         visit(p->data);
162         p = p->next;
163     }
164     return OK;
165 }
166 
167 int ListLength(LinkList L)  //返回线性表L的长度
168 {
169     int i = 0;
170     LinkList p = L->next;
171     while (p != L)
172     {
173         i++;
174         p = p->next;
175     }
176     return i;
177 }
178 
179 int main()
180 {
181     LinkList L;
182     Status i, j;
183     char opp = '-1';
184     ElemType e;
185     int pos = 1;
186     int k = 0;
187 
188     i = InitList(&L);
189     printf("链表L初始化完毕,ListLength(L)=%d\n\n", ListLength(L));
190 
191     printf("\n1.遍历操作 \n2.插入操作  \n3.删除操作 \n4.获取结点数据\n5.查找某个数是否在链表中 \n6.头插法创建链表 \n7.尾插法创建链表 \n8.置空链表 \n0.退出 \n请选择你的操作:\n");
192 
193     while (opp != '0') {
194         scanf_s("%c", &opp);
195         switch (opp) {
196         case '1':
197             ListTraverse(L);
198             printf("\n");
199             break;
200 
201         case '2':
202             srand((unsigned)time(NULL));
203             for (j = 1; j <= 10; j++)
204             {
205                 i = ListInsert(&L, 1, rand() % 100);
206             }
207             printf("在L的表头依次插入10个随机数后:");
208             ListTraverse(L);
209             printf("\n");
210             printf("链表L创建完毕,ListLength(L)=%d\n\n", ListLength(L));
211             break;
212         case '3':
213             printf("要删除第几个元素?");
214             scanf_s("%d", &pos);
215             ListDelete(&L, pos, &e);
216             printf("删除第%d个元素成功,现在链表为:\n", pos);
217             ListTraverse(L);
218             printf("\n");
219             break;
220 
221         case '4':
222             printf("你需要获取第几个元素?");
223             scanf_s("%d", &pos);
224             GetElem(L, pos, &e);
225             printf("第%d个元素的值为:%d\n", pos, e);
226             printf("\n");
227             break;
228         case '5':
229             printf("输入你需要查找的数:");
230             scanf_s("%d", &pos);
231             k = LocateElem(L, pos);
232             if (k)
233                 printf("第%d个元素的值为%d\n", k, pos);
234             else
235                 printf("没有值为%d的元素\n", pos);
236             printf("\n");
237             break;
238         case '6':
239             CreateListHead(&L, 10);
240             printf("整体创建L的元素(头插法):\n");
241             ListTraverse(L);
242             printf("\n");
243             break;
244 
245         case '7':
246             CreateListTail(&L, 10);
247             printf("整体创建L的元素(尾插法):\n");
248             ListTraverse(L);
249             printf("\n");
250             break;
251 
252         case '8':
253             i = ClearList(&L);
254             printf("\n清空L后:ListLength(L)=%d\n", ListLength(L));
255             ListTraverse(L);
256             printf("\n");
257             break;
258 
259         case '0':
260             exit(0);
261         }
262     }
263 }

 

转载于:https://www.cnblogs.com/miracle2015126/p/5870013.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值