繁体   English   中英

C中的链接列表

[英]Linked Lists in C

我有一个程序(我正在尝试解决的示例的一部分),该程序从文本文件( 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;
    }
}

指针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函数。 它们可以是函数的内部变量。

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

  1. 使用全局变量(在这种情况下,我不会使用它)

您可以在以下网址阅读有关全局变量的信息:https://www.tutorialspoint.com/cprogramming/c_scope_rules.htm,并在此处可以找到有关是否应尽量减少使用全局变量的讨论: 为什么全局变量不好?单线程,非操作系统,嵌入式应用程序

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

    无效的readfile(char * platenr,int * seatnr,PASSENGERS * passenger,PASSENGERS * tmp,PASSENGERS * start)

并在函数中将旅客的值更改为(例如)

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

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

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

    乘客*读取文件(char * platenr,int seatnr)

我会返回开始

return start;

来自main的函数调用将是

PASSENGERS* current = readfile(platenr, numberofseats);

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

您可以通过双指针来实现,我们可以传递指针的地址并在函数中取消引用,然后将新分配的块放入其中

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM