标题:关于合并a,b两个链表的一个问题
只看楼主
魔城侠客
Rank: 1
等 级:新手上路
帖 子:200
专家分:0
注 册:2006-4-4
结帖率:50%
 问题点数:0 回复次数:3 
关于合并a,b两个链表的一个问题

题目是将a,b两个链表合并并按升序排列,a,b链表的结点都包含学号,分数。
现在编程如下:
#include "stdio.h"
struct student
{

int number;
int score;
struct student *next;
struct student *before; //由于要排序,所以要建立双向链表
}*Head_A,*Rear_A,*Head_B,*Rear_B,*p,*p1;

void main()
{
int i,j,Length_A,Length_B,Length_Z;
printf("此程序是把a,b两个链表合并并按学号升序排列.\n");
printf("a,b两个链表中的结点包括学号、成绩。\n");
printf("先分别输入两个链表的长度.\n");

printf("请输入a链表的长度:"); //输入链表a
scanf("%d",&Length_A);

printf("请输入a链表结点中的学号和成绩\n");
printf(" 学号 成绩\n");
for(i=1;i<=Length_A;i++)
{
p=(struct student*)malloc(sizeof(struct student));
printf("请输入第%d个同学的学号和成绩:",i);
scanf("%d%d",&p->number,&p->score);
p->next=NULL;
if(i==1) {Head_A=p;Rear_A=p;p->before=NULL;}
else {p->before=Rear_A;Rear_A->next=p;Rear_A=p;}
}
printf("现在将输出a链表.\n"); //输出链表a
printf(" 学号 成绩\n");
p=Head_A;
for(i=1;i<=Length_A;i++)
{
printf("第%d个同学:%d %d\n",i,p->number,p->score);
p=p->next;
}
printf("请输入b链表的长度:"); //输入链表b
scanf("%d",&Length_B);

printf("请输入b链表结点中的学号和成绩\n");
printf(" 学号 成绩\n");
for(i=1;i<=Length_B;i++)
{
printf("第%d个同学的学号和成绩:",i);
scanf("%d%d",&p->number,&p->score);
p->next=NULL;
if(i==1) {Head_B=p;Rear_B=p;}
else {p->before=Rear_B;Rear_B->next=p;Rear_B=p;}
}
printf("现在将输出b链表.\n"); //输出链表b
printf(" 学号 成绩\n");
p=Head_A;
for(i=1;i<=Length_B;i++)
{
printf("第%d位同学的学号和成绩:%d %d\n",i,p->number,p->score);
p=p->next;
}
printf("现在将a,b链表进行合并\n"); //合并两链表
Rear_A->next=Head_B; //将b链表的头指针地址赋值给a链表的尾部
Rear_A=Head_B;
printf("现在输出合并后的新链表\n"); //输出新链表
Length_Z=Length_A+Length_B; //长度变为两链表之和
p=Head_A;

printf(" 学号 成绩\n");
for(i=1;i<=Length_Z;i++)
{
printf("第%d位同学的学号和成绩:%d %d\n",i,p->number,p->score);
p=p->next;
}
p1=(struct student*)malloc(sizeof(struct student));
printf("现在进行排序工作\n");

for(i=1;i<Length_Z;i++)
{ p=Head_A;
p->before=NULL;
p1=p->next;
for(j=1;j<=Length_Z-i;j++)
{
if(p->number>p->next->number)
{
p1=p->next;
p->next=p1->next;
p1->next->before=p1->before;
p1->next=p1->before;
if(j==1) {p->before=p1;Head_A=p1;p1->before=NULL;}
else {p1->before=p->before;p1->before->next=p1;}
p1=p->next;
}
else {p=p1;p1=p1->next;}
}
}
//经过上面的程序,已经把顺序排好
printf("现在将输出已按升序排列的新链表.\n");
printf(" 学号 成绩\n");
for(i=1;i<=Length_Z;i++)
{
printf("第%d位同学的学号和成绩:%d %d\n",i,p->number,p->score);
p=p->next;
}



经编译后出现一个error,fatel error C1004:unexpected end of file found
这是哪里错了呢?????
我是用turbo C/C++for windows集成实验与学习环境编程的

搜索更多相关主题的帖子: 链表 student 学号 int Length 
2006-11-02 10:23
unicorn
Rank: 4
等 级:贵宾
威 望:14
帖 子:1066
专家分:0
注 册:2005-10-25
得分:0 
error,fatel error C1004:unexpected end of file found

意思是主函数大括号不匹配 即 main() { }

unicorn-h.spaces. ◇◆ sava-scratch.spaces.  noh enol ! pue pu!w hw u! shemle aq ll!m noh 
2006-11-02 10:26
魔城侠客
Rank: 1
等 级:新手上路
帖 子:200
专家分:0
注 册:2006-4-4
得分:0 
晕,在最后居然少了个},呵呵
非常感谢啊
现在可以了

