绯红枫叶吧 关注:2贴子:87
  • 0回复贴,共1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct{
int num; /*学号*/
char name[20]; /*姓名*/
int score; /*成绩*/
}datatype;
typedef struct node{
datatype info;
struct node *next;
}LinkNode, *LinkList;
LinkList initList(); /*置一个空表(带头结点)*/
void createList_tail(LinkList head); /*建一个单链表,尾部插入*/
void Error(char *s);/*自定义错误处理函数*/
void pntList(LinkList head);/*打印单链表*/
int maxList(LinkList head);
//找到head为头指针的单链表的成绩最高者并返回该成绩
void splitList(LinkList head, LinkList odd, LinkList even);
/*
将head为头指针的单链表拆分成奇数链表和偶数链表(没有新结点生成),
odd和even分别为带头结点的奇数链表和偶数链表的头指针,初始为空
*/
int main()
{
int maxS;
LinkList head, odd, even;
//正序读取.txt文件数据,建立学生链表并输出
head =initList();
createList_tail(head);
printf("\n学生链表为:\n");
pntList(head);
//找到单链表的最高成绩并返回该成绩/*
maxS = maxList(head);
printf("\n链表中最高成绩为:%d", maxS);
//拆分单链表为奇数链表和偶数链表
odd =initList();
even =initList();
splitList(head, odd, even);
printf("\n 奇数链表为:\n");
pntList(odd);
printf("\n 偶数链表为:\n");
pntList(even);
}
/*找到单链表的最高成绩并返回该成绩*/
int maxList(LinkList head)
{ //请在此编辑代码
LinkList p;
int maxscr;
p = head->next;
while (p)
{
if (p->info.score < p->next->info.score)
{
maxscr = p->next->info.score;
p = p->next;
}
else
{
p = p->next;
}
}
return maxscr;
}
/*根据链表中的成绩拆分,分成奇数链表和偶数链表,注意用尾插(同序)*/
void splitList(LinkList head, LinkList odd, LinkList even)
{ LinkList p, ro, re;
ro = odd; //奇数链表中所使用的指针,指向链表的尾结点
re = even; //偶数链表中所使用的指针,指向链表的尾结点
while (p)
{
if (p->info.score % 2 == 0)
{
p=(LinkList)malloc(sizeof(LinkNode));
ro->info.score = p->info.score;
p->next=ro->next;
ro->next=p;
ro=p;
}
else
{
p=(LinkList)malloc(sizeof(LinkNode));
re->info.score = p->info.score;
p->next=re->next;
re->next=p;
re=p;
}
}
}
/*置一个空表(带头结点)*/
LinkList initList()
{ LinkList p;
p=(LinkList)malloc(sizeof(LinkNode));
p->next=NULL;
return p;
}
/*正序建一个单链表,尾部插入*/
void createList_tail(LinkList head)
{
FILE *fp;
int xh;
char name[20];
int grade;
LinkList p,rear;
if((fp=fopen("data.txt","r"))==NULL)
{ Error("can not open file !");
return ;
}
rear=head;
while(!feof(fp))
{
fscanf(fp,"%d%s%d", &xh, &name, &grade);
p=(LinkList)malloc(sizeof(LinkNode));
p->info.num=xh;
strcpy(p->info.name, name);
p->info.score=grade;
p->next=NULL;
rear->next=p;
rear=p;
}
fclose(fp);
}
/*输出单链表*/
void pntList(LinkList head)
{
LinkList p;
p=head->next;
while(p!=NULL)
{
printf("%10d: %s %5d\n",p->info.num, p->info.name, p->info.score);
p=p->next;
}
}
/*自定义错误处理函数*/
void Error(char *s)
{
printf("\n %s", s);
exit(1); /*返回OS,该函数定义在stdlib.h中*/
}


1楼2017-03-15 17:21回复