为什么以下实现会覆盖元素/或仅打印一个元素
Why the following implementation overrides the elements/ or prints only one element
我正在尝试用 c 实现链表。在元素的插入中,如果head不为NULL,我是想在链表的开头添加一个节点
这是我的代码
#include<stdio.h>
#include<stdlib.h>
struct Node{
int data;
struct Node* next;
};
struct Node* head ;
void insert(int data){
struct Node* temp = (struct Node*) malloc(sizeof(struct Node));
temp->data = data;
if(head!=NULL){
temp = head;
head = temp;
}
temp -> next = NULL;
head = temp;
}
void print(){
struct Node* temp = head;
while(temp!=NULL){
printf("%d \n",temp->data);
temp = temp->next;
}
}
int main(){
head = NULL;
insert(2);
insert(3);
insert(5);
print();
return 0;
}
但是在打印功能上,我只得到 2 作为输出。可能是什么原因?
函数应该按如下方式定义
void insert( int data )
{
struct Node *temp = ( struct Node * )malloc( sizeof( struct Node ) );
if ( temp != NULL )
{
temp->data = data;
temp->next = head;
head = temp;
}
}
或以下方式
_Bool insert( int data )
{
_Bool success;
struct Node *temp = ( struct Node * )malloc( sizeof( struct Node ) );
if ( ( success = temp != NULL ) )
{
temp->data = data;
temp->next = head;
head = temp;
}
return success;
}
至于你的代码,当它不是第一个节点时,你总是分配 head 本身
if(head!=NULL){
temp = head;
head = temp;
}
因此程序出现内存泄漏,列表始终包含第一个插入的元素。
当然,您还需要编写一个函数,在不再需要列表时释放所有分配的内存。
这可能是插入函数
void insert(int n)
{
if(head==NULL)
{
head=(struct Node*)malloc(sizeof(struct Node));
head->data=n;
head->next=NULL;
}
else
{
struct Node *temp=(struct Node*)malloc(sizeof(struct Node));
temp->data=n;
temp->next=head;
head=temp;
}
}
我正在尝试用 c 实现链表。在元素的插入中,如果head不为NULL,我是想在链表的开头添加一个节点 这是我的代码
#include<stdio.h>
#include<stdlib.h>
struct Node{
int data;
struct Node* next;
};
struct Node* head ;
void insert(int data){
struct Node* temp = (struct Node*) malloc(sizeof(struct Node));
temp->data = data;
if(head!=NULL){
temp = head;
head = temp;
}
temp -> next = NULL;
head = temp;
}
void print(){
struct Node* temp = head;
while(temp!=NULL){
printf("%d \n",temp->data);
temp = temp->next;
}
}
int main(){
head = NULL;
insert(2);
insert(3);
insert(5);
print();
return 0;
}
但是在打印功能上,我只得到 2 作为输出。可能是什么原因?
函数应该按如下方式定义
void insert( int data )
{
struct Node *temp = ( struct Node * )malloc( sizeof( struct Node ) );
if ( temp != NULL )
{
temp->data = data;
temp->next = head;
head = temp;
}
}
或以下方式
_Bool insert( int data )
{
_Bool success;
struct Node *temp = ( struct Node * )malloc( sizeof( struct Node ) );
if ( ( success = temp != NULL ) )
{
temp->data = data;
temp->next = head;
head = temp;
}
return success;
}
至于你的代码,当它不是第一个节点时,你总是分配 head 本身
if(head!=NULL){
temp = head;
head = temp;
}
因此程序出现内存泄漏,列表始终包含第一个插入的元素。
当然,您还需要编写一个函数,在不再需要列表时释放所有分配的内存。
这可能是插入函数
void insert(int n)
{
if(head==NULL)
{
head=(struct Node*)malloc(sizeof(struct Node));
head->data=n;
head->next=NULL;
}
else
{
struct Node *temp=(struct Node*)malloc(sizeof(struct Node));
temp->data=n;
temp->next=head;
head=temp;
}
}