West and east,home is best……
2006-11-02 10:37
wyzn12
Rank: 1
等 级:新手上路
帖 子:129
专家分:0
注 册:2006-10-28
得分:0 

这个用单链表

#include<malloc.h>
#define LEN sizeof(STU)
#define NULL 0
typedef struct S
{
long num;
int score;
struct S *next;
}STU;
int n;
STU *creat(void)
{
STU *head;
STU *p1,*p2;
n=0;
p1=p2=(STU *)malloc(LEN);
scanf("%ld%d",&p1->num,&p1->score);
head=NULL;
while(p1->num!=NULL)
{
n=n+1;
if(n==1)head=p1;
else p2->next=p1;
p2=p1;
p1=(STU *)malloc(LEN);
scanf("%ld%d",&p1->num,&p1->score);
}
p2->next=NULL;
return(head);
}
STU *sort(STU *head)/*先从原来的链表中拆出一个结点,放到另一空链表中,*/
/*再从原来链表拆出第二个用插入排序的方法放到新链表中,直到拆完旧链表*/
{
STU *p,*head1,*p1,*p2,*pre;
p=head;/*p指向原待排序的链表*/
head1=NULL;/*新链表的头指针*/
p2=NULL;/*新链表的表尾*/
while(p!=NULL)
{
pre=p->next;/*pre取被拆后的原链表的首结点,便于赋值于p顺序拆原链表的结点*/
p->next=NULL;/*拆掉一个结点*/
if(head1==NULL)head1=p;/*如果拆的是第一个结点,则将p赋于新链表的头指针head1*/
else
{
p1=head1;/*将head1赋于p1*/
p2=NULL;/*新链表的表尾为空*/
while((p1!=NULL)&&(p->num>p1->num))/*以下是插入算法,没到找插入的位置,后移一结点*/
{
p2=p1;
p1=p1->next;
}
/*当找到插入位置后,将从原链表拆出来的结点插入新链表中*/
if(p2==NULL)/*如果插入位置是在新链表的表头*/
{
p->next=head1;
head1=p;
}
else
{
p->next=p1;
p2->next=p;
}
}
p=pre;/*将被拆后的原链表的第一个结点赋予p,进行下一轮循环插入*/
}
return head1;
}
main()
{
STU *p,*head1,*head2;
printf("\nInput data1:\n");
head1=creat();
printf("\nInput data2:\n");
head2=creat();
p=head1;
if(head1!=NULL&&head1->next==NULL)head1->next=head2;
else if(head1!=NULL)
{
do
{
p=p->next;
}while(p->next!=NULL);
p->next=head2;
}
head1=sort(head1);
p=head1;
printf("after sorted:\n");
printf("output data:\n");
printf("num score\n");
if(head1!=NULL)
do
{
printf("%3ld%8d\n",p->num,p->score);
p=p->next;
}while(p!=NULL);
getch();
}


新王登基,血流成河!
2006-11-02 13:01



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-100281-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.275570 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved