用c语言写程序 . 删除单链表所有值为x的结点 【问题描述】在带头结点的单链表L中,删除所有值为x的结点,并释放其空间,假设值为x的结点不唯一,编写算法实现上述操作。 【输入形式】 三行数据: 第一行:链表中元素个数n 第二行:n个数据,数据之间用空格分隔 第三行:待删除的数据 【输出形式】 输出后的单链表 【样例输入】 10 12 2 31 5 8 2 9 2 9 2 2 【样例输出】 12 31 5 8 9 9
时间: 2023-05-31 11:03:00 浏览: 83
```c
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
int data;
struct node *next;
}Node, *LinkList;
LinkList createList(int n); // 创建链表
void deleteNode(LinkList L, int x); // 删除值为x的结点
void printList(LinkList L); // 输出链表
int main(){
int n, x;
scanf("%d", &n);
LinkList L = createList(n); // 创建链表
scanf("%d", &x);
deleteNode(L, x); // 删除值为x的结点
printList(L); // 输出链表
return 0;
}
LinkList createList(int n){
LinkList L = (LinkList)malloc(sizeof(Node)); // 创建头结点
L->next = NULL;
LinkList p = L; // 指针p指向头结点,初始时p指向头结点
for(int i=0; i<n; i++){
LinkList q = (LinkList)malloc(sizeof(Node)); // 创建新结点
scanf("%d", &q->data);
q->next = NULL;
p->next = q; // 将新结点插入到链表尾部
p = q; // 指针p指向新结点,以便下一次插入
}
return L; // 返回头结点
}
void deleteNode(LinkList L, int x){
LinkList p = L->next; // 指针p指向首结点,初始时p指向首结点
LinkList pre = L; // 指针pre指向p的前驱结点,初始时pre指向头结点
while(p != NULL){ // 遍历链表
if(p->data == x){ // 如果结点的值为x
pre->next = p->next; // 将p从链表中删除
LinkList q = p; // 指针q指向被删除结点,以便释放空间
p = p->next; // 指针p指向下一个结点
free(q); // 释放空间
}
else{
pre = p; // 指针pre指向p
p = p->next; // 指针p指向下一个结点
}
}
}
void printList(LinkList L){
LinkList p = L->next; // 指针p指向首结点,初始时p指向首结点
while(p != NULL){ // 遍历链表
printf("%d ", p->data);
p = p->next; // 指针p指向下一个结点
}
}
```
阅读全文