一个c语言表示的数据结构的问题,请帮我看一下
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个c语言表示的数据结构的问题,请帮我看一下相关的知识,希望对你有一定的参考价值。
#include "stdio.h"
#include "stdlib.h"
typedef struct stu
int data[1000];
int length;
sqlist;
void sqlist_input(sqlist *L,int number)
int i;
L->length=number;
if(number==0)
printf("无数据!");
exit(1);
i=0;
while(i<number)
scanf("%d",&L->data[i]);
i++;
void sqlist_sort(sqlist *L1,sqlist *L2,sqlist *L3)
int i,j,k,h,n,m,l;
n=L1->length;
m=L2->length;
l=L3->length=0;
for(i=0,j=0;i<n,j<m;)
if(L1->data[i]<=L2->data[j]) //L1的当前位置小于或等于L2的当前位置时执行
if(l==0) //L3中没有元素时
L3->data[l]=L1->data[i];
++l;
i++;
else //L3有元素时按从小到大插入
for(k=0;k<l;k++)
if(L1->data[i]<=L3->data[k])
for(h=l-1;h<=k;h--)
L3->data[h+1]=L3->data[h];
L3->data[k]=L1->data[i];
++l;
i++;
break;
if(k==l) //若要插入的数大于表中最大的数,则插到最后位置
L3->data[l]=L1->data[i];
++l;
i++;
else //若L2中当前位置小于等于L1中的位置时,将L2中的当前数插入L3中
if(l==0)//若空表的话,插入第一个位置
L3->data[l]=L2->data[j];
++l;
j++;
else //L3不为空表时
for(k=0;k<l;k++) //从下到大排序然后插入
if(L2->data[j]<=L3->data[k])
for(h=l-1;h<=k;h--)
L3->data[h+1]=L3->data[h];
L3->data[k]=L2->data[j];
l++;
j++;
break;
if(k==l)//若该数比L3中的最大数大的话,则插到表尾
L3->data[l]=L2->data[j];
++l;
j++;
L3->length=l;
void sqlist_output(sqlist *L)
int i,n;
n=L->length;
i=0;
while(i<n)
printf("%d ",L->data[i]);
i++;
int main(void)
sqlist La,Lb,Lc;
int n,m;
printf("请输入La中的元素个数:\n");
scanf("%d",&n);
printf("请输入La中所有的元素:\n");
sqlist_input(&La,n);
printf("请输入Lb中的元素个数:\n");
scanf("%d",&m);
printf("请输入Lb中所有的元素:\n");
sqlist_input(&Lb,m);
sqlist_sort(&La,&Lb,&Lc);
printf("排序后为!\n");
sqlist_output(&Lc);
return 0;
当输入完所有数的时候就出现了这个图片,请大家帮我分析一下,这是为什么啊
#include "stdlib.h"
typedef struct stu
int data[1000];
int length;
sqlist;
void sqlist_input(sqlist *L,int number)
int i;
L->length=number;
if(number==0)
printf("无数据!");
exit(1);
i=0;
while(i<number)
scanf("%d",&L->data[i]);
i++;
void sqlist_sort(sqlist *L1,sqlist *L2,sqlist *L3)
int i,j,k,h,n,m,l;
n=L1->length;
m=L2->length;
l=L3->length=0;
for(i=0,j=0;i<n||j<m;)
if(j>=m || i<n && L1->data[i]<=L2->data[j]) //L1的当前位置小于或等于L2的当前位置时执行
if(l==0) //L3中没有元素时
L3->data[l]=L1->data[i];
++l;
i++;
else //L3有元素时按从小到大插入
for(k=0;k<l;k++)
if(L1->data[i]<=L3->data[k])
for(h=l-1;h>=k;h--)
L3->data[h+1]=L3->data[h];
L3->data[k]=L1->data[i];
++l;
i++;
break;
if(k==l) //若要插入的数大于表中最大的数,则插到最后位置
L3->data[l]=L1->data[i];
++l;
i++;
else //若L2中当前位置小于等于L1中的位置时,将L2中的当前数插入L3中
if(l==0)//若空表的话,插入第一个位置
L3->data[l]=L2->data[j];
++l;
j++;
else //L3不为空表时
for(k=0;k<l;k++) //从下到大排序然后插入
if(L2->data[j]<=L3->data[k])
for(h=l-1;h>=k;h--)
L3->data[h+1]=L3->data[h];
L3->data[k]=L2->data[j];
l++;
j++;
break;
if(k==l)//若该数比L3中的最大数大的话,则插到表尾
L3->data[l]=L2->data[j];
++l;
j++;
L3->length=l;
void sqlist_output(sqlist *L)
int i,n;
n=L->length;
i=0;
while(i<n)
printf("%d ",L->data[i]);
i++;
int main(void)
sqlist La,Lb,Lc;
int n,m;
printf("请输入La中的元素个数:\n");
scanf("%d",&n);
printf("请输入La中所有的元素:\n");
sqlist_input(&La,n);
printf("请输入Lb中的元素个数:\n");
scanf("%d",&m);
printf("请输入Lb中所有的元素:\n");
sqlist_input(&Lb,m);
sqlist_sort(&La,&Lb,&Lc);
printf("排序后为!\n");
sqlist_output(&Lc);
return 0;
追问
看着您的代码只给我改了这些for(i=0,j=0;i=m || idata[i]data[j]) //L1的当前位置小于或等于L2的当前位置时执行
我的到底错在哪了呢?我怎么看不出来呢?请多多指教,详细解答解答吧
还有这个,h>=k
for(h=l-1;h>=k;h--)
L3->data[h+1]=L3->data[h];
你的问题在于逻辑不太清晰,比如idata[i]data[j]) 的越界问题
La和Lb都是无序列表,你选处理好La,然后同样的逻辑再出来Lb,结果不是一样的么?
La和Lb一起循环,除了增加程序出错的可能性外,没有任何意义啊!追问
我是根据别的例子延伸到的这个,举一反三吗不是
追答我的意思是说,如果你看不出来哪里出错了,就把处理改简单,然后很容易就能看出问题出在哪里。这样的话,即不需要问别人,也会有很大的进步。
根据我的经验,代码重构比在烂代码里找错有意义得多。
受教了,虽然已经选了,但还是很感谢您
参考技术B 排序算法写错了,导致Lc的data数组越界!自己改改那个排序吧。以上是关于一个c语言表示的数据结构的问题,请帮我看一下的主要内容,如果未能解决你的问题,请参考以下文章
请问这张C语言的PPT里面的短数据长变量的赋值我不懂,谁帮我看下?
请帮我看一下这个网络拓扑。 用的tp-link无线路由器充当AP.每个路由器是一个LAN,DCHP:192.168.1.1/24