C语言输入两组各十个数据,存入链表并排序输出,最后归并入第三个链表并排序输出
以下是分别存入两组链表并输出但是总有一组链表第一个数据是乱码,求问题所在并给出归并代码#include<stdio.h>#include<malloc.h>#define...
以下是分别存入两组链表并输出但是总有一组链表第一个数据是乱码,求问题所在并给出归并代码
#include<stdio.h>
#include<malloc.h>
#define NULL 0;
struct numb
{ int data;
struct numb *next;
};
struct numb *create()
{ struct numb *head,*s,*p;
int i;
head=s=p=NULL;
p=(struct numb *)malloc(sizeof(struct numb));
printf("please input 10 numbers\n");
for(i=0;i<10;i++)
{ s=(struct numb *)malloc(sizeof(struct numb));
p->next=s;
if(i==0) head=p;
scanf("%d",&p->data);
p=p->next;
if(i==9) p->next=NULL;
};
return (head);
}
void print(struct numb *head)
{ struct numb *current;
int i;
printf("The results are :\n");
current=head;
for(i=0;i<10;i++)
{ printf("%3d\t",*current);
current=current->next;
}
printf("\n");
}
void sort(struct numb *head)
{ struct numb *p,*q;
int temp,i,j;
for(i=0;i<10;i++)
{ p=q=head;
q=q->next;
for(j=0;j<10;j++)
{ if(p->data > q->data)
{ temp=p->data;
p->data=q->data;
q->data=temp; }
p=p->next;
q=q->next;
}
}
}
void main()
{ int *pHead1,*pHead2;
pHead1=create();
pHead2=create();
sort(pHead1);
sort(pHead2);
print(pHead1);
print(pHead2);
getch();
} 展开
#include<stdio.h>
#include<malloc.h>
#define NULL 0;
struct numb
{ int data;
struct numb *next;
};
struct numb *create()
{ struct numb *head,*s,*p;
int i;
head=s=p=NULL;
p=(struct numb *)malloc(sizeof(struct numb));
printf("please input 10 numbers\n");
for(i=0;i<10;i++)
{ s=(struct numb *)malloc(sizeof(struct numb));
p->next=s;
if(i==0) head=p;
scanf("%d",&p->data);
p=p->next;
if(i==9) p->next=NULL;
};
return (head);
}
void print(struct numb *head)
{ struct numb *current;
int i;
printf("The results are :\n");
current=head;
for(i=0;i<10;i++)
{ printf("%3d\t",*current);
current=current->next;
}
printf("\n");
}
void sort(struct numb *head)
{ struct numb *p,*q;
int temp,i,j;
for(i=0;i<10;i++)
{ p=q=head;
q=q->next;
for(j=0;j<10;j++)
{ if(p->data > q->data)
{ temp=p->data;
p->data=q->data;
q->data=temp; }
p=p->next;
q=q->next;
}
}
}
void main()
{ int *pHead1,*pHead2;
pHead1=create();
pHead2=create();
sort(pHead1);
sort(pHead2);
print(pHead1);
print(pHead2);
getch();
} 展开
1个回答
2014-06-11
展开全部
#include<stdio.h>
#include<malloc.h>
//#define NULL 0
//这里有两个问题,1.此处没有 ;号
//2 . 不用定义NULL 为0
//你为啥将一个整型0赋给一个指针呢
//应该将这句注释掉,因为NULL本来
//就代表空指针,不要画蛇添足
struct numb
{
int data;
struct numb *next;
};
struct numb *creat()
{
struct numb *head,*s,*p;
int i;
head=s=p=NULL;
p=(struct numb *)malloc(sizeof(struct numb));
printf("please input 10 numbers\n");
for(i=0;i<10;i++)
{
s=(struct numb *)malloc(sizeof(struct numb));
p->next=s;
if(i==0) head=p;
scanf("%d",&p->data);
p=p->next;
if(i==9) p->next=NULL;
} //此处也没有 ; 号
return head;
}
void print(struct numb *head)
{
struct numb *current;
int i;
printf("The result are:\n");
current=head;
for(i=0;i<10;i++)
{
printf("%3d\t",current->data); //此处注意修改,不是(*current)
current=current->next;
}
printf("\n");
}
void sort(struct numb *head)
{
struct numb *p,*q;
int temp,i,j;
//下面排序的思想是每次让j 循环中的所有元素
//和当前的第i个元素比较,若果比第i个元素小就
//交换第j个和第i个元素,这样是按照从小到大的
//顺序排,从小到大的方法雷同
p=head;
for(i=0;i<9;i++)
{
//p=q=head;
//q=q->next;
q=p;
for(j=i+1;j<10;j++)
{
q=q->next;
if(p->data > q->data)
{
temp=p->data;
p->data=q->data;
q->data=temp;
}
}
p=p->next;
}
//上面的排序方法比较好理解
//你的代码中每次进行外层的for循环时,
//p 和q 的值都是从数组的开头位置进行排序的,
//这就有问题了,应该每进行一次外层for循环,
//p 和q 的值从上一次循环的位置开始,而不是从头
//重新开始,希望这样解释你能理解
}
struct numb *combin(struct numb *head1,struct numb *head2)
{
//我给的归并函数是在前两个链表已经
//排好序的基础上,每次选择两个链表中的
//比较小的值归入第三次链表,这样依次归并下去
struct numb *Head,*p,*s,*fir,*sec;
int flag=1,temp;
Head=(struct numb *)malloc(sizeof(struct numb));
p=Head;
fir=head1,sec=head2;
while(flag)
{
if(fir==NULL && sec==NULL) //如果两个链表中的元素都归并完了,
{ //就退出
flag=0;
}
else if(fir==NULL && sec!=NULL) //如果第一个链表归并完了,第二个
{ //链表还有元素,就将第二个的元素
p->data=sec->data; //之间放到第三个链表中
sec=sec->next;
}
else if(fir!=NULL && sec==NULL) //如果第二个链表归并完了,第一个
{ //链表还有元素,就将第一个的元素
p->data=fir->data; //之间放到第三个链表中
fir=fir->next;
}
else
{
if(fir->data < sec->data)
{
p->data=fir->data;
fir=fir->next;
}
else
{
p->data=sec->data;
sec=sec->next;
}
}
s=(struct numb *)malloc(sizeof(struct numb));
p->next=s;
p=s;
}
return Head;
}
void printlen(struct numb *head) //注意排序后数组元素就不止10个了,在
{ //这里我采用偷懒的方法,有复制了一份
struct numb *current;
int i;
printf("The result are:\n");
current=head;
for(i=0;i<20;i++)
{
printf("%3d\t",current->data); //此处注意修改,不是(*current)
current=current->next;
}
printf("\n");
}
int main()
{
struct numb *pHead1,*pHead2; //注意phead声明的类型,不是int
struct numb *pHead3;
pHead1=creat();
pHead2=creat();
sort(pHead1);
sort(pHead2);
print(pHead1);
print(pHead2);
pHead3=combin(pHead1,pHead2);
printlen(pHead3);
return 0;
}
#include<malloc.h>
//#define NULL 0
//这里有两个问题,1.此处没有 ;号
//2 . 不用定义NULL 为0
//你为啥将一个整型0赋给一个指针呢
//应该将这句注释掉,因为NULL本来
//就代表空指针,不要画蛇添足
struct numb
{
int data;
struct numb *next;
};
struct numb *creat()
{
struct numb *head,*s,*p;
int i;
head=s=p=NULL;
p=(struct numb *)malloc(sizeof(struct numb));
printf("please input 10 numbers\n");
for(i=0;i<10;i++)
{
s=(struct numb *)malloc(sizeof(struct numb));
p->next=s;
if(i==0) head=p;
scanf("%d",&p->data);
p=p->next;
if(i==9) p->next=NULL;
} //此处也没有 ; 号
return head;
}
void print(struct numb *head)
{
struct numb *current;
int i;
printf("The result are:\n");
current=head;
for(i=0;i<10;i++)
{
printf("%3d\t",current->data); //此处注意修改,不是(*current)
current=current->next;
}
printf("\n");
}
void sort(struct numb *head)
{
struct numb *p,*q;
int temp,i,j;
//下面排序的思想是每次让j 循环中的所有元素
//和当前的第i个元素比较,若果比第i个元素小就
//交换第j个和第i个元素,这样是按照从小到大的
//顺序排,从小到大的方法雷同
p=head;
for(i=0;i<9;i++)
{
//p=q=head;
//q=q->next;
q=p;
for(j=i+1;j<10;j++)
{
q=q->next;
if(p->data > q->data)
{
temp=p->data;
p->data=q->data;
q->data=temp;
}
}
p=p->next;
}
//上面的排序方法比较好理解
//你的代码中每次进行外层的for循环时,
//p 和q 的值都是从数组的开头位置进行排序的,
//这就有问题了,应该每进行一次外层for循环,
//p 和q 的值从上一次循环的位置开始,而不是从头
//重新开始,希望这样解释你能理解
}
struct numb *combin(struct numb *head1,struct numb *head2)
{
//我给的归并函数是在前两个链表已经
//排好序的基础上,每次选择两个链表中的
//比较小的值归入第三次链表,这样依次归并下去
struct numb *Head,*p,*s,*fir,*sec;
int flag=1,temp;
Head=(struct numb *)malloc(sizeof(struct numb));
p=Head;
fir=head1,sec=head2;
while(flag)
{
if(fir==NULL && sec==NULL) //如果两个链表中的元素都归并完了,
{ //就退出
flag=0;
}
else if(fir==NULL && sec!=NULL) //如果第一个链表归并完了,第二个
{ //链表还有元素,就将第二个的元素
p->data=sec->data; //之间放到第三个链表中
sec=sec->next;
}
else if(fir!=NULL && sec==NULL) //如果第二个链表归并完了,第一个
{ //链表还有元素,就将第一个的元素
p->data=fir->data; //之间放到第三个链表中
fir=fir->next;
}
else
{
if(fir->data < sec->data)
{
p->data=fir->data;
fir=fir->next;
}
else
{
p->data=sec->data;
sec=sec->next;
}
}
s=(struct numb *)malloc(sizeof(struct numb));
p->next=s;
p=s;
}
return Head;
}
void printlen(struct numb *head) //注意排序后数组元素就不止10个了,在
{ //这里我采用偷懒的方法,有复制了一份
struct numb *current;
int i;
printf("The result are:\n");
current=head;
for(i=0;i<20;i++)
{
printf("%3d\t",current->data); //此处注意修改,不是(*current)
current=current->next;
}
printf("\n");
}
int main()
{
struct numb *pHead1,*pHead2; //注意phead声明的类型,不是int
struct numb *pHead3;
pHead1=creat();
pHead2=creat();
sort(pHead1);
sort(pHead2);
print(pHead1);
print(pHead2);
pHead3=combin(pHead1,pHead2);
printlen(pHead3);
return 0;
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询