“ Ctrl AC!一起 AC!”
目录
循环单链表的特点是最后一个结点p :p->next=head;从而构成一个环
单链表结构:
typedef int datatype;
typedef struct link_node{
datatype info;
struct link_node *next;
}node;
建立一个空的循环队列:
node* init() return NULL;
获得循环单链表的最后一个结点的存储地址:
node* rear(node *head){
node *p;
if(!head) p=NULL;
else{
p=head;
while(p->next!=head)
p=p->next;
}
return p;
}
输出循环单链表中各个结点的值:
void display(node *head){
node *p;
if(!head) printf("循环单链表是空的!");
else{
printf("循环单链表的各个结点的值分别为:\n");
printf("%d ",head->info);
p=head->next;
while(p!=head){
printf("%d ",p->info);
p=p->next;
}
}
}
在循环单链表中查找一个值为x的结点:
node* find(node *head,datatype x){
node *q;
if(!head){
printf("循环单链表是空的!\n");
return NULL;
}
q=head;
while(q->next!=head&&q->info!=x) q=q->next;
if(q->info==x) return q;
else return NULL;
}
循环单链表插入操作:
1.新结点插入到最前面
p->next=head; head=p; rear->next=p;
2.新结点插入其他位置
p->next=q->next; q->next=p;
node* insert(node *head,datatype x,int i){ //i表位置,i为0,表示在最前面插
node *p,*q,*myrear;
int j;
p=new node; //或malloc
p->info=x;
if(i<0){
printf("位置错误\n");
free(p);
return head;
}
else if(i==0&!head){ //在空的链表中插入
p->next=p;
head=p;
return head;
}
else if(i==0&head){ //在非空的链表的最前面插入
myrear=rear(head);
p->next=head;
headp=p;
myrear->next=p;
return head;
}
else if(i>0&&!head){
printf("位置错误\n");
free(p);
return head;
}
else if(i>0&&head){ //在非空链表的非最前位置插入
q=head;
j=1;
while(i!=j&&q->next!=head){
q=q->next;
j++;
}
if(i!=j){
printf("找不到\n");
return head;
}
else{
p->next=q->next;
q->next=p;
return head;
}
}
}
循环单链表的删除操作:
(q为要删的结点,pre为q前面的结点)
1.删除最前面的结点:
head=head->next; pre->next=head;
2.删除其它结点:
pre->next=q->next;
node* dele(node *head,datatype x){
node *pre=NULL,*q;
if(!head){
printf("链表为空\n");
return head;
}
q=head;
while(q->next!=head&&q->info!=x){
pre=q;
q=q->next;
}
if(q->info!=x) printf("没找到\n");
else{
if(q!=head){
pre->next=q->next;
free(q);
}
else{
if(head->next==head){
free(q);
head=NULL;
}
else{
pre=head->next;
while(pre->next!=q) pre=pre->next; //此处的q就是head,也就是找最后一个结点
head=head->next; //头结点搬家
pre->next=head; //尾结点(pre)指向新的head
free(q);
}
}
}
return head;
}
感谢阅读!!!
“ Ctrl AC!一起 AC!”