//原作者:独孤小梦,由StarWing修改于2008-07-28
#define _STARWING_ //去掉本行,则是独孤小梦的代码
#include"stdio.h"
#include <stdlib.h>
#include <string.h> //for memset
#ifdef _STARWING_
//一个宏,用于标明你认为一定成立的事实,我们叫它“断言”
//#include <assert.h>
#define Assert //assert
#else
//#include"malloc.h"
//#define NULL 0
// warning: "NULL" redefined
#endif
#ifndef _STARWING_
#define LEN sizeof(struct student)
struct student
{
int xuehao;
char xingming[10];
int yuwen;
int shuxue;
int yingyu;
int wuli;
int huaxue;
int zhengzhi;
int dili;
int lishi;
int shengwu;
struct student *next;
};
#else
//这不是一个好办法,如果你要增加一门课,修改输入输出会很麻烦,而且这么多名字,并不好管理。
//你可以为这个结构体专门写一个填充函数,把链表和数据分开管理
//这里给出一个稍微好一点的解决方法,注意使用英文的名字,比较好辨认
#define NAME_LEN 10
#define SCORE_COUNT 9
struct Student
{
int id,score[SCORE_COUNT];
char name[NAME_LEN];
};
struct StuList
{
struct Student stu;
struct StuList *next;
};
#endif
#ifndef _STARWING_
int n;
struct student *creat(void)
{
struct student *head;
struct student *p1,*p2;
n=0;
p1=p2=(struct student *)malloc(LEN);
//*开辟一个新单元*//
scanf("%ld,%s,%d,%d,%d,%d,%d,%d,%d,%d,%d",&p1->xuehao,&p1->xingming,&p1->yuwen,&p1->shuxue,&p1->yingyu,&p1->wuli,&p1->huaxue,&p1->zhengzhi,&p1->dili,&p1->lishi,&p1->shengwu);
head=NULL;
while (&p1->xuehao!=0)
{
n=n+1;
if (n==1)
head=p1;
else
p2->next=p1;
p2=p1;
p1=(struct student *)malloc(LEN);
scanf("%ld,%s,%d,%d,%d,%d,%d,%d,%d,%d,%d",&p1->xuehao,&p1->xingming,&p1->yuwen,&p1->shuxue,&p1->yingyu,&p1->wuli,&p1->huaxue,&p1->zhengzhi,&p1->dili,&p1->lishi,&p1->shengwu);
}
p2->next=NULL;
return(head);
}
void print(struct student *head)
{
struct student *p;
printf("adfadf%d\n",n);
p=head;
if (head!=NULL)
do
{
printf("%ld,%s,%d,%d,%d,%d,%d,%d,%d,%d,%d",p->xuehao,p->xingming,p->yuwen,p->shuxue,p->yingyu,p->wuli,p->huaxue,p->zhengzhi,p->dili,p->lishi,p->shengwu);
p=p->next;
}
while (p!=NULL);
}
int main() //int main,而不是void main
{
struct student *head,stu;
long del_num;
printf("建立\n");
head=creat();
print(head);
return 0; // 注意是int main
}
#else
//你上面有两个函数,完成了“创建”和“打印”,这样不安全,至少需要有两方面的函数,创建和销毁。
//要注意这种思想。
//注意下面每个函数,都对参数进行了检查
//这个函数用于填充Student,(有一个小小的习惯,就是自己写的函数首字母大写,而库函数全小写,这样容易分辨)
void StuFill(struct Student* pstu)
{
int i;
Assert(pstu != NULL);
memset(pstu,0,sizeof(struct Student));
printf("Input Student's ID:");
scanf("%d",&pstu->id);
printf("Input Student's name:");
scanf("%10s",pstu->name);
printf("Input %d scores of %s:\n",SCORE_COUNT,pstu->name);
for (i=0;i<SCORE_COUNT;++i)
scanf("%d",&pstu->score[i]);
}
//打印一个学生结构的内容
void StuPrint(struct Student* pstu)
{
int i;
Assert(pstu != NULL);
printf("ID:%d Name:%s\n",pstu->id,pstu->name);
for (i=0;i<SCORE_COUNT;++i)
printf("%3d%c",pstu->score[i],(i+1)%5?' ':'\n');
printf("\n");
}
//在适当的位置插入一个新的元素
struct StuList* LinkInsert(struct StuList** ppnode)
{
struct StuList *next= *ppnode;
Assert(ppnode != NULL);
*ppnode=(struct StuList*)malloc(sizeof(struct StuList));
(*ppnode)->next=next;
return *ppnode;
}
//释放掉所有的节点
void LinkFree(struct StuList* pnode)
{
Assert(pnode != NULL);
while (pnode)
{
struct StuList* next=pnode->next;
free(pnode);
pnode=next;
}
}
//使用上面四个函数
int main()
{
int i,n;
struct StuList* link=NULL, *pt;
printf("请输入学生数目:");
scanf("%d",&n);
for (i=0 ; i<n ; i++)
StuFill(&LinkInsert(&link)->stu);
for (pt=link ; pt!=NULL ; pt=pt->next)
StuPrint(&pt->stu);
LinkFree(link);
return 0;
}
#endif
稍微修改了一下下…………