链表删除节点容易出现的错误
时间: 2023-05-19 15:00:44 浏览: 82
链表删除节点容易出现的错误包括:未考虑头节点和尾节点的特殊情况、未释放被删除节点的内存、删除节点后未更新链表指针等。为了避免这些错误,我们应该仔细考虑每个节点的情况,并在删除节点时进行必要的指针更新和内存释放操作。
相关问题
用c++写一段完整的代码,要求实现单向链表删除节点,不要出现语法错误
以下是一个基于C语言实现单向链表删除节点的代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct node {
int data;
struct node *next;
} Node;
// 定义链表头指针
Node *head = NULL;
// 创建链表
void createList() {
int n, i, num;
Node *p;
printf("请输入链表的节点个数:");
scanf("%d", &n);
// 创建链表头节点
head = (Node*)malloc(sizeof(Node));
head->next = NULL;
p = head;
for (i = 1; i <= n; i++) {
printf("请输入第%d个节点的值:", i);
scanf("%d", &num);
// 创建新的节点并添加到链表中
Node *newNode = (Node*)malloc(sizeof(Node));
newNode->data = num;
newNode->next = NULL;
p->next = newNode;
p = newNode;
}
}
// 遍历链表
void traverseList() {
Node *p = head->next;
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
// 删除节点
void deleteNode(int num) {
Node *p = head->next;
Node *pre = head;
// 遍历链表,查找待删除节点的位置
while (p != NULL) {
if (p->data == num) {
break;
}
pre = p;
p = p->next;
}
// 如果找到了待删除节点,则将该节点从链表中删除
if (p != NULL) {
pre->next = p->next;
free(p);
}
}
int main() {
createList();
printf("原始链表:");
traverseList();
int num;
printf("请输入要删除的节点的值:");
scanf("%d", &num);
deleteNode(num);
printf("删除节点后的链表:");
traverseList();
return 0;
}
```
在上述代码中,我们使用了 `typedef` 定义了一个 `Node` 结构体,它包括两个成员变量:`data` 和 `next`,分别表示节点的数据和指向下一个节点的指针。同时,我们还定义了一个全局的链表头指针 `head`,它指向链表的头节点。
在 `createList()` 函数中,我们首先从用户输入中获取链表的节点个数,然后创建链表头节点,接着遍历用户输入的节点值,创建新的节点并将其添加到链表的末尾。
在 `traverseList()` 函数中,我们遍历链表,输出每个节点的数据值。
在 `deleteNode()` 函数中,我们传入一个整数 `num`,它表示要删除的节点的值。我们遍历链表,查找待删除节点的位置,然后将其从链表中删除。
最后,在 `main()` 函数中,我们先创建链表,然后输出原始链表,接着要求用户输入要删除的节点的值,然后调用 `deleteNode()` 函数删除该节点,并输出删除节点后的链表。
c语言写创建插入删除链表
#include<stdio.h>
#include<stdlib.h>
//定义链表节点结构体
typedef struct node{
int data;
struct node *next;
}Node;
//创建链表函数
Node* createList(){
int data;
Node* head = NULL;
Node* tail = NULL;
printf("请输入链表数据(输入-1结束):\n");
while(1){
scanf("%d",&data);
if(data == -1){
break;
}
Node* temp = (Node*)malloc(sizeof(Node));
temp->data = data;
temp->next = NULL;
if(head == NULL){
head = temp;
tail = temp;
}
else{
tail->next = temp;
tail = temp;
}
}
return head;
}
//插入链表节点函数
Node* insertNode(Node* head,int pos,int data){
Node* temp = (Node*)malloc(sizeof(Node));
temp->data = data;
temp->next = NULL;
if(head == NULL){
head = temp;
return head;
}
if(pos == 0){
temp->next = head;
head = temp;
return head;
}
Node* p = head;
Node* q = head;
int i = 0;
while(p != NULL && i < pos){
q = p;
p = p->next;
i++;
}
if(p == NULL && i == pos){
q->next = temp;
return head;
}
if(p != NULL && i == pos){
q->next = temp;
temp->next = p;
return head;
}
printf("插入位置错误!\n");
return head;
}
//删除链表节点函数
Node* deleteNode(Node* head,int pos){
if(head == NULL){
printf("链表为空!\n");
return head;
}
if(pos == 0){
Node* temp = head;
head = head->next;
free(temp);
return head;
}
Node* p = head;
Node* q = head;
int i = 0;
while(p != NULL && i < pos){
q = p;
p = p->next;
i++;
}
if(p == NULL && i == pos){
printf("链表长度小于%d!\n",pos);
return head;
}
if(p != NULL && i == pos){
q->next = p->next;
free(p);
return head;
}
printf("删除位置错误!\n");
return head;
}
//遍历链表函数
void printList(Node* head){
if(head == NULL){
printf("链表为空!\n");
return;
}
printf("链表数据为:");
Node* p = head;
while(p != NULL){
printf("%d ",p->data);
p = p->next;
}
printf("\n");
}
int main(){
Node* head = createList();
printList(head);
head = insertNode(head,0,10);
printList(head);
head = insertNode(head,3,20);
printList(head);
head = insertNode(head,6,30);
printList(head);
head = deleteNode(head,0);
printList(head);
head = deleteNode(head,3);
printList(head);
head = deleteNode(head,6);
printList(head);
return 0;
}