本题代码如下
void delete(linklist* L, int x)
{
lnode* p = *L, * q = *L;
while (p->next != q)// 从第一个结点开始遍历链表,直到尾结点的前一个结点
{
if (p->next->data == x)//判断是否等于x
{
lnode* r = p->next;//将r指向x的位置
p->next = r->next;//p指向r后面的位置
free(r);//释放r指向的x的内存空间
}
else//否则p继续向后遍历
{
p = p->next;
}
}
if ((*L)->data == x)// 如果第一个结点是要删除的元素
{
lnode* q = *L;// 将要删除的结点保存在变量q中
*L = (*L)->next;// 将链表第一个指针指向它下一个节点
free(q);//释放他的空间
}
}
完整测试代码如下
#include<stdio.h>
#include<stdlib.h>
typedef struct lnode
{
int data;
struct lnode* next;
}lnode, * linklist;
int a[5] = { 1,2,3,4,5 };
int n = 5;
void buildlink(linklist* L)
{
*L = NULL; //将指向链表第一个指针置为空
int i = 0;
lnode* s;
for (i = 0; i < n; i++)
{
s = (lnode*)malloc(sizeof(lnode));// 分配内存空间给新结点
s->data = a[i];// 设置结点数据
if (*L == NULL)// 如果链表为空
{
*L = s;// 将新节点设为链表头
s->next = s;// 将新节点的next指向自己,形成循环链表
}
else// 如果链表不为空
{
lnode* r = *L; // 从第一个结点开始遍历链表
while (r->next != *L) // 找到尾节点的前一个节点
{
r = r->next;
}
r->next = s;// 将新节点插入到尾节点之后
s->next = *L;// 将新节点插入到尾节点之后
}
}
}
void delete(linklist* L, int x)
{
lnode* p = *L, * q = *L;
while (p->next != q)// 从第一个结点开始遍历链表,直到尾结点的前一个结点
{
if (p->next->data == x)//判断是否等于x
{
lnode* r = p->next;//将r指向x的位置
p->next = r->next;//p指向r后面的位置
free(r);//释放r指向的x的内存空间
}
else//否则p继续向后遍历
{
p = p->next;
}
}
if ((*L)->data == x)// 如果第一个结点是要删除的元素
{
lnode* q = *L;// 将要删除的结点保存在变量q中
*L = (*L)->next;// 将链表第一个指针指向它下一个节点
free(q);//释放他的空间
}
}
void print(linklist* L)
{
lnode* k = *L;
do
{
printf("%d ", k->data);
k = k->next;
} while (k != *L); // 当回到第一个结点时结束遍历
}
int main()
{
linklist L;
buildlink(&L);
print(&L);
delete(&L, 3);
printf("\n");
print(&L);
return 0;
}