在 C 语言中,在列表末尾插入项目会产生分段错误



我正在尝试在列表末尾插入项目,但是,当我编译它时,它确实为记录 ptr 分配了内存,但它不会在列表末尾插入项目。分段错误。谁能帮忙?干杯。

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

/* these arrays are just used to give the parameters to 'insert',
   to create the 'people' array */
char names[][10]= {"Simon", "Suzie", "Alfred", "Chip", "John", "Tim",
      "Harriet"};
int ages[7]= {22, 24, 106, 6, 18, 32, 24};

/* declare your struct for a person here */
typedef struct Record{
    char *name;
    int age;
    struct Record *next;
}  Record;
//set the head pointer at the start of the list
Record *headptr = NULL;
static void insert (Record *p, char *s, int n) {
/* create a new space for the new person */
Record *ptr =(Record*) malloc(sizeof(Record));
    /* check if it is succeeded  */ 
    if(ptr == NULL){  
        abort();
        printf("memory allocation fail"); 
        exit(1);  
    }else{
        printf("memory allocation to person  - %s - n", s);      
    }
    //set the data for the new person
    ptr->name=s;
    ptr->age=n;
    //ptr= NULL; 
    if(headptr==NULL){
        headptr = ptr->next;
        ptr=headptr;
    }else{
        while( ptr->next == NULL) {
            ptr=ptr->next;
        headptr=ptr;
        }
    }  
}  
int main(int argc, char **argv) {
    /* declare the people array here */
    Record *p=headptr;
    headptr = NULL;
    //insert the members and age into the unusage array. 
    for (int i=0; i < 7; i++) {
        insert (p,names[i], ages[i]);
    /* do not dereference the pointer */
    }
    /* print out a line before printing the names and ages */
    printf("n");
    //set the pointer at the start of the list 
    p = headptr;
    /* print the people array here*/
    for (int i = 0; i < 7; i++, p = p->next) {
        printf("The name is: %s, the age is:%in", p->name, p->age);
    }

     /* This is the third loop for call free to release the memory allocated by malloc */
     /* the free()function deallocate the space pointed by ptr. */
     for(int i=0; i<7;i++){
         free(p);
     }
}

您的insert()函数有多个错误:

static void insert (Record *p, char *s, int n) {
    /* create a new space for the new person */
    Record *ptr =(Record*) malloc(sizeof(Record));
    /* check if it is succeeded  */ 
    if(ptr == NULL){  
        abort();
        printf("memory allocation fail"); 
        exit(1);  
    }else{
        printf("memory allocation to person  - %s - n", s);      
    }
    //set the data for the new person
    ptr->name=s;
    ptr->age=n;
    ptr->next=NULL;
    if(headptr==NULL)
    {
        headptr = ptr;
    }else{
        // Iterate over complete list until the last element has been reached.
        Record* tail = headptr;
        while(tail->next!=NULL)
        {
            tail=tail->next;
        }
        // Append new element to last element.
        tail->next = ptr;
    }  
}

但是,这种链表实现效率相当低下,我建议您在继续编程之前先阅读链表在 C 中是如何完成的: http://www.thegeekstuff.com/2012/08/c-linked-list-example/

当你分配一个新的Record时,你永远不会初始化它的next指针。

您应该将其设置为 NULL,而不是使用碰巧存在的任何随机值。

相关内容

  • 没有找到相关文章

最新更新