私は、リンクされたリストを使って、私が練習していた以前のプログラムを更新しようとしています。 私は、バスの座席数を含むtxtファイルを持っています。このbus.txtファイルを読むと、特定のリンクされたリストとnumberofseats(たとえば45人の座席)のためのメモリの動的割り当てが行われます。 私は次のコードを書いて、どのように動作するかテストし、各乗客のフルネームにAを入れようとしています.45席を印刷して、うまく動作するかどうか確認します。無限ループを取得し、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;
PASSENGERS* readfile(char *platenr, int *seatnr)
{
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);
PASSENGERS *p = malloc(*seatnr * sizeof(PASSENGERS));
if (p==NULL)
{
puts("Unable to allocate memory");
exit(1);
}
return p;
}
}
int main()
{
PASSENGERS *passenger, *tmp, *start=NULL;
passenger = readfile(platenr,&numberofseats);
for (i=0;i<numberofseats;i++)
{
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;
}
}
tmp=start;
while(tmp!=NULL)
{
printf ("%s",tmp->fullname);
tmp=tmp->next;
}
}
1回のmalloc呼び出しでN個のPASSENGERSの*配列*を割り当てました。それらを順番に配列に割り当てることを意味しましたか?もしそうなら、なぜですか?通常は、一度に1つずつ、乗客ごとに1つずつ割り当てて、リンクします。 – jarmod
これはリンクされたリストではありません。リンクされたリストで**ノードを**追加**削除**ノードを動的にすることができます。あなたはあなたのやり方でどちらかをすることはできません。 –