编写函数deln,具有删除链表中第n个结点的功能。再编写主函数,按输入顺序建立不带
时间: 2023-12-14 11:01:07 浏览: 115
要实现删除链表中第n个节点的功能,可以按照以下步骤编写函数deln:
1. 定义一个辅助指针变量p,将其指向链表的头节点。
2. 判断如果要删除的节点是头节点,即n等于1时,将头节点指向下一个节点,并释放原头节点的内存空间,结束函数。
3. 设置一个整型变量count,初始值为1,表示当前遍历到的节点位置。
4. 循环遍历链表,直到p指向最后一个节点或者count等于n-1时(表示p指向要删除节点的前一个节点)。
5. 在循环中,更新p为下一个节点,并将count增加1。
6. 如果最终循环结束时count等于n-1,表示找到了要删除节点的前一个节点。
7. 将要删除节点的指针保存为temp,并将p的下一个指针指向temp的下一个指针(即跳过要删除的节点)。
8. 释放temp节点的内存空间,结束函数。
下面是一个示例的deln函数的实现:
```c
struct ListNode {
int val;
struct ListNode *next;
};
void deln(struct ListNode **head, int n) {
if (*head == NULL || n <= 0) {
return;
}
struct ListNode *p = *head;
if (n == 1) {
*head = p->next;
free(p);
return;
}
int count = 1;
while (p != NULL && count != n - 1) {
p = p->next;
count++;
}
if (count == n - 1 && p != NULL) {
struct ListNode *temp = p->next;
p->next = temp->next;
free(temp);
}
}
```
然后,在主函数中按输入顺序建立一个不带头节点的链表。你可以根据具体的要求定义一个struct ListNode结构体,并编写createList函数来创建链表,如下所示:
```c
struct ListNode* createNode(int val) {
struct ListNode *node = malloc(sizeof(struct ListNode));
node->val = val;
node->next = NULL;
return node;
}
struct ListNode* createList(int size) {
struct ListNode *dummy = NULL;
struct ListNode *tail = dummy;
for (int i = 0; i < size; i++) {
int val;
scanf("%d", &val);
struct ListNode *node = createNode(val);
if (tail == NULL) {
dummy = node;
tail = node;
} else {
tail->next = node;
tail = node;
}
}
return dummy;
}
int main() {
int size;
scanf("%d", &size);
struct ListNode *head = createList(size);
// 在这里调用deln函数进行节点删除操作
return 0;
}
```
以上代码仅为示例,你可以根据实际需求进行修改。在主函数中,首先从输入读取链表的大小,然后调用createList函数来创建不带头节点的链表。最后,你可以在注释处调用deln函数来具体实现删除节点的功能。
阅读全文