我正在创建一个只有一个节点的单链表,我在让它按我想要的方式工作时遇到了一些问题。当我输入我想放在列表中的信息时,我会得到最后一段数据,不用我做就可以附加到前一段数据上。这是我的代码:
#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,7894569877525,25->
25是附加到我输入的PUID的末尾。任何帮助你都很棒!非常感谢。
您应该删除地址运算符。
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));
此函数声明
node * createnode(char firstName[], char lastName[], char puid[], char age[]);
没有意义,因为函数中没有使用参数。
所以函数应该像一样声明
node * createnode( void );
在像这样的函数语句中
scanf("%s", &(head -> fName));
^^^
不正确。它们看起来一定像
scanf("%s", head -> fName);
至于错误的输出,那么在字符数组中输入的字符似乎比它所能容纳的字符多,包括字符串的终止零。
例如,输入的符号7894569875
将被存储在数据成员PUID
中,类似于包含11个字符(包括终止零字符(而不是10个字符的字符串"7894569875"
。
使用函数fgets而不是带有格式说明符%s的scanf更安全。
例如
#include <string.h>
//...
fgets( head->fName, maxName, stdin );
head->fName[ strcspn( head->fName, "n" ) ] = ' ';
请注意,当函数依赖于全局变量时,这是一个坏主意。在这种情况下,您将无法在程序中列出例如。