C语言实现单链表
# include <stdio.h>#include <stdlib.h>
//定义节点
typedef struct NODE
{
int data;
struct NODE* next;
}node;
//初始化链表
node *initLinkTable()
{
//创建一个头指针
node *head = NULL;
return head;
}
//展示列表元素
void displayEle(node* head)
{
while (head)
{
printf("链表元素:%d\n", head->data);
head = head->next;
}
}
//增加节点,尾插法
void addNode(node* head,int data)
{
node *n = (node *)malloc(sizeof(node));
if (!n)
{
printf("申请内存失败");
return;
}
n->data = data;
n->next = NULL;
node* temp = head;
if (!head)
{
head = n;
}
else
{
while (temp)
{
temp = temp->next;
}
temp = n;
}
}
void main(void)
{
node *head = initLinkTable();
for (int i = 0; i < 5; i++)
{
addNode(head, i);
}
displayEle(head);//为什么无输出
} 为什么没有插入节点? 1. 代码逻辑不对
2. 申请了内存不释放
3. node *n = (node *)malloc(sizeof(node));
这里为什么不写成这样?
node *n = malloc(sizeof(node));
#include <stdio.h>
#include <stdlib.h>
//定义节点
typedef struct NODE
{
int data;
struct NODE* next;
}node;
//初始化链表
node *initLinkTable()
{
//创建一个头指针
node *head = NULL;
return head;
}
//展示列表元素
void displayEle(node* head)
{
while (head)
{
printf("链表元素:%d\n", head->data);
head = head->next;
}
}
//增加节点,尾插法
void addNode(node **head, int data)
{
//node *n = (node *)malloc(sizeof(node));
node *n = malloc(sizeof(node));
if (!n)
{
printf("申请内存失败");
return;
}
n->data = data;
n->next = NULL;
if(!*head) {*head = n; return;}
node* temp = *head;
while(temp->next) temp = temp->next;
temp->next = n;
/*
node* temp = head;
if (!head)
{
head = n;
}
else
{
while (temp)
{
temp = temp->next;
}
temp = n;
}
*/
}
void free_list(node *n) {
while(n) {
node *temp = n; n = temp->next;
free(temp);
}
}
int main(void)
{
node *head = initLinkTable();
for (int i = 0; i < 5; i++)
{
addNode(&head, i);
}
displayEle(head);//为什么无输出
free_list(head);
return 0;
}
第三点是类型的强制转换啊。
逻辑就是,初始化时设置了指向null的头指针;addNode中,根据头指针是不是指向null来设置。 麻烦各位大佬看看。 wuxianbiao 发表于 2021-8-8 19:05
第三点是类型的强制转换啊。
逻辑就是,初始化时设置了指向null的头指针;addNode中,根据头指针是不是指 ...
为什么要强制转换?不转换不行吗?
不转换可以,为什么要转换?
wuxianbiao 发表于 2021-8-8 20:33
麻烦各位大佬看看。
都说了你代码逻辑不对,不能那样写 # include <stdio.h>
# include <stdlib.h>
//定义节点
typedef struct NODE
{
int data;
struct NODE* next;
}node;
//初始化链表
node *initLinkTable()
{
//创建一个头节点
node *head = (node *)malloc(sizeof(node));
if (!head)
{
printf("申请内存失败");
return;
}
head->next = NULL;
return head;
}
//展示列表元素
void displayEle(node* head)
{
node* temp = head;
while (temp->next)
{
printf("111");
printf("链表元素:%d\n", temp->next->data);
temp = temp->next;
}
}
//增加节点,尾插法
void addNode(node* head,int data)
{
node *n = (node *)malloc(sizeof(node));
if (!n)
{
printf("申请内存失败");
return;
}
n->data = data;
n->next = NULL;
node* temp = head;
while (temp->next)
{
temp = temp->next;
}
temp->next = n;
}
void main(void)
{
node* head = initLinkTable();
for (int i = 0; i < 5; i++)
{
addNode(head, i);
}
displayEle(head);
} 理解错了结构体指针的含义,上面的可以得到想要的结果。应该是将结构体指针的next指向新加入的节点,而不是将结构体指针指向新加入的节点。
页:
[1]