[英]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);
此外,您无需将变量platenr
, tmp
, passenger
作为参数传递给readfile
函数。 它们可以是函数的内部变量。
有三种方法(我可以想到)来获取readfile和main之间的列表:
您可以在以下网址阅读有关全局变量的信息:https://www.tutorialspoint.com/cprogramming/c_scope_rules.htm,并在此处可以找到有关是否应尽量减少使用全局变量的讨论: 为什么全局变量不好?单线程,非操作系统,嵌入式应用程序
发送要更新的内存地址-如果必须从函数中返回多个参数,我将使用它。
无效的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是否成功)。
使用返回值-这就是我在这里使用的值。 我的函数声明是
乘客*读取文件(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.