C语言在单链表中删除指定元素
时间: 2023-03-25 10:02:20 浏览: 92
C语言可以通过遍历单链表,找到需要删除的节点,然后将其前驱节点的指针指向其后继节点,再释放需要删除的节点的内存空间,即可完成删除操作。具体实现可以参考以下代码:
```c
void deleteNode(Node* head, int val) {
Node* cur = head;
Node* pre = NULL;
while (cur != NULL) {
if (cur->val == val) {
if (pre == NULL) {
head = cur->next;
} else {
pre->next = cur->next;
}
free(cur);
return;
}
pre = cur;
cur = cur->next;
}
}
```
其中,Node为单链表节点的结构体,val为节点的值,head为单链表的头节点指针。
相关问题
用结构体和指针实现单链表的应用,具体包含:建立单链表、在单链表中查找指定元素、在单链表中插入指定元素、删除单链表某个元素。用C语言实现
好的,下面是单链表结构体和相关操作函数的实现:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node* next;
} Node;
// 建立单链表
Node* createList() {
Node *head, *p, *q;
int n, num;
head = (Node*)malloc(sizeof(Node));
head->next = NULL;
q = head;
printf("请输入链表的长度:");
scanf("%d", &n);
for (int i = 0; i < n; i++) {
printf("请输入第 %d 个元素:", i+1);
scanf("%d", &num);
p = (Node*)malloc(sizeof(Node));
p->data = num;
p->next = NULL;
q->next = p;
q = p;
}
return head;
}
// 查找指定元素
Node* search(Node* head, int x) {
Node* p = head->next;
while (p != NULL && p->data != x) {
p = p->next;
}
return p;
}
// 在指定位置插入元素
void insert(Node* head, int pos, int x) {
Node* p = head;
for (int i = 0; i < pos-1; i++) {
if (p->next == NULL) {
printf("插入位置不合法!\n");
return;
}
p = p->next;
}
Node* q = (Node*)malloc(sizeof(Node));
q->data = x;
q->next = p->next;
p->next = q;
printf("插入成功!\n");
}
// 删除指定元素
void del(Node* head, int x) {
Node* p = head;
while (p->next != NULL && p->next->data != x) {
p = p->next;
}
if (p->next == NULL) {
printf("要删除的元素不存在!\n");
return;
}
Node* q = p->next;
p->next = q->next;
free(q);
printf("删除成功!\n");
}
// 输出单链表
void printList(Node* head) {
Node* p = head->next;
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main() {
Node* head = createList();
printf("链表中的元素为:");
printList(head);
int x;
printf("请输入要查找的元素:");
scanf("%d", &x);
Node* p = search(head, x);
if (p == NULL) {
printf("要查找的元素不存在!\n");
} else {
printf("要查找的元素在链表中的位置为:%p\n", p);
}
int pos, num;
printf("请输入要插入的位置和元素值:");
scanf("%d %d", &pos, &num);
insert(head, pos, num);
printf("插入后的链表为:");
printList(head);
printf("请输入要删除的元素:");
scanf("%d", &x);
del(head, x);
printf("删除后的链表为:");
printList(head);
return 0;
}
```
用c语言写单链表的查找删除添加遍历等操作,并且能输入元素
非常感谢您的提问!以下是单链表的查找、删除、添加和遍历等操作的C语言代码示例:
// 定义单链表节点结构体
typedef struct Node {
int data; // 数据域
struct Node* next; // 指针域
} Node;
// 初始化单链表
Node* initList() {
Node* head = (Node*)malloc(sizeof(Node)); // 创建头节点
head->next = NULL; // 头节点的指针域为空
return head;
}
// 在单链表末尾添加元素
void addElement(Node* head, int data) {
Node* p = head;
while (p->next != NULL) {
p = p->next;
}
Node* newNode = (Node*)malloc(sizeof(Node)); // 创建新节点
newNode->data = data;
newNode->next = NULL;
p->next = newNode;
}
// 在单链表指定位置插入元素
void insertElement(Node* head, int index, int data) {
Node* p = head;
int i = 0;
while (p != NULL && i < index) {
p = p->next;
i++;
}
if (p == NULL) {
printf("插入位置无效!\n");
return;
}
Node* newNode = (Node*)malloc(sizeof(Node)); // 创建新节点
newNode->data = data;
newNode->next = p->next;
p->next = newNode;
}
// 在单链表中查找元素
int findElement(Node* head, int data) {
Node* p = head->next;
int i = 0;
while (p != NULL) {
if (p->data == data) {
return i;
}
p = p->next;
i++;
}
return -1;
}
// 在单链表中删除元素
void deleteElement(Node* head, int data) {
Node* p = head;
while (p->next != NULL) {
if (p->next->data == data) {
Node* temp = p->next;
p->next = temp->next;
free(temp);
return;
}
p = p->next;
}
printf("未找到要删除的元素!\n");
}
// 遍历单链表并输出所有元素
void traverseList(Node* head) {
Node* p = head->next;
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
// 主函数
int main() {
Node* head = initList(); // 初始化单链表
int n, data;
printf("请输入要添加的元素个数:");
scanf("%d", &n);
printf("请输入%d个元素:", n);
for (int i = 0; i < n; i++) {
scanf("%d", &data);
addElement(head, data); // 在单链表末尾添加元素
}
printf("单链表中的元素为:");
traverseList(head); // 遍历单链表并输出所有元素
printf("请输入要插入的元素位置和值:");
int index;
scanf("%d%d", &index, &data);
insertElement(head, index, data); // 在单链表指定位置插入元素
printf("插入后单链表中的元素为:");
traverseList(head);
printf("请输入要查找的元素值:");
scanf("%d", &data);
int pos = findElement(head, data); // 在单链表中查找元素
if (pos == -1) {
printf("未找到该元素!\n");
} else {
printf("该元素在单链表中的位置为:%d\n", pos);
}
printf("请输入要删除的元素值:");
scanf("%d", &data);
deleteElement(head, data); // 在单链表中删除元素
printf("删除后单链表中的元素为:");
traverseList(head);
return 0;
}
希望这个代码示例能够帮助您!