本题代码如下
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;
}