//单向循环链表在删除时必须要有前驱指针,删头时,头指针前驱是尾结点
//删除时,需要两指针联动
//t为尾指针
//删头时
for(t=h;t->next!=h;t=t->next);
t->next=h->next;
free(h);
h=t->next;
//删中间尾时,q为前驱指针
q->next=delp->next;
free(delp);
设head指向一个非空单向循环链表,数据域值不重复,任意输入一个关键字key,在循环链表中删除值为key的结点
#include<stdio.h>
#include<stdlib.h>
#define N 10
typedef struct node{
int data;
struct node *next;
}ElemSN;
ElemSN *Createlink(int a[])
{
ElemSN *h,*t,*p;
h=NULL;
for(int i=0;i<N;i++){
p=(ElemSN *)malloc(sizeof(ElemSN));
p->data=a[i];
if(!h){
p->next=p;
h=t=p;
}
else{
p->next=h;
t=t->next=p;
}
}
return h;
}
ElemSN *Delkeynode(ElemSN *h,int key)
{
ElemSN *p,*q;
p=h;
q=NULL;
do{//找到与key相等的结点
if(p->data!=key){//联动
q=p;
p=p->next;
}//找到了
else break;
} while(p!=h);//一圈过后没找到
if(p==h&&q){//找了一圈都没有
printf("NOT FOUND!");
}
else{
if(p==h){//删头
for(q=h;q->next!=h;q=q->next);
h=h->next;
}
q->next=p->next;//是头的话挂链,不是头的话直接挂链(即为中间尾)
free(p);
}
return h;
}
void Prelink(ElemSN *h)
{
ElemSN *p;
p=h;
do{
printf("%5d",p->data);
p=p->next;
}while(p!=h);
}
int main()
{
int a[N],i,key;
printf("请输入10个整数:");
for(i=0;i<N;i++){
scanf("%d",&a[i]);
}
printf("\n");
printf("请输入key:");
scanf("%d",&key);
ElemSN *head=NULL,*t;
//创建单向循环链表
head=Createlink(a);
//删除key
t=Delkeynode(head,key);
Prelink(t);
return 0;
}