源程序:
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int data;
struct node *next;
}linklist;
//创建单向循环链表
linklist *creatlist()
{
linklist *head, *p, *rear;
int x;
head = (linklist *)malloc(sizeof(linklist));
head->next = NULL;
rear = head;
printf("请输入链表内容(整数),以0结束: ");
scanf("%d", &x);
while (x)
{
p = (linklist *)malloc(sizeof(linklist));
p->data = x;
rear->next = p;
rear = p;
scanf("%d", &x);
}
rear->next = head;//尾指针指向头结点
return rear;
}
//删除单向循环链表中指定的结点
void delete_key(linklist *rear, int key)
{
linklist *p, *q;
int deleted = 0;//用于标记是否删除过
p = rear->next;
q = p->next;
while (q != rear->next)
{
if (q->data == key && q != rear)
{
p->next = q->next;
free(q);
q = p->next;
deleted = 1;
}
else if (q->data == key && q == rear)
{
p->next = q->next;
free(q);
q = p->next;
deleted = 1;
}
p = q;
q = q->next;
/* if(q->data==key && q==rear) //如果删除的是最后一个结点
{
p->next=q->next;
free(q);
q=p->next;
deleted=1;
}
*/
}
if (deleted)
printf("已删除! ");
else
printf("没有找到该结点! ");
}
//输出单循环链表
void print(linklist *rear)
{
linklist *p;
printf(" 当前链表如下: ");
p = rear->next->next;
while (p != rear->next)
{
printf("%5d", p->data);
p = p->next;
}
printf(" ");
}
int main()
{
linklist *rear;
rear = creatlist();
print(rear);
//删除循环链表中指定的值
int k;
printf("删除循环链表中指定的值");
scanf("%d", &k);
delete_key(rear, k);
print(rear);
system("pause");
return 1;
}
运行结果: