C循环链表详解
不会链表?先看:
C单链表操作
写出来了不会用?看:
C单链表操作
写出来了不会用?看:
#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单链表操作
//http://blog.csdn.net/bestsort/article/details/78688374
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;
}