我正在尝试在列表末尾插入项目,但是,当我编译它时,它确实为记录 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
,而不是使用碰巧存在的任何随机值。