我最近开始学习链接列表,我想知道关于我的代码的两件事:
为什么程序会崩溃?
为什么在最后用换行符\n
键入每个成员?
这是我的代码。我所要做的就是添加一个成员并打印出来。
struct node
{
char* day;
char* month;
char* year;
struct node* next;
};
typedef struct node node;
void print(node* head){
node* temp=head;
while(temp != NULL){
printf("%s %s %s",temp->day,temp->month,temp->year);
temp=temp->next;
}
}
node* add(node* head)
{
node * new_node;
int n;
char temp[25];
new_node = malloc(sizeof(node));
fgets(temp,sizeof(temp),stdin);
n=strlen(temp);
new_node->day=malloc(n+1);
strcpy(new_node->day,temp);
fgets(temp,sizeof(temp),stdin);
n=strlen(temp);
new_node->month=malloc(n+1);
strcpy(new_node->month,temp);
fgets(temp,sizeof(temp),stdin);
n=strlen(temp);
new_node->year=malloc(n+1);
strcpy(new_node->year,temp);
new_node->next=head;
return new_node;
}
int main(void)
{
node* head=NULL;
head=malloc(sizeof(node));
if (head == NULL)
{
return 1;
}
head=add(head);
print(head);
return 100;
}
任何人都可以指出我做错了什么以及我能做得更好吗?
答案 0 :(得分:2)
当你做
时ptr = malloc(sizeof(node));
已分配内存但未初始化。这将导致节点结构的下一个指针指向未定义的内容。然后,当您在打印功能中使用它时,程序崩溃。
放一个
memset(ptr, 0, sizeof(node))
在malloc之后或者显式地将下一个指针初始化为NULL。
答案 1 :(得分:0)
我将您的代码更改为:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
struct node
{
char* day;
char* month;
char* year;
struct node* next;
};
typedef struct node node;
void print(node *head){
node *temp = head;
while(temp){
printf("day:%s\nmonth:%s\nyear:%s\n",temp->day,temp->month,temp->year);
temp=temp->next;
}
}
node* add(node* head)
{
node * new_node;
int n;
char temp[25];
new_node = malloc(sizeof(node));
printf("day:\n");
fgets(temp,sizeof(temp),stdin);
n=strlen(temp);
new_node->day=malloc(n+1);
strcpy(new_node->day,temp);
printf("Month:\n");
fgets(temp,sizeof(temp),stdin);
n=strlen(temp);
new_node->month=malloc(n+1);
strcpy(new_node->month,temp);
printf("Year:\n");
fgets(temp,sizeof(temp),stdin);
n=strlen(temp);
new_node->year=malloc(n+1);
strcpy(new_node->year,temp);
/// new_node->next=head;///
printf("\n\n\n");
//printf("%s%s%s \n",new_node->day,new_node->month,new_node->year);
return new_node;
}
int main(int argc,char* argv[])
{
node* head=NULL;
head=malloc(sizeof(node));
if (head == NULL)
{
printf("NULL\n");///cant allocate memory
}
printf("this\n");
head=add(head);
print(head);
return 100;
}