C中的链接列表

时间:2016-12-20 06:20:42

标签: c linked-list

我有一个程序(我试图解决的一个例子的一部分),它从文本文件(bus.txt)中读取一个值,然后对于这些数量的席位初始化一个结构的值是一个链表。所有这些都是在一个函数内部完成的,我希望链接列表在函数之外可用。 然后我想打印出结果,但似乎无法找到解决方案。

#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)
            {
                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);

    PASSENGERS* current = passenger;

    while (current != NULL)
    {
        printf("%s", current->fullname);
        printf("\n");
        current = current->next;
    }
}

3 个答案:

答案 0 :(得分:1)

指针start在函数readfile内更改。在函数外部,指针仍将保持值NULL

要解决此问题,您可以使用指针指针或从start函数返回readfile值。

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

  return start;
}

// in main
start = readfile(platenr, &numberofseats, passenger, tmp, start);

此外,您无需将变量platenrtmppassenger作为参数传递给readfile函数。它们可以是函数的内部变量。

答案 1 :(得分:1)

有三种方法(我能想到)获取readfile和main之间的列表:

  1. 使用全局变量(在这种情况下我不会使用它)
  2. 您可以在此处阅读全局变量https://www.tutorialspoint.com/cprogramming/c_scope_rules.htm 在这里,您可以找到关于是否应该最小化全局变量使用的讨论: Why are global variables bad, in a single threaded, non-os, embedded application

    1. 发送要更新的内存地址 - 如果我必须从函数中返回多个参数,我会使用它。

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

    2. 并在函数中更改乘客的值(例如)

      *passenger  = (PASSENGERS*) malloc (sizeof(PASSENGERS));
      *passenger->next = NULL;
      strcpy (*passenger->fullname, "A");    
      *passenger->seatnr = i + 1;
      

      在尝试取消引用之前,请确保验证乘客不为空。 (您还应该在尝试* passenger-&gt; fullname之前检查malloc是否成功)。

      1. 使用返回值 - 这是我在这里使用的。 我的函数声明是

        乘客* readfile(char * platenr,int seatnr)

      2. 我将返回开始

        return start;
        

        从main调用函数将是

        PASSENGERS* current = readfile(platenr, numberofseats);
        

        我认为这种解决方案更容易阅读。

答案 2 :(得分:0)

你可以通过双指针来做,我们可以传递指针的地址并在我们的函数中取消引用它并将新分配的块放在其中

void allocate_space(char ** ptr, int size){
    *ptr = malloc(size);
}

char * pointer = NULL;

allocate_space(&pointer, 100); // now pointer points to block allocated inside allocate_space function