一个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 "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(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]) 的越界问题

参考技术A 你是MM么?代码写得这么烂。
La和Lb都是无序列表,你选处理好La,然后同样的逻辑再出来Lb,结果不是一样的么?
La和Lb一起循环,除了增加程序出错的可能性外,没有任何意义啊!追问

我是根据别的例子延伸到的这个,举一反三吗不是

追答

我的意思是说,如果你看不出来哪里出错了,就把处理改简单,然后很容易就能看出问题出在哪里。这样的话,即不需要问别人,也会有很大的进步。
根据我的经验,代码重构比在烂代码里找错有意义得多。

追问

受教了,虽然已经选了,但还是很感谢您

参考技术B 排序算法写错了,导致Lc的data数组越界!自己改改那个排序吧。

以上是关于一个c语言表示的数据结构的问题,请帮我看一下的主要内容,如果未能解决你的问题,请参考以下文章

帮介绍一下C语言里的varargs。

请帮我解释一下下列计算机名词,好吗?谢谢!

请问这张C语言的PPT里面的短数据长变量的赋值我不懂,谁帮我看下?

请帮我看一下这个网络拓扑。 用的tp-link无线路由器充当AP.每个路由器是一个LAN,DCHP:192.168.1.1/24

C语言指针初学者 请帮我看看下面的提 为啥调用函数返回值是char型的 这样不就只能返回一个字符了吗

大家帮我看下这个C语言结构体分配空间的问题好么~