数据结构(C语言)只使用顺序表

书中题目要求是:将顺序表中值为x(我写成num)的结点删除#include"stdio.h"#defineMAXSIZE60typedefstructA{intdata;... 书中题目要求是:将顺序表中值为x(我写成num)的结点删除
#include"stdio.h"
#define MAXSIZE 60

typedef struct A
{
int data;
char n[10];
}ElemType;
typedef struct B
{
ElemType elem[MAXSIZE];
int length;
}SeqList;

main() //主函数
{
void init_SeqList(SeqList *);
void del_SeqList(SeqList *,int);
SeqList *L;
int num,i;
init_SeqList(L);
for(i=1;i<=2;i++)
{
scanf("%d%s",&L->elem[i].data,L->elem[i].n);
L->length++;
}
printf("删除值:");
scanf("%d",&num);
del_SeqList(L,num);
printf("%d\t%s\n",L->elem[1].data,L->elem[1].n);
}
void init_SeqList(SeqList *L) //初始化顺序表
{
L->length = 0;
}
void del_SeqList(SeqList *L,int num) //查找值为x的结点,将其删除
{
int del,i;
del=1;
while(del<=L->length)
{
if(L->elem[del].data == num)
{
i=del;
do
{
L->elem[i]=L->elem[i+1];
i++;
}while(i<=L->length);
L->length--;
}
del++;
}

}
请大侠给分析分析错在哪里。
当将以上代码改成:
#include"stdio.h"
#define MAXSIZE 60

typedef struct A
{
int data;

}ElemType;
typedef struct B
{
ElemType elem[MAXSIZE];
int length;
}SeqList;

main() //主函数
{
void init_SeqList(SeqList *);
void del_SeqList(SeqList *,int);
SeqList *L;
int num,i;
init_SeqList(L);
for(i=1;i<=2;i++)
{
scanf("%d",&L->elem[i].data);
L->length++;
}
printf("删除值:");
scanf("%d",&num);
del_SeqList(L,num);
printf("%d\t\n",L->elem[1].data);
}
void init_SeqList(SeqList *L) //初始化顺序表
{
L->length = 0;
}
void del_SeqList(SeqList *L,int num) //查找值为x的结点,将其删除
{
int del,i;
del=1;
while(del<=L->length)
{
if(L->elem[del].data == num)
{
i=del;
do
{
L->elem[i]=L->elem[i+1];
i++;
}while(i<=L->length);
L->length--;
}
del++;
}

}
它能得到理想答案。。。但是将主函数for语句中的i<=2改成i<=n(n>2)时,感觉无语。
展开
 我来答
炫心吾动之夜爱
2011-10-06 · TA获得超过379个赞
知道小有建树答主
回答量:168
采纳率:0%
帮助的人:58.6万
展开全部
1)主函数中的循环语句控制的是表中个数,i<=2,代表的是两个,如果修改成i<=m,就代表m个,但不能用n字母,因为n在程序中有另外的用途了。
for(i=1;i<=2;i++)
{
scanf("%d",&L->elem[i].data);
L->length++;
}
2)在第一个程序中有输入数据的语句
scanf("%d%s",&L->elem[i].data,L->elem[i].n);
这条语句会造成吃字符现象,也就是%s,因此循环后的删除数据的输入会造成并没有输入就会看到输出,既然初始化和删除都使用了函数,为什么不把建立也用函数完成呢,这样就不会出现这样现象了。
3)在删除函数中只考虑相等的情况,一但输入的数据在表中没有怎么办呢?因此有返回语句,传递表中没有此数据,没有进行删除操作的信息。
int del_SeqList(SeqList *L,int num) //查找值为x的结点,将其删除
{
int del,i;
del=1;
while(del<=L->length)
{
if(L->elem[del].data == num)
{
i=del;
do
{
L->elem[i]=L->elem[i+1];
i++;
}while(i<=L->length);
L->length--;return 1;//代表进行删除的操作
}
del++;
}
return 0;//如果循环正常退出代表表中没有此数据,因此返回后要进行没有进行删除操作的信息处理。
4)主函数中最后的输出为数组1中的元素,没有道理!要想显示删除的数据信息,何不用下标为0的数组单元呢,也就是说在删除数据前先保留删除数据,放入数组0中,再进行删除操作。
}
更多追问追答
追问
第一: 这个你应该漏掉我提问时说的最后一 句话,n>2

第二:我试了这个方法。在win-tc里一些正常,当使用c-free5.0编绎运行时,不提示错误,进入dos的时候,直接弹出错误 或者 输入1 one回车(采用以上第一种代码,略修改过)弹出错误,使用调试时,停留在char n[10]

第三:没看明白。。。不过我的代码中 del++ 前面应该加个else

第四:我在下一个回答的大侠回了回答。将删除数据放入数组0中,是不是没那个必要啊
追答
我看到你最后的一句了,我认为用循环控制多个数据输入是没问题的,这不是你程序中关键的错误,你不能出来相应结果,绝不是它的错误!
我修改删除函数的函数类型是我理解为在查找num值时,不一定必须查找的,一旦查找整个表中没有你输入的要删除的元素,那你主函数中的输出还有何意义?难不成你的删除一定能删除一个结点??
我同下面的那人理解是一样的,主函数中最后的输出是已经删除了的元素要显示出来,这是数据结构删除函数设计的要点啊,正因为这种考虑才有利用数组0下标的想法,看来你最后的输出只是想输出表中第一个结点。如果你删除的是第一个结点,输出语句一定是移上来的第二个结点,但你删除的并不一定都是第一个结点啊,其它结点时输出第一个有什么用呢?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
duck_lwz
2011-10-06 · TA获得超过512个赞
知道小有建树答主
回答量:313
采纳率:0%
帮助的人:324万
展开全部
第一个程序有两个错误:
错误一:
SeqList *L;
init_SeqList(L);
应改成:
SeqList s;
SeqList *L = &s;
init_SeqList(L);
错误原因:指针只有在初始化(即只有在指向具体对象)之后才可以参与运算,你只定义了一个指针,并未将指针指向具体的对象,当执行到init_SeqList(L); 这句时,会产生越界报错。

错误二:
printf("%d\t%s\n",L->elem[1].data,L->elem[1].n);
这个语句打印出来的永远是第一个元素,而不是删除的元素,应改成:
printf("%d\t%s\n",L->elem[i].data,L->elem[i].n); //其中i为被删除元素的下标

提示:
给数组赋值时,循环最好从i=0开始,for(i=1;i<=2;i++)你从i=1开始,实际上是将值赋给了数组的第二个元素。
更多追问追答
追问
我将L赋空值即SeqList *L=NULL 如再定义一个S感觉是浪费空间。

你说的第二个错误,其实主要是我懒的写循环语句,这里问题不大,如采用以上第二种代码;输入
1
2
删除值: 1
这里结果就会输出:2
但是当for语中的i<=2改成i<=3时,我用的c-free 5.0编绎运行,编译不提示错误,运行时直接弹出内存出错。。。

你说的第三点,在我看的数据结构教材书中说到 为方便使用线性表中的顺序表,其下标值从1开始
追答
追问我将L赋空值即SeqList *L=NULL 如再定义一个S感觉是浪费空间。
必须要定义个S才能存储数据啊,你不定义S,你将数据存储在哪呢?建议你仔细体会下指针的定义
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式