Не создаются последующие узлы списка - C (СИ)
Формулировка задачи:
typedef struct node{
int data;
int data1;
node *next;
} Node;
Node *Add_D(Node*Top, int d, int d1) {
FILE *f;
f=fopen("my.txt","r");
if(f==NULL){
printf("Файл не найден");
getch();
exit(0);
}
while(!feof(f)) {
Top=NULL;
Node *newel=new Node;
int z=fscanf(f, "%d%d", &d, &d1);
if (z!=2) break;
printf("%d %d \n", d, d1);
newel->data=d;
newel->data1=d1;
newel->next=NULL;
if(Top==NULL) return newel;
printf("hi");
Node *temp=Top;
while(temp->next)
temp=temp->next;
temp->next=newel;
return Top;
}
fclose(f);
}
void show(Node*Top) {
while(Top) {
printf("(%dx^%d)->", Top->data1, Top->data);
Top=Top->next;
}}
int main(int argc, char *argv[])
{
system("chcp 1251");
int d,d1;
Node *nodeTop = new Node;
nodeTop = Add_D(nodeTop, d, d1);
show(nodeTop);
system("PAUSE");
return EXIT_SUCCESS;
}Решение задачи: «Не создаются последующие узлы списка»
#include <stdio.h>
#include <stdlib.h>
typedef struct _TNode
{
int value_one;
int value_two;
struct _TNode* next;
} TNode;
typedef struct _TQueue
{
TNode* head;
TNode* tail;
} TQueue;
//-----------------------------------------------------------------------------
TQueue* Push(TQueue* queue, int value_one, int value_two)
{
TNode* node = malloc(sizeof(TNode));
node->value_one = value_one;
node->value_two = value_two;
node->next = NULL;
if (queue->head && queue->tail)
{
queue->tail->next = node;
queue->tail = node;
}
else
{
queue->head = queue->tail = node;
}
return queue;
}
//-----------------------------------------------------------------------------
void Print(const TQueue* queue)
{
TNode* node = queue->head;
for (; node; node = node->next)
{
printf("(%dx^%d)->", node->value_one, node->value_two);
}
}
//-----------------------------------------------------------------------------
TQueue GetListFrom(FILE* f)
{
int value_one, value_two;
TQueue queue = {NULL, NULL};
while (fscanf(f, "%d %d", &value_one, &value_two) == 2)
{
Push(&queue, value_one, value_two);
}
return queue;
}
//-----------------------------------------------------------------------------
int main()
{
const char CFileName[] = "my.txt";
TQueue queue = {NULL, NULL};
FILE* f = fopen(CFileName, "r");
if (f == NULL)
{
perror(CFileName);
return EXIT_FAILURE;
}
queue = GetListFrom(f);
fclose(f);
Print(&queue);
return EXIT_SUCCESS;
}
Объяснение кода листинга программы
В данном коде реализована очередь (FIFO) с использованием связанного списка.
Связанный список состоит из узлов, каждый из которых содержит два целочисленных значения и указатель на следующий узел в списке.
Код функции Push добавляет новый узел в начало списка, обновляя указатели на голову и хвост списка. Если список пуст, то оба указателя (голова и хвост) указывают на новый узел. Если список не пуст, то новый узел добавляется перед текущим хвостом списка.
Код функции Print проходит по всем узлам списка и выводит их значения.
Код функции GetListFrom считывает из файла два целочисленных значения и добавляет их в начало списка.
В функции main создается пустой список, открывается файл для чтения, список заполняется данными из файла, затем выводится на экран.
Код не содержит обработки ошибок, кроме проверки на NULL при открытии файла. В случае ошибки при открытии файла выводится сообщение об ошибке и возвращается код завершения с неудачным статусом.