首页 > 解决方案 > 免费malloc,使用Linus方法删除链表

问题描述

我被这个问题困了几个小时,我仍然无法释放我的程序的 malloc。出于某种原因,它说我在 1 个块中有 16 个字节,我一直在尝试使用程序中的函数 freeList() 来释放 malloc,但它似乎不起作用,如果你能发现我的错误,我将非常感激它!

#include<stdio.h>
#include<stdlib.h>

struct node
{
    int data;
    struct node *next;
}*head;



void append(int num)
{
    struct node *temp,*right;
    temp= (struct node *)malloc(sizeof(struct node));
    temp->data=num;
    right=(struct node *)head;
    while(right->next != NULL)
        right=right->next;
    right->next =temp;
    right=temp;
    right->next=NULL;
}



void add( int num )
{
    struct node *temp;
    temp=(struct node *)malloc(sizeof(struct node)); //*
    temp->data=num;
    if (head== NULL)
    {
        head=temp;
        head->next=NULL;
    }
    else
    {
        temp->next=head;
        head=temp;
    }
}
void addafter(int num, int loc)
{
    int i;
    struct node *temp,*left,*right;
    right=head;
    for(i=1;i<loc;i++)
    {
        left=right;
        right=right->next;
    }
    temp=(struct node *)malloc(sizeof(struct node));
    temp->data=num;
    left->next=temp;
    left=temp;
    left->next=right;
    return;
}



void insert(int num)
{
    int c=0;
    struct node *temp;
    temp=head;
    if(temp==NULL)
    {
        add(num);
    }
    else
    {
        while(temp!=NULL)
        {
            if(temp->data<num)
                c++;
            temp=temp->next;
        }
        if(c==0)
            add(num);
        else if(c<count())
            addafter(num,++c);
        else
            append(num);
    }
}


int delete(int num)
{
    struct node **temp;
    temp=&head;
    while(*temp!=NULL)
    {
        if((*temp)->data==num)
        {
           *temp= (*temp)->next;
           return 1;
        }
        else
        {
            *temp= &((*temp)->next);
        }
    }

    return 0;
}

void freeList(){
     struct node *temp;
     int i=0;

     while(head!=NULL){
       temp=head;
       head=head->next;
 free(temp->data);
       free(temp);
       i++;
     }
     printf("free %d records...\n",i);
}


void  display(struct node *r)
{
    r=head;
    if(r==NULL)
    {
        return;
    }
    while(r!=NULL)
    {
        printf("%d ",r->data);
        r=r->next;
    }
    printf("\n");
}


int count()
{
    struct node *n;
    int c=0;
    n=head;
    while(n!=NULL)
    {
        n=n->next;
        c++;
    }
    return c;
}


int  main()
{
    int i,num;
    struct node *n;
    head=NULL;
    while(1)
    {
        printf("\nList Operations\n");
        printf("===============\n");
        printf("1.Insert\n");
        printf("2.Display\n");
        printf("3.Size\n");
        printf("4.Delete\n");
        printf("5.Exit\n");
        printf("Enter your choice : ");
        if(scanf("%d",&i)<=0){
            printf("Enter only an Integer\n");
            exit(0);
        } else {
            switch(i)
 {
                case 1:      printf("Enter the number to insert : ");
                    scanf("%d",&num);
                    insert(num);//*
                    break;
                case 2:     if(head==NULL)
                    {
                        printf("List is Empty\n");
                    }
                    else
                    {
                        printf("Element(s) in the list are : ");
                    }
                    display(n);
                    break;
                case 3:     printf("Size of the list is %d\n",count());
                    break;
                case 4:     if(head==NULL)
                        printf("List is Empty\n");
                    else{
                        printf("Enter the number to delete : ");
                        scanf("%d",&num);
                        if(delete(num))
                            printf("%d deleted successfully\n",num);
                        else
                            printf("%d not found in the list\n",num);
                    }
                    break;
                case 5:  freeList();
                 return 0;

                default:    printf("Invalid option\n");
            }
        }
    }
    return 0;
}

我的主要问题是运行代码 freeList 时函数 freeList() 不会释放 malloc。

void freeList(){
     struct node *temp;
     int i=0;

     while(head!=NULL){
       temp=head;
       head=head->next;
       free(temp->data);
       free(temp);
       i++;
     }
     printf("free %d records...\n",i);
}

标签: clinked-listmalloc

解决方案


推荐阅读