四、循环列表
通过将单链表的尾结点指向头结点的单链表称之为循环单链表。
- 结点设计:
typedef struct list{
int data;
struct list *next;
}list;
- 创建
list *head=(list*)malloc(sizeof(list));
head->next=head;
- 插入
顺序插入
list *node=(list*)malloc(sizeof(list));
node->data=data;
list *p=head;
//找到最后一个数据
while(p->next!=head){
p=p->next;
}
p->next=node;
node->next=head;
中间插入
list *insert_list(list *head,int pos,int data){
//三个参数分别是链表,位置,参数
list *node=initlist(); //新建结点
list *p=head; //p表示新的链表
list *t;
t=p;
node->data=data;
if(head!=NULL){
for(int i=1;i<pos;i++){
t=t->next; //走到需要插入的位置处
}
node->next=t->next;
t->next=node;
return p;
}
return p;
}
- 删除
int delete_list(list *head,int del) {
list *temp = head;
list *ptr = head->next;
while(ptr != head) {
if(ptr->data == del) {
//尾结点特别判断
if(ptr->next == head) {
temp->next = head;
free(ptr);
return 1;
}
temp->next = ptr->next; //核心删除操作代码
free(ptr);
return 1;
}
temp = temp->next;
ptr = ptr->next;
}
printf("没有找到要删除的元素\n");
return 0;
}
- 遍历
1.需要通过判断结点的next指针是否等于头结点的方式进行是否完成循环的判断
2.计数器count
while(p->next != head )
int display(list *head) {
if(head != NULL) {
list *p = head;
while(p->next != head ) {
printf("%d ",p->next->data);
p = p->next;
}
}
}