#include <stdlib.h>
struct Student
{
char No[11];
char Name[11];
int Age;
};
struct Node
{
struct Student Stu;
struct Node *Next;
};
void CreateList(struct Node *Head);
void Output(struct Node *Head);
int main(void)
{
/*********Found************/
struct Node *Head;
Head = (struct Node *)malloc(sizeof(struct Node));
Head->Next = NULL;
CreateList(Head);
Output(Head);
return 0;
}
void CreateList(struct Node *Head)
{
int i = 0;
char tmp[10];
do
{
struct Node *tt;
tt = (struct Node*)malloc(sizeof(struct Node));
printf("请输入学生的学号:");
gets(tt->Stu.No);
printf("请输入学生的姓名:");
gets(tt->Stu.Name);
printf("请输入学生的年龄:");
gets(tmp);
tt->Stu.Age = atoi(tmp);
tt->Next = Head->Next;//这句没看懂
/*********Found************/
i++;
if(i==1)
Head = tt;
else
{
Head->Next=tt;
}
printf("是否继续添加节点?(Y/N)");
gets(tmp);
} while (tmp[0]=='Y' || tmp[0]=='y');
}
void Output(struct Node *Head)//没问题
{
struct Node *p;
p = Head;
printf("全部学生信息如下:\n");
while (p!=NULL)
{
printf("%15s%15s%10d\n", p->Stu.No, p->Stu.Name, p->Stu.Age);
p = p->Next;
}
}
8 个解决方案
#1
你原来的代码有点问题,帮你改了一下。。
#include <stdio.h>
#include <stdlib.h>
struct Student
{
char No[11];
char Name[11];
int Age;
};
struct Node
{
struct Student Stu;
struct Node *Next;
};
void CreateList(struct Node *&Head);
void Output(struct Node *Head);
int main(void)
{
/*********Found************/
struct Node *Head = NULL;
CreateList(Head);
Output(Head);
return 0;
}
void CreateList(struct Node *&Head)
{
int i = 0;
char tmp[10];
do
{
struct Node *tt;
tt = (struct Node*)malloc(sizeof(struct Node));
printf("请输入学生的学号:");
gets(tt->Stu.No);
printf("请输入学生的姓名:");
gets(tt->Stu.Name);
printf("请输入学生的年龄:");
gets(tmp);
tt->Stu.Age = atoi(tmp);
i++;
if(i==1){
tt->Next = NULL;//第一个节点
}else{
tt->Next = Head;
}
Head = tt;
printf("是否继续添加节点?(Y/N)");
gets(tmp);
} while (tmp[0]=='Y' || tmp[0]=='y');
}
void Output(struct Node *Head)//没问题
{
struct Node *p;
p = Head;
printf("全部学生信息如下:\n");
while (p!=NULL)
{
printf("%15s%15s%10d\n", p->Stu.No, p->Stu.Name, p->Stu.Age);
p = p->Next;
}
}
#2
还是不对,会报错
#3
#include <stdio.h>
#include <stdlib.h>
struct Student
{
char No[11];
char Name[11];
int Age;
};
struct Node
{
struct Student Stu;
struct Node *Next;
};
void CreateList(struct Node *Head);
void Output(struct Node *Head);
int main(void)
{
/*********Found************/
struct Node *Head;
Head = (struct Node *)malloc(sizeof(struct Node));
Head->Next = NULL;
CreateList(Head);
Output(Head);
return 0;
}
void CreateList(struct Node *Head)
{
int i = 0;
char tmp[10];
do
{
struct Node *tt;
tt = (struct Node*)malloc(sizeof(struct Node));
printf("请输入学生的学号:");
gets(tt->Stu.No);
printf("请输入学生的姓名:");
gets(tt->Stu.Name);
printf("请输入学生的年龄:");
gets(tmp);
tt->Stu.Age = atoi(tmp);
tt->Next = Head->Next;//将新创建的节点插到头结点的后面
/*********Found************/
i++;
if(i==1)
Head->Next = tt;
else
{
Head->Next=tt;
}
printf("是否继续添加节点?(Y/N)");
gets(tmp);
} while (tmp[0]=='Y' || tmp[0]=='y');
}
void Output(struct Node *Head)//没问题
{
struct Node *p;
p = Head->Next;
printf("全部学生信息如下:\n");
while (p!=NULL)
{
printf("%15s%15s%10d\n", p->Stu.No, p->Stu.Name, p->Stu.Age);
p = p->Next;
}
}
在楼主的基础之上改的,楼主这里要CreateList函数注意一个问题,不能改变Head变量的值,要是要改变的话,就得传Head变量的地址进去。
#4
void CreateList(struct Node *Head);用二维指针或引用
#5
tt->Next = Head->Next;//将新插入的节点放在头结点后面,新节点再指向后面的节点
#6
#include <stdio.h>
#include <stdlib.h>
struct Student
{
char No[11];
char Name[11];
int Age;
};
struct Node
{
struct Student Stu;
struct Node *Next;
};
void CreateList(struct Node **Head);
void Output(struct Node *Head);
int main(void)
{
/*********Found************/
struct Node *Head;
Head = (struct Node *)malloc(sizeof(struct Node));
Head->Next = NULL;
CreateList(&Head);
Output(Head);
return 0;
}
void CreateList(struct Node **Head)
{
int i = 0;
char tmp[10];
do
{
struct Node *tt;
tt = (struct Node*)malloc(sizeof(struct Node));
printf("请输入学生的学号:");
gets(tt->Stu.No);
printf("请输入学生的姓名:");
gets(tt->Stu.Name);
printf("请输入学生的年龄:");
gets(tmp);
tt->Stu.Age = atoi(tmp);
tt->Next = (*Head)->Next;//这句没看懂
/*********Found************/
i++;
if(i==1)
*Head = tt;
else
{
(*Head)->Next = tt;
}
printf("是否继续添加节点?(Y/N)");
gets(tmp);
} while (tmp[0]=='Y' || tmp[0]=='y');
}
void Output(struct Node *Head)//没问题
{
struct Node *p;
p = Head;
printf("全部学生信息如下:\n");
while (p!=NULL)
{
printf("%15s%15s%10d\n", p->Stu.No, p->Stu.Name, p->Stu.Age);
p = p->Next;
}
}
简单改了一下你的代码,你需要传二重指针,才能获得head节点。另一种方法是将head头节点定义成全局的。
#7
另外建议你使用fgets代替gets函数。
#8
函数内创建的对象在函数执行完毕后会自动销毁,返回的对象只是一个副本。
具体到你的问题,
1. 在CreateList函数内创建的tt节点指针,仅在该函数内部有效。head指针在函数外创建,所以Output函数可以获得头节点,但head->next在CreateList函数执行完毕后已成为野指针。
2. 头节点没有完整初始化
故该程序在打印链表时,第一会打印不出所需内容,第二会出现段错误。
ps,仅针对这段程序而言,使用fgets或gets均问题不大。fgets仅在复制大段数据时才会体现出速度优势。
具体到你的问题,
1. 在CreateList函数内创建的tt节点指针,仅在该函数内部有效。head指针在函数外创建,所以Output函数可以获得头节点,但head->next在CreateList函数执行完毕后已成为野指针。
2. 头节点没有完整初始化
故该程序在打印链表时,第一会打印不出所需内容,第二会出现段错误。
ps,仅针对这段程序而言,使用fgets或gets均问题不大。fgets仅在复制大段数据时才会体现出速度优势。
#1
你原来的代码有点问题,帮你改了一下。。
#include <stdio.h>
#include <stdlib.h>
struct Student
{
char No[11];
char Name[11];
int Age;
};
struct Node
{
struct Student Stu;
struct Node *Next;
};
void CreateList(struct Node *&Head);
void Output(struct Node *Head);
int main(void)
{
/*********Found************/
struct Node *Head = NULL;
CreateList(Head);
Output(Head);
return 0;
}
void CreateList(struct Node *&Head)
{
int i = 0;
char tmp[10];
do
{
struct Node *tt;
tt = (struct Node*)malloc(sizeof(struct Node));
printf("请输入学生的学号:");
gets(tt->Stu.No);
printf("请输入学生的姓名:");
gets(tt->Stu.Name);
printf("请输入学生的年龄:");
gets(tmp);
tt->Stu.Age = atoi(tmp);
i++;
if(i==1){
tt->Next = NULL;//第一个节点
}else{
tt->Next = Head;
}
Head = tt;
printf("是否继续添加节点?(Y/N)");
gets(tmp);
} while (tmp[0]=='Y' || tmp[0]=='y');
}
void Output(struct Node *Head)//没问题
{
struct Node *p;
p = Head;
printf("全部学生信息如下:\n");
while (p!=NULL)
{
printf("%15s%15s%10d\n", p->Stu.No, p->Stu.Name, p->Stu.Age);
p = p->Next;
}
}
#2
还是不对,会报错
#3
#include <stdio.h>
#include <stdlib.h>
struct Student
{
char No[11];
char Name[11];
int Age;
};
struct Node
{
struct Student Stu;
struct Node *Next;
};
void CreateList(struct Node *Head);
void Output(struct Node *Head);
int main(void)
{
/*********Found************/
struct Node *Head;
Head = (struct Node *)malloc(sizeof(struct Node));
Head->Next = NULL;
CreateList(Head);
Output(Head);
return 0;
}
void CreateList(struct Node *Head)
{
int i = 0;
char tmp[10];
do
{
struct Node *tt;
tt = (struct Node*)malloc(sizeof(struct Node));
printf("请输入学生的学号:");
gets(tt->Stu.No);
printf("请输入学生的姓名:");
gets(tt->Stu.Name);
printf("请输入学生的年龄:");
gets(tmp);
tt->Stu.Age = atoi(tmp);
tt->Next = Head->Next;//将新创建的节点插到头结点的后面
/*********Found************/
i++;
if(i==1)
Head->Next = tt;
else
{
Head->Next=tt;
}
printf("是否继续添加节点?(Y/N)");
gets(tmp);
} while (tmp[0]=='Y' || tmp[0]=='y');
}
void Output(struct Node *Head)//没问题
{
struct Node *p;
p = Head->Next;
printf("全部学生信息如下:\n");
while (p!=NULL)
{
printf("%15s%15s%10d\n", p->Stu.No, p->Stu.Name, p->Stu.Age);
p = p->Next;
}
}
在楼主的基础之上改的,楼主这里要CreateList函数注意一个问题,不能改变Head变量的值,要是要改变的话,就得传Head变量的地址进去。
#4
void CreateList(struct Node *Head);用二维指针或引用
#5
tt->Next = Head->Next;//将新插入的节点放在头结点后面,新节点再指向后面的节点
#6
#include <stdio.h>
#include <stdlib.h>
struct Student
{
char No[11];
char Name[11];
int Age;
};
struct Node
{
struct Student Stu;
struct Node *Next;
};
void CreateList(struct Node **Head);
void Output(struct Node *Head);
int main(void)
{
/*********Found************/
struct Node *Head;
Head = (struct Node *)malloc(sizeof(struct Node));
Head->Next = NULL;
CreateList(&Head);
Output(Head);
return 0;
}
void CreateList(struct Node **Head)
{
int i = 0;
char tmp[10];
do
{
struct Node *tt;
tt = (struct Node*)malloc(sizeof(struct Node));
printf("请输入学生的学号:");
gets(tt->Stu.No);
printf("请输入学生的姓名:");
gets(tt->Stu.Name);
printf("请输入学生的年龄:");
gets(tmp);
tt->Stu.Age = atoi(tmp);
tt->Next = (*Head)->Next;//这句没看懂
/*********Found************/
i++;
if(i==1)
*Head = tt;
else
{
(*Head)->Next = tt;
}
printf("是否继续添加节点?(Y/N)");
gets(tmp);
} while (tmp[0]=='Y' || tmp[0]=='y');
}
void Output(struct Node *Head)//没问题
{
struct Node *p;
p = Head;
printf("全部学生信息如下:\n");
while (p!=NULL)
{
printf("%15s%15s%10d\n", p->Stu.No, p->Stu.Name, p->Stu.Age);
p = p->Next;
}
}
简单改了一下你的代码,你需要传二重指针,才能获得head节点。另一种方法是将head头节点定义成全局的。
#7
另外建议你使用fgets代替gets函数。
#8
函数内创建的对象在函数执行完毕后会自动销毁,返回的对象只是一个副本。
具体到你的问题,
1. 在CreateList函数内创建的tt节点指针,仅在该函数内部有效。head指针在函数外创建,所以Output函数可以获得头节点,但head->next在CreateList函数执行完毕后已成为野指针。
2. 头节点没有完整初始化
故该程序在打印链表时,第一会打印不出所需内容,第二会出现段错误。
ps,仅针对这段程序而言,使用fgets或gets均问题不大。fgets仅在复制大段数据时才会体现出速度优势。
具体到你的问题,
1. 在CreateList函数内创建的tt节点指针,仅在该函数内部有效。head指针在函数外创建,所以Output函数可以获得头节点,但head->next在CreateList函数执行完毕后已成为野指针。
2. 头节点没有完整初始化
故该程序在打印链表时,第一会打印不出所需内容,第二会出现段错误。
ps,仅针对这段程序而言,使用fgets或gets均问题不大。fgets仅在复制大段数据时才会体现出速度优势。