读书人

如何向单链表的节点中传入多个参数?

发布时间: 2012-02-14 19:19:19 作者: rapoo

怎么向单链表的节点中传入多个参数??
我们老师布置了一个用单链表实现学籍管理系统的作业。
我现在知道应该怎么实现链表的操作(创建、查找、删除节点),但是不知道应该怎么样把学生信息中的十几个参数传入节点(每个节点存储一个学生的信息)。哪位好心人能帮小弟解决一下。
作业具体要求如下:
编写一个学生管理系统,每个学生应该包含如下信息:
地址,出生日期,学科成绩(语文,英语,数学,物理),个人信息(姓名,性别,民族,国籍,学历),联系方式(手机,家庭电话,学校电话)
可以任意添加学生,删除学生,编辑学生信息,并且具有保存和读入学生信息的功能。
实现步骤:
①:使用单链表实现本程序要求,单链表每个节点存储一个学生的信息。
②:创建一个链表类(List),链表类可实现如下功能:
创建链表,插入节点,删除节点,编辑节点,显示节点,保存链表信息等功能,读入数据文件等功能(详细说明请查看源代码)。
③: 创建一个操作类(Operater),操作类实现如下功能:
显示菜单,操作链表。

就是怎么把“地址,出生日期,学科成绩(语文,英语,数学,物理),个人信息(姓名,性别,民族,国籍,学历),联系方式(手机,家庭电话,学校电话)”这些传入节点中。




[解决办法]
比如这个:

设计一个程序,统计一个班(最多有35人)的学生成绩,要求能实现如下四个功能:
(1)由键盘输入每个学生的学号和四门课程的成绩
(2)计算每个学生的平均成绩和总成绩
(3)按总成绩从高到低排名,并按名次输出每个学生的情况,包括:学号,各科成绩,平均成绩,总成绩,排名
(4)根据要求输出某门课程(由键盘输入课程号)成绩在90分(含90分)以上且总分在前5名的学生情况

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 35
typedef struct tagSTU
{
char id[28];
float scores[4];
float avg;
float tot;
}STU;
STU* createSTU()
{
STU *stu=(STU*)malloc(sizeof(STU));
printf( "请输入ID及成绩(以空格分开)\n ");
scanf( "%s%f%f%f%f ",stu-> id,&stu-> scores[0],&stu-> scores[1],\
&stu-> scores[2],&stu-> scores[3]);
stu-> tot=stu-> scores[0]+stu-> scores[1]+stu-> scores[2]+stu-> scores[3];
stu-> avg=stu-> tot/4;
return stu;
}
void Equal(STU *a,STU *b)
{
a-> scores[0]=b-> scores[0];
a-> scores[1]=b-> scores[1];
a-> scores[2]=b-> scores[2];
a-> scores[3]=b-> scores[3];
strcpy(a-> id,b-> id);
a-> avg=b-> avg;
a-> tot=b-> tot;
}
void Sort(STU *addr,int num)
{
int i,j;
STU temp;
for(i=num-1;i> 0;i--)
{
for(j=0;j <i;j++)
{
if(addr[j].tot <addr[j+1].tot)
{
Equal(&temp,&addr[j]);
Equal(&addr[j],&addr[j+1]);
Equal(&addr[j+1],&temp);
}
}
}
}

void Show(STU *addr,int num)
{
int i=0;
while(i <num)
{
printf( "id:%s\n%.2f %.2f %.2f %.2f %.2f %.2f\n ",addr[i].id,addr[i].scores[0],\
addr[i].scores[1],addr[i].scores[2],addr[i].scores[3],addr[i].avg,addr[i].tot);
i++;
}
}

void Showsub(STU *addr,int num,int s)
{
int i=0;
while(i <num&&i <5)
{
if(addr[i].scores[s]> 89)
printf( "id:%s\n%.2f %.2f %.2f %.2f %.2f %.2f\n ",addr[i].id,addr[i].scores[0],\
addr[i].scores[1],addr[i].scores[2],addr[i].scores[3],addr[i].avg,addr[i].tot);
i++;
}
}
int main()
{
int num,i=0,s=0;
STU stu[MAX];
printf( "请输入人数( <35)\n ");
scanf( "%d ",&num);
if(num <1||num> MAX)return -1;
while(i <num)
{
stu[i]=*createSTU();
i++;
}
Sort(stu,num);
Show(stu,num);
printf( "输入课号(0-3)\n ");
scanf( "%d ",&s);
if(s <0||s> 3)return -1;
Showsub(stu,num,s);
system( "PAUSE ");


return 0;
}
[解决办法]
#include <stdio.h>
#include <string.h>
struct Student
{
char cId[20];
char cName[20];
int nAge;
int nScore;
Student* pNext;
};
Student* CreateLink(Student* pHead)
{
while(1)
{
Student* pNew = new Student;

printf( "请输入学号:(exit退出)\n ");
fflush(stdin);
scanf( "%s ",pNew-> cId);
if(strcmp(pNew-> cId , "exit ") == 0)
{
break;
}

printf( "请输入姓名:\n ");
fflush(stdin);
scanf( "%s ", pNew-> cName);

printf( "请输入年龄:\n ");
scanf( "%d ", &pNew-> nAge);

printf( "请输入分数:\n ");
scanf( "%d ", &pNew-> nScore);

pNew-> pNext = NULL;

if( NULL == pHead)
{
pHead = pNew;
}
else
{
Student* pTemp = pHead;

while(pTemp-> pNext != NULL)
{
pTemp = pTemp-> pNext ;
}
pTemp-> pNext = pNew;
}
}
return pHead;
}

