#include <stdio.h> #include <stdlib.h> #define ERROR 0 #define OK 1 typedef int ElemType; typedef struct node { ElemType data; struct node *next; } LinkList; LinkList *InitList() { LinkList *head; head = ( LinkList *)malloc( sizeof(LinkList)); head->next = NULL; return head; } LinkList *CreateList(int n) { int i; LinkList *head, *p, *r; head = ( LinkList *)malloc(sizeof(LinkList)); r = head; for ( i = 1; i <= n; i++) { p = ( LinkList *)malloc( sizeof( LinkList)); scanf("%d", &( p->data)); r->next = p; r = p; } r->next = NULL; return head; } void PrintLinkList(LinkList *head) { LinkList *p; p = head->next; while ( p != NULL) { printf("%d ", p->data); p = p->next; } } void rmove( LinkList *head,int k) { } int main() { LinkList *head; int n,k; scanf("%d", &n); head = CreateList(n); scanf("%d", &k); rmove(head,k); PrintLinkList(head); }补全该代码
时间: 2025-04-04 22:02:03 浏览: 27
以下是完整的链表删除第 `k` 个节点的函数实现,并对整个程序进行了完善:
---
```c
#include <stdio.h>
#include <stdlib.h>
#define ERROR 0
#define OK 1
typedef int ElemType;
// 定义单链表结构体
typedef struct node {
ElemType data;
struct node* next;
} LinkList;
// 初始化空链表头结点
LinkList* InitList() {
LinkList* head;
head = (LinkList*)malloc(sizeof(LinkList));
if (!head) { // 检查内存是否分配成功
printf("内存分配失败\n");
exit(-1);
}
head->next = NULL;
return head;
}
// 创建包含 n 个元素的链表
LinkList* CreateList(int n) {
int i;
LinkList* head, * p, * r;
head = (LinkList*)malloc(sizeof(LinkList));
if (!head) { // 再次检查内存分配情况
printf("内存分配失败\n");
exit(-1);
}
r = head; // 记录当前最后一个节点位置
for (i = 1; i <= n; i++) {
p = (LinkList*)malloc(sizeof(LinkList)); // 分配新节点空间
if (!p) { // 检查内存分配情况
printf("内存分配失败\n");
exit(-1);
}
scanf("%d", &(p->data)); // 输入数据到新节点中
r->next = p; // 将上一节点连接至当前节点
r = p; // 更新记录指针的位置
}
r->next = NULL; // 最后一个节点指向NULL
return head;
}
// 打印链表所有元素
void PrintLinkList(LinkList* head) {
LinkList* p;
p = head->next; // 跳过头结点直接访问第一个实际数据节点
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n"); // 输出换行符方便结果展示
}
// 删除链表中的第 k 个节点
void RemoveNode(LinkList* head, int k) {
if (head == NULL || k <= 0) { // 参数校验:若为空链表或索引非法则返回错误提示
printf("无效输入\n");
return;
}
LinkList* p = head; // 辅助指针从头开始遍历
int count = 0; // 统计已经遍历过的节点数
while (count + 1 < k && p != NULL) { // 寻找目标前驱节点
p = p->next;
count++;
}
if (p == NULL || p->next == NULL) { // 如果超出范围,打印错误并退出
printf("越界无法删除\n");
return;
} else {
LinkList* temp = p->next; // 缓存待删节点
p->next = temp->next; // 修改链接关系跳过该节点
free(temp); // 回收存储空间
}
}
int main() {
LinkList* head;
int n, k;
// 输入链表长度及各节点值
printf("请输入链表长度和相应节点数据:\n");
scanf("%d", &n);
head = CreateList(n);
// 输入需要删除的第几个节点
printf("请输入要删除的第K个节点(K >= 1):\n");
scanf("%d", &k);
RemoveNode(head, k); // 调用删除操作
PrintLinkList(head); // 输出修改后的链表内容
return 0;
}
```
---
### 功能说明:
上述代码实现了创建、显示以及移除指定编号处节点的操作流程。
#### 关键步骤解释:
1. **初始化**
使用了`InitList()`来生成一个带头结点但是尚未添加任何有效信息的新列表。
2. **构建链表**
函数`CreateList(int n)`负责依据用户提供的整数值逐一建立节点并将它们按顺序串联起来形成完整链条。
3. **删除特定序位上的项(RemoveNode)**
- 先判断传入参数合法性;
- 然后定位所需处理的目标之前的一个单元地址;
- 接下来调整其后续关联直至达成预期效果即完成任务同时释放对应资源避免泄露隐患。
4. **最终呈现成果部分由PrintLinkList()承担**
---
阅读全文
相关推荐


















