#include<malloc.h>
#define LEN sizeof(struct STUDENT)
//定义结构体
struct STUDENT
{
char name[20];
char gender;
int number;
int age,math,english,clanguage,total;
struct STUDENT *next;
};
typedef struct STUDENT STU;
//各种函数
void display_menu()
{
printf("**********************************************\n");
printf("* 请选择功能 *\n");
printf("* *\n");
printf("* 1.输入学生信息 *\n");
printf("* 2.输出学生信息 *\n");
printf("* *\n");
printf("**********************************************\n");
}
//创建链表函数
STU *creatlist(void)
{
STU *head=NULL;
STU *p1,*p2;
int n=0;
while (1)
{
printf("输入0退出\n");
n++;
p1=p2=(STU*)malloc(LEN);
if(n==1) head=p1;
else p2->next=p1;
p2=p1;
printf("\输入第%d学生信息:\n",n);
printf("请输入学号\n");
scanf("%d",&p1->number);
if(p1->number==0)break;
fflush(stdin);
printf("请输入姓名\n");
gets(p1->name);
fflush(stdin);
printf("请输出年龄\n");
scanf("%d",&p1->age);
fflush(stdin);
printf("请选择性别 F/M\n");
do
{
p1->gender=getchar();
while(getchar()!='\n');
if(p1->gender!='M'&& p1->gender!='F')
printf("输入错误,请重新输入\n");
}while(p1->gender!='M'&& p1->gender!='F');
printf("请输入高数成绩\n");
scanf("%d",&p1->math);
fflush(stdin);
printf("请输入英语成绩\n");
scanf("%d",&p1->english);
fflush(stdin);
printf("请输入C语言成绩\n");
scanf("%d",&p1->clanguage);
fflush(stdin);
}
p2->next=NULL;
free(p1);
return head;
}
//输出链表函数
void outputlist(STU *head)
{
STU *p;
p=head;
if(p==NULL)printf("无数据\n");
while(p->next!=NULL)
{
p->total=p->math+p->english+p->clanguage;
printf("------------------------------------------------------------\n");
printf("| 学号 | 姓名 | 性别 | 年龄 | C语言 | 英语 | 高数 | 总分 |\n");
printf("------------------------------------------------------------\n");
printf("|%d | %s | %c |%d | %d | %d | %d | %d |\n",p->number,p->name,p->gender,p->age,p->math,p->english,p->clanguage,p->total);
p=p->next;
}
}
//函数声明
void display_menu();
STU *creatlist(void);
void outputlist(STU *head);
//主函数
int main()
{
int choose,number;
STU *head=NULL,*p0; //让head初始值为0
do
{
display_menu();
scanf("%d",&choose);
switch(choose)
{
case 1:
{
head=creatlist();
system("cls");
system("pause");
}break;
case 2:
{
p0=head;
outputlist(p0);
system("pause");
}break;
}
}while(choose!=0);
}
不知道错哪了。。。
6 个解决方案
#1
STU *creatlist(void);
这个在返回前怎么就用free()了,光有返回值怎么向现有链表添加数据啊。
void outputlist(STU *head);
这个貌似最后一个记录没打印吧。
建议楼主先学习下链表的基本操作。
#2
还是不懂哪错了诶。
#3
lZ的创建链表有问题,不是输出的问题
给你一段c++的
LinkList CreateList()
{
int i, n, j;
cout<<"Input data number:";
cin>>n;
LinkList q, p, head;
head = new LNode;
head->next = NULL;
q = head;
for (i = 0; i < n; i++)
{
p = new LNode;
cout<<"Input Information:"<<endl<<"Sno";
cin>>p->sno;
cout<<"name:";
cin>>p->name;
for (j=0; j<3; j++)
{
cout<<"Score ["<<j<<"]";
cin>>p->score[j];
}
p->next = NULL;
q->next = p;
q = p;
}
return (head);
}
给你一段c++的
#4
顶---
#5
p1=p2=(STU*)malloc(LEN);
if(n==1) head=p1;
else p2->next=p1;
p2=p1;
楼主,我有一个疑问,当n!=1时,p1=p2,p2->next=p1,岂不是p1->next=p1?
楼主你想要干什么呢?
#6
你的程序中STU *creatlist(void);和void outputlist(STU *head);这两个函数都有问题,我已经帮你改好了,错误用注释标出了,你自己再看一下吧。
#include<stdio.h>
#include<malloc.h>
#include<windows.h>
#define LEN sizeof(struct STUDENT)
//定义结构体
struct STUDENT
{
char name[20];
char gender;
int number;
int age,math,english,clanguage,total;
struct STUDENT *next;
};
typedef struct STUDENT STU;
//各种函数
void display_menu()
{
printf("**********************************************\n");
printf("* 请选择功能 *\n");
printf("* *\n");
printf("* 1.输入学生信息 *\n");
printf("* 2.输出学生信息 *\n");
printf("* *\n");
printf("**********************************************\n");
}
//创建链表函数
STU *creatlist(void)
{
STU *head=NULL;
STU *p1,*p2;
int n=0;
while (1)
{
printf("输入0退出\n");
n++;
p1=(STU*)malloc(LEN); //p2不用分配
if(n==1) head=p1;
else p2->next=p1;
printf("\n输入第%d学生信息:\n",n);
printf("请输入学号\n");
scanf("%d",&p1->number);
if(p1->number==0)break;
fflush(stdin);
printf("请输入姓名\n");
gets(p1->name);
fflush(stdin);
printf("请输出年龄\n");
scanf("%d",&p1->age);
fflush(stdin);
printf("请选择性别 F/M\n");
do
{
p1->gender=getchar();
while(getchar()!='\n');
if(p1->gender!='M'&& p1->gender!='F')
printf("输入错误,请重新输入\n");
}while(p1->gender!='M'&& p1->gender!='F');
printf("请输入高数成绩\n");
scanf("%d",&p1->math);
fflush(stdin);
printf("请输入英语成绩\n");
scanf("%d",&p1->english);
fflush(stdin);
printf("请输入C语言成绩\n");
scanf("%d",&p1->clanguage);
fflush(stdin);
p2=p1; //这句放最后
}
p2->next=NULL;
free(p1);
return head;
}
//输出链表函数
void outputlist(STU *head)
{
STU *p;
p=head;
if(p==NULL)printf("无数据\n");
while(p!=NULL) //这里原来为p->next!=NULL
{
p->total=p->math+p->english+p->clanguage;
printf("------------------------------------------------------------\n");
printf("| 学号 | 姓名 | 性别 | 年龄 | C语言 | 英语 | 高数 | 总分 |\n");
printf("------------------------------------------------------------\n");
printf("|%d | %s | %c |%d | %d | %d | %d | %d |\n",p->number,p->name,p->gender,p->age,p->math,p->english,p->clanguage,p->total);
p=p->next;
}
}
//函数声明
void display_menu();
STU *creatlist(void);
void outputlist(STU *head);
//主函数
int main()
{
int choose,number;
STU *head=NULL,*p0; //让head初始值为0
do
{
display_menu();
scanf("%d",&choose);
switch(choose)
{
case 1:
{
head=creatlist();
system("cls");
system("pause");
}break;
case 2:
{
p0=head;
outputlist(p0);
system("pause");
}break;
}
}while(choose!=0);
}
#1
STU *creatlist(void);
这个在返回前怎么就用free()了,光有返回值怎么向现有链表添加数据啊。
void outputlist(STU *head);
这个貌似最后一个记录没打印吧。
建议楼主先学习下链表的基本操作。
#2
还是不懂哪错了诶。
#3
lZ的创建链表有问题,不是输出的问题
给你一段c++的
LinkList CreateList()
{
int i, n, j;
cout<<"Input data number:";
cin>>n;
LinkList q, p, head;
head = new LNode;
head->next = NULL;
q = head;
for (i = 0; i < n; i++)
{
p = new LNode;
cout<<"Input Information:"<<endl<<"Sno";
cin>>p->sno;
cout<<"name:";
cin>>p->name;
for (j=0; j<3; j++)
{
cout<<"Score ["<<j<<"]";
cin>>p->score[j];
}
p->next = NULL;
q->next = p;
q = p;
}
return (head);
}
给你一段c++的
#4
顶---
#5
p1=p2=(STU*)malloc(LEN);
if(n==1) head=p1;
else p2->next=p1;
p2=p1;
楼主,我有一个疑问,当n!=1时,p1=p2,p2->next=p1,岂不是p1->next=p1?
楼主你想要干什么呢?
#6
你的程序中STU *creatlist(void);和void outputlist(STU *head);这两个函数都有问题,我已经帮你改好了,错误用注释标出了,你自己再看一下吧。
#include<stdio.h>
#include<malloc.h>
#include<windows.h>
#define LEN sizeof(struct STUDENT)
//定义结构体
struct STUDENT
{
char name[20];
char gender;
int number;
int age,math,english,clanguage,total;
struct STUDENT *next;
};
typedef struct STUDENT STU;
//各种函数
void display_menu()
{
printf("**********************************************\n");
printf("* 请选择功能 *\n");
printf("* *\n");
printf("* 1.输入学生信息 *\n");
printf("* 2.输出学生信息 *\n");
printf("* *\n");
printf("**********************************************\n");
}
//创建链表函数
STU *creatlist(void)
{
STU *head=NULL;
STU *p1,*p2;
int n=0;
while (1)
{
printf("输入0退出\n");
n++;
p1=(STU*)malloc(LEN); //p2不用分配
if(n==1) head=p1;
else p2->next=p1;
printf("\n输入第%d学生信息:\n",n);
printf("请输入学号\n");
scanf("%d",&p1->number);
if(p1->number==0)break;
fflush(stdin);
printf("请输入姓名\n");
gets(p1->name);
fflush(stdin);
printf("请输出年龄\n");
scanf("%d",&p1->age);
fflush(stdin);
printf("请选择性别 F/M\n");
do
{
p1->gender=getchar();
while(getchar()!='\n');
if(p1->gender!='M'&& p1->gender!='F')
printf("输入错误,请重新输入\n");
}while(p1->gender!='M'&& p1->gender!='F');
printf("请输入高数成绩\n");
scanf("%d",&p1->math);
fflush(stdin);
printf("请输入英语成绩\n");
scanf("%d",&p1->english);
fflush(stdin);
printf("请输入C语言成绩\n");
scanf("%d",&p1->clanguage);
fflush(stdin);
p2=p1; //这句放最后
}
p2->next=NULL;
free(p1);
return head;
}
//输出链表函数
void outputlist(STU *head)
{
STU *p;
p=head;
if(p==NULL)printf("无数据\n");
while(p!=NULL) //这里原来为p->next!=NULL
{
p->total=p->math+p->english+p->clanguage;
printf("------------------------------------------------------------\n");
printf("| 学号 | 姓名 | 性别 | 年龄 | C语言 | 英语 | 高数 | 总分 |\n");
printf("------------------------------------------------------------\n");
printf("|%d | %s | %c |%d | %d | %d | %d | %d |\n",p->number,p->name,p->gender,p->age,p->math,p->english,p->clanguage,p->total);
p=p->next;
}
}
//函数声明
void display_menu();
STU *creatlist(void);
void outputlist(STU *head);
//主函数
int main()
{
int choose,number;
STU *head=NULL,*p0; //让head初始值为0
do
{
display_menu();
scanf("%d",&choose);
switch(choose)
{
case 1:
{
head=creatlist();
system("cls");
system("pause");
}break;
case 2:
{
p0=head;
outputlist(p0);
system("pause");
}break;
}
}while(choose!=0);
}