不一定对,仅供参考
在单链表中开始理解错误的地方
这两个并不等价,前者用于后移,后者会破坏链表结构
list = list->next; list->next = list->next->next;
#include <stdio.h>
#include <stdlib.h>
typedef struct Node{
int data;
struct Node* next;
}Node;
// 初始化,创建头结点返回
Node* list_init()
{
Node* list = (Node*)malloc(sizeof(Node));
list->next = NULL;
list->data = 0;
return list;
}
// 头插法
int head_insert(Node* list,int data)
{
Node* node = (Node*)malloc(sizeof(Node));
node->next = NULL;
node->data = data;
node->next = list->next;// 连接后面结点
list->next = node; // 头后添加
list->data++; // 记录个数
return 0;
}
// 尾插法
int tail_insert(Node* list,int data)
{
Node* node = (Node*)malloc(sizeof(Node));
node->next = NULL;
node->data = data;
Node* head = list;
while(list->next != NULL)
{
list = list->next;//list->next = list->next->next; //改变list,注释方法错误
}
node->next = list->next;
list->next = node;
list->next->data = data;
list = head;
head->data++;
return 0;
}
int delete_node(Node* list,int data)
{
if(list == NULL || list->next == NULL) return -1;
Node* pre = list;
Node* current = list->next;
while(current != NULL)
{
if(current->data == data)
{
pre->next = current->next;
list->data--;
free(current);
return 0;
}
pre = current;
current = current->next;
}
return -1;
}
void printf_list(Node* list)
{
Node* current = list;
while(current->next != NULL)
{
printf("%d\t",current->next->data);
current = current->next;
}
printf("\n");
printf("num:%d\n",list->data);
}
void free_list(Node* list)
{
while(list != NULL)
{
Node* current = list;
list = list->next;
free(current);
}
}
int main(int argc, char const *argv[])
{
Node* list = list_init();
tail_insert(list,3);
tail_insert(list,4);
tail_insert(list,5);
tail_insert(list,6);
tail_insert(list,7);
delete_node(list,4);
printf_list(list);
return 0;
}