2012-11-25 36 views
1

在此程序中,我想将元素放入列表中而不是数组中。最后打印出列表。将数组项放入列表中并打印出列表项C

例如。 西蒙22 苏丝24
...

不过,我真的不知道如何操作的列表,以及如何建立堆和检索。我做了一些关于如何去做的研究。这就是我所想的。 而一些错误出来了,我不知道如何解决。

error: 'ptr' undeclared (first use in this function) 
arrays.c:37:5: note: each undeclared identifier is reported only once for each function  it appears in 
arrays.c: In function 'main': 
arrays.c:62:9: error: expected identifier or '(' before '=' token 
arrays.c:69:5: warning: passing argument 1 of 'insert' from incompatible pointer type 
arrays.c:28:13: note: expected 'struct Record *' but argument is of type 'struct Record **' 

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


/* these arrays are just used to give the parameters to 'insert', 
    to create the 'people' array */ 
char *names[7]= {"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 *names; 
    int ages; 
    struct Record *next; 
} Record; 

char getname(Record *names){ 
    return names; 
} 

int getage(Record *ages){ 
    return ages; 
} 

static void insert (Record *p, char *s, int n) { 

//p[(*)] = malloc(sizeof(person)); 

/*static int nextfreeplace = 0;*/ 
    Record *headptr = NULL; 

    while(!reached_eof(p)){ 

/* allocate heap space for a record */ 
     ptr =(Record*) malloc(sizeof(Record)); 

     if(ptr == NULL){ 
      abort(); 
      printf("memory allocation fail"); 
      exit(1); 
     } 
     else{ 
      printf("memory allocation to person - %s - \n", s);  
     } 

     ptr->name = getname(p); 
     ptr->age = getage(p); 

     /* link new object into the list */ 
     ptr->next = headptr; 
     headptr = ptr; 

    } 
}  


int main(int argc, char **argv) { 

    /* declare nextinsert */ 
    int = 0;    

    /* 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"); 


    /* print the people array here*/ 
    for (int i=0; i < 7; i++) { 
     printf("The name is: %s, the age is:%i\n", p[i]->names, p[i]->ages); 
    } 


    /* 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[i]); 
    } 
} 

回答

3

的所有

下面的代码首先是奇怪

char getname(Record *names){ 
    return names; 
} 

int getage(Record *ages){ 
    return ages; 
} 

我没有看到上述功能的实际需要。

static void insert (Record *p, char *s, int n) { 

//p[(*)] = malloc(sizeof(person)); 

/*static int nextfreeplace = 0;*/ 
    Record *headptr = NULL; 

    while(!reached_eof(p)){ 
/* allocate heap space for a record */ 
ptr =(Record*) malloc(sizeof(Record)); 

if(ptr == NULL){ 
    abort(); 
    printf("memory allocation fail"); 
    exit(1); 
}else{ 
    printf("memory allocation to person - %s - \n", s);  
} 

为什么你使用while循环:

即使这些线路

ptr->name=getname(p); 
ptr->age=getage(p); 

你可以用

ptr->name=s; 
ptr->age=n; 

下面的函数包含很多错误和奇怪的代码relace他们。并且你错过了ptr指针的定义,并且你有注释在函数结尾处传达了neaw头。在此之后,你如何解决这个问题:

static void insert (Record **header, char *s, int n) { 

    Record *ptr; 
    ptr =(Record*) malloc(sizeof(Record)); 

    if(ptr == NULL){ 
     abort(); 
     printf("memory allocation fail"); 
     exit(1); 
    }else{ 
     printf("memory allocation to person - %s - \n", s);  
    } 
    ptr->name=s; 
    ptr->age=n; 

    /* link new object into the list */ 
    ptr->next=*header; 
    *headptr=ptr; 
} 

而在你的主要功能:

int main(int argc, char **argv) { 


    int i= 0; 
    Record *p, *headptr=NULL; 

for (int i=0; i < 7; i++) { 
insert (&headptr, names[i], ages[i]); 
/* do not dereference the pointer */ 
    } 

for (int i=0; i < 7; i++) { /* this will print from array*/ 
    printf("From array The name is: %s, the age is:%i\n", p[i]->names, p[i]->ages); 
} 

for (p=headptr; p!=NULL; p=p->next) { /* this will print from linked list*/ 
    printf("From linked list The name is: %s, the age is:%i\n", p->names, p->ages); 
} 


} 
+0

代码是否会读取列表的下一个元素? – user1851359

+0

固定代码将inserrt您的元素在列表的头部 – MOHAMED

+0

代码更新以读取和打印链接列表的内容 – MOHAMED

0

我想唯一的错误是你错过了定义指针,然后再使用它与malloc函数。在你的代码定义指针

Record *ptr ; 

而且一个地方有以下文字:

int = 0; 

这是第二个错误。

而你传递一个NULL指针p在您的for循环

编辑这些插入功能,而且他们现在必须修正错误。

+0

欢呼,减少错误。 – user1851359

+0

我更新了答案@ user1851359 – cipher