用文件中的程序进行编写单链表中的数据元素删除操作
时间: 2024-11-30 12:21:56 浏览: 3
数据结构-C语言实现单链表-数据结构学习
根据提供的实验报告内容,以下是如何实现单链表中数据元素的删除操作:
### 单链表数据元素的删除操作
#### 函数原型
```c
void DeleteList(LinkList head, int i);
```
#### 函数说明
- `head`:单链表的头指针。
- `i`:要删除的节点的位置(从1开始计数)。
#### 实现步骤
1. **查找要删除节点的前一个节点**:使用 `GetNode` 函数查找第 `i-1` 个节点。
2. **检查位置是否合法**:如果 `i-1` 位置不存在,则输出错误信息并退出。
3. **删除节点**:修改前一个节点的 `next` 指针,使其指向被删除节点的下一个节点,并释放被删除节点的内存。
#### 完整代码
```c
#include <stdio.h>
#include <stdlib.h>
// 单链表的定义
typedef char DataType;
typedef struct node {
DataType data;
struct node *next;
} ListNode;
typedef ListNode *LinkList;
// 创建单链表
LinkList CreateListR1(void) {
char ch;
LinkList head = (ListNode *)malloc(sizeof(ListNode));
ListNode *s, *r = head;
while ((ch = getchar()) != '\n') {
s = (ListNode *)malloc(sizeof(ListNode));
s->data = ch;
r->next = s;
r = s;
}
r->next = NULL;
return head;
}
// 打印单链表
void PrintList(LinkList head) {
ListNode *p;
for (p = head->next; p; p = p->next)
printf("%c", p->data);
printf("\n");
}
// 查找第 i 个节点
LinkList GetNode(LinkList head, int i) {
int j;
ListNode *p = head;
j = 0;
while (p->next && j < i) {
p = p->next;
j++;
}
if (i == j)
return p;
else
return NULL;
}
// 插入节点
void InsertList(LinkList head, DataType x, int i) {
ListNode *p, *s;
p = GetNode(head, i - 1);
if (p == NULL) {
printf("插入位置非法\n");
exit(0);
}
s = (ListNode *)malloc(sizeof(ListNode));
s->data = x;
s->next = p->next;
p->next = s;
}
// 删除节点
void DeleteList(LinkList head, int i) {
ListNode *p, *q;
p = GetNode(head, i - 1);
if (p == NULL || p->next == NULL) {
printf("删除位置非法\n");
exit(0);
}
q = p->next;
p->next = q->next;
free(q);
}
int main() {
LinkList head;
DataType x;
int i;
head = CreateListR1(); // 建立单链表
PrintList(head); // 打印单链表
printf("请输入欲删除元素的位置:");
scanf("%d", &i);
DeleteList(head, i); // 删除指定位置的元素
PrintList(head); // 打印单链表
return 0;
}
```
### 运行示例
假设输入的单链表为 `abcde`,删除第3个位置的元素后的输出如下:
```
abcde
请输入欲删除元素的位置:3
abde
```
### 注意事项
- 在删除节点之前,务必检查删除位置是否合法,即 `i-1` 位置是否存在且不是最后一个节点。
- 使用 `free` 函数释放被删除节点的内存,防止内存泄漏。
阅读全文