C语言 为什么下面的实现覆盖元素/或只打印一个元素



我试图在c中实现链表。在元素的插入中,如果头部不是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;
}

对于你的代码,你总是分配头本身当它不是第一个节点

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;
     }

}

相关内容

  • 没有找到相关文章

最新更新