单向循环链表的删除算法

//单向循环链表在删除时必须要有前驱指针,删头时,头指针前驱是尾结点
//删除时,需要两指针联动

//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;
}

猜你喜欢

转载自blog.csdn.net/qq_42727102/article/details/88960431