Возникли проблемы при вводе одного узла в мой односвязный список - PullRequest
0 голосов
/ 06 апреля 2020

Я создаю односвязный список только с одним узлом, и у меня возникают некоторые проблемы с тем, чтобы заставить его работать так, как я хочу. Когда я ввожу информацию, которую я хочу разместить в списке, я получаю последние данные, которые я добавляю к предыдущему без моих действий. Вот мой код:

#include <stdio.h>
#include <stdlib.h>
#define maxName 30
#define maxID 10
#define maxAge 3

typedef struct node
{
    char fName[maxName];
    char lname[maxName];
    char PUID[maxID];
    char age[maxAge];
    struct node *next;
}node;

node *head = NULL;

//This function will create a list with just a single node and the data to the list must be passed by paramter
node * createnode(char firstName[], char lastName[], char puid[], char age[])
{
    head = (node*)malloc(sizeof(node));

    printf("Enter the first name: ");
    scanf("%s", &(head -> fName));

    printf("Enter the last name: ");
    scanf("%s", &(head -> lname));

    printf("Enter the PUID: ");
    scanf("%s", &(head -> PUID));

    printf("Enter the Age: ");
    scanf("%s", &(head -> age));

    return head;
}

И это вывод, который я получаю при вводе информации: JAke, Thomas, 789456987525,25 ->

То 25 добавляется в конец PUID я вхожу. Любая помощь вам будет здорово! Спасибо!

Ответы [ 2 ]

0 голосов
/ 06 апреля 2020

Это объявление функции

node * createnode(char firstName[], char lastName[], char puid[], char age[]);

не имеет смысла, потому что параметры не используются в функции.

Поэтому функция должна быть объявлена ​​как

node * createnode( void );

Внутри функции операторы вроде этого

scanf("%s", &(head -> fName));
           ^^^

неверны. Они должны выглядеть следующим образом:

scanf("%s", head -> fName);

Что касается неправильного вывода, то кажется, что вы вводите больше символов в массив символов, чем он может содержать, включая завершающий ноль строки.

Например, введенные символы 7894569875 будут храниться в элементе данных PUID как строка "7894569875", которая содержит 11 символов (включая завершающий нулевой символ) вместо 10.

Более безопасно использовать функцию fgets вместо scanf с указателем формата% s.

Например,

#include <string.h>

//...


fgets( head->fName, maxName, stdin );
head->fName[ strcspn( head->fName, "\n" ) ] = '\0';

Обратите внимание, что плохая идея, когда функция зависит от глобальной переменной. В этом случае вы не сможете, например, иметь списки в программе.

0 голосов
/ 06 апреля 2020

Вы должны удалить адресные операторы.

printf("Enter the first name: ");
scanf("%s", (head -> fName));

printf("Enter the last name: ");
scanf("%s", (head -> lname));

printf("Enter the PUID: ");
scanf("%s", (head -> PUID));

printf("Enter the Age: ");
scanf("%s", (head -> age));
...