Student* Delete(Student* pHead)
{
char cId[20];
printf( "请输入要删除的学号: ");
fflush(stdin);
scanf( "%s ", cId);

if(NULL == pHead)
{
printf( "没有学生\n ");
}
else
{
Student* pTemp = pHead;
Student* pFront = NULL;

while(pTemp-> pNext != NULL && strcmp(pTemp-> cId ,cId) != 0)
{
pFront = pTemp;
pTemp = pTemp-> pNext;
}
if(strcmp(pTemp-> cId ,cId) == 0)
{
if(pTemp == pHead)
{
pHead = pHead-> pNext;
}
else
{
pFront-> pNext = pTemp-> pNext;
}
delete pTemp;
printf( "成功删除\n ");
}
else
{
printf( "不存在这个学生\n ");
}
}
return pHead;
}

void Search(Student* pHead)
{
if(NULL == pHead)
{
printf( "没有任何学生\n ");
}
else
{
char cId[20];
printf( "请输入你要查找的学生学号:\n ");
fflush(stdin);
scanf( "%s ", cId);

Student* pTemp = pHead;
while(pTemp != NULL)
{
if(strcmp(pTemp-> cId ,cId) == 0)
{
printf( "学号:%s姓名:%s年龄:%d分数:%d\n ",
pTemp-> cId ,pTemp-> cName ,pTemp-> nAge ,pTemp-> nScore );
break;
}
pTemp = pTemp-> pNext;
}

if(pTemp == NULL)
{
printf( "没有这个学生\n ");
}
}
}

void Modify(Student* pHead)
{
if(NULL == pHead)
{
printf( "没有任何学生\n ");
}
else
{
char cId[20];
printf( "请输入你要修改的学生学号:\n ");
fflush(stdin);
scanf( "%s ", cId);

Student* pTemp = pHead;
while(pTemp != NULL)
{
if(strcmp(pTemp-> cId ,cId) == 0)
{
printf( "学号:%s姓名:%s年龄:%d分数:%d\n ",
pTemp-> cId ,pTemp-> cName ,pTemp-> nAge ,pTemp-> nScore );

printf( "请输入要修改的姓名\n ");
fflush(stdin);
scanf( "%s ", pTemp-> cName);

printf( "请输入要修改的年龄\n ");
scanf( "%d ", & pTemp-> nAge);

printf( "请输入要修改的分数\n ");
scanf( "%d ", & pTemp-> nScore);


break;
}
pTemp = pTemp-> pNext;
}

if(pTemp == NULL)
{
printf( "没有这个学生\n ");
}
}
}

void Menu(void)
{
printf( "1添加学生\n2删除学生\n3按照学号查找学生\n4修改学生信息\n ");
}
int main()
{
Student* pHead = NULL;
while(1)

{
Menu();

int nChoice = 0;
scanf( "%d ", &nChoice);

switch(nChoice)
{
case 1:
pHead = CreateLink(pHead);
break;
case 2:
pHead = Delete(pHead);
break;
case 3:
Search(pHead);
break;
case 4:
Modify(pHead);
break;
default: printf( "输入错误请重新输入\n ");
}
}
return 0;
}

[解决办法]
这是个面向对象的操作问题,用类来表示会更好点。链表的建立用结构,结构里边放的是类指针用以建立链表。

class student //学生类的建立
{
private:
string address;//地址
string birthday;//出生生日
smallint grade_chiness;//语文成绩
smallint grade_chiness;//英语成绩
...
public:
get_address()
{return &address;}//返回地址
get_birthday()
{return &birthday;}//返回生日
...
set_address(string add)
{strcpy(address,add);}//设置地址
...
};

struct list
{
student*s; //学生类的使用,该节点记录一学生信息
list*next; //自身链表的指针,用以指向下一节点地址
};

如果是双链表就再加个list*last,我喜欢用双链表,因为无论如何做错了也总有办法回头,否则出错的话只能从链表头再计算一遍了

读书人网 >C++

热点推荐