C和函数中的链接列表

时间:2016-12-19 20:35:38

标签: c linked-list

我创建了以下链接列表,该列表从文件中读取数据,然后动态地将值分配给链接列表(例如,通过在全名中提供A来初始化它。我希望列表在函数之外可用但是我想我有一个问题。 通过尝试打印主要内部列表我什么都没有.. 我的代码在

之下
#include <stdio.h>             
#include <string.h>             
#include <stdlib.h>             
int i,j,numberofseats,temp;     
char platenr[8],selection;      
char firstname[20],lastname[20]; 
char phone[11];                  
char *p;                         

typedef struct psg               
    {
    char fullname[40];
    unsigned short phonenr[10]; 
    unsigned int seatnr;        
    struct psg *next
    }PASSENGERS;                


void readfile(char *platenr, int *seatnr, PASSENGERS *passenger, PASSENGERS *tmp, PASSENGERS *start)
    {

    char buff[60];
    FILE *businfo;
    businfo = fopen ("bus.txt","r");
    if (businfo == NULL)
        {
        printf("Error Opening File, check if file bus.txt is present");
        exit(1);
        }
    else                                                                
        {
        fscanf(businfo,"%s %d",platenr, seatnr);      
        printf("Bus Licence plate Nr is: %s, and Number of Seats is: %d", platenr, *seatnr); 

        for (i=0;i<numberofseats;i++)
        {
        passenger  = (PASSENGERS *) malloc (sizeof(PASSENGERS));
        if (passenger==NULL)            /*elegxos orthis desmeysis mnimis*/
            {
            puts("Unable to allocate memory");
            exit(1);
            }
        passenger->next=NULL;
        strcpy (passenger->fullname,"A");
        passenger->seatnr=i+1;
        for (j=0;j<10;j++)
            passenger->phonenr[j]=0;
        if (start==NULL)
            start=passenger;
        else{
            tmp=start;
        while (tmp->next !=NULL) tmp=tmp->next;
        tmp->next=passenger;
            }
        }
        }

    }



int main()
{
PASSENGERS *passenger, *tmp, *start=NULL;
readfile(platenr,&numberofseats, passenger,tmp, start);

tmp=start;
while(tmp!=NULL)
    {
    printf ("%s",tmp->fullname);
    tmp=tmp->next;
    }

}

1 个答案:

答案 0 :(得分:1)

在Main的一侧,您将start作为指针传递。然后,您在函数start内更改readfile的值。 main中的变量startstart 中的变量readfile不是同一个变量。要使此代码生效,您需要通过引用传递。

如上所述,代码将不会打印任何内容,因为main内部的start值不会发生变化。

某些编译器会让您执行以下操作...

readfile( ... , PASSENGERS *& start)

然后,上面的代码会将start中的变量mainstart中的变量readfile设为相同的变量。

如果您的编译器不喜欢那样,那么您需要将指针传递给指针。

readfile( ... , PASSENGERS ** pStart)

然后在你的函数内部声明并设置启动这样的东西

PASSENGERS * start = *pStart;

干杯