C循环链表操作模板 发表于 2019-04-21 更新于 2020-04-14 分类于 数据结构 评论数: 阅读次数: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109#include <stdio.h>#include <stdlib.h>#define maxn 100 typedef int DataType; //将数据类型定义为DataType,方便修改,这样如果需要改成char只需要改这里就行了typedef struct Node{ DataType data; struct Node *next;}Node;Node *CreatList(DataType a[],int n){ Node *first = (Node*)malloc(sizeof(Node)); first->next = NULL; Node *r = NULL,*p = NULL; r = first; for(int i = 0;i < n;i++){ p = (Node*)malloc(sizeof(Node)); p->data = a[i]; p->next = NULL; r->next = p; r = p; } p->next = first->next; //链表末端指向链表头 //此处是单链表和循环链表的差别 return first;} //删除第x位的元素void DeleteData(Node *first,int x){ Node *p = first->next; Node *r; int cnt = 1; //cnt统计结点数 while(p->next != first->next && cnt < x -1){ //判断是否遍历完成,当P为链表尾的时候,P->next应指向第一个元素,即first-next; p = p->next; } //敲黑板划重点 //比如说链表中有数据 1 2 3 4 5 //要删除位置为3 (此时对应数据也是3) //则令P指向第2个位置时停下来(修改指针域使P(此时P指向2)->next==P->next->next (p->next->next指向4) r = p->next; p->next = r->next; free(r); //释放删除位的空间,防止内存泄漏 //如果要取得删除的数据 //则在函数声明中添加参数DataType *ptr //并将要删除的数据赋值给×ptr后再free}//循环链表其他操作如果需要遍历,则类似此函数,设置一个标记flag即可//具体函数可参考我博客中的C单链表操作void PrintList(Node *first){ int flag = 0;//设置标记,当链表遍历完成后停止 Node *p = first->next; while(p != first ->next || !flag){ printf("%d ",p->data); p = p->next; flag = 1; }}int main(){ Node* first = NULL; int n; int i,k = 2,x = 1; DataType Data[maxn]; scanf("%d",&n); for(i = 0;i < n;i++) scanf("%d",&Data[i]); first = CreatList(Data,n); PrintList(first); DeleteData(first,k); printf("\nAfter Delete:\n"); PrintList(first); return 0;}觉得文章不错的话可以请我喝一杯茶哟~打赏微信支付支付宝本文作者: bestsort本文链接: https://bestsort.cn/2019/04/21/63/版权声明: 本博客所有文章除特别声明外,均采用 BY-SA 许可协议。转载请注明出处!并保留本声明。感谢您的阅读和支持!-------------本文结束感谢您的阅读-------------