程序一运行就弹出 顺序表.exe 已停止工作 求大侠帮忙看一下 到底问题出现在哪里? 感激不尽!

程序编译没报错大意是通过键盘使用scanf语句输入自己想要输入的顺序表元素想输入五个元素然后在第六个位置插入99可惜一运行输入一个5之后就显示顺序表.exe停止工作了分为... 程序编译没报错
大意是通过键盘使用scanf语句输入自己想要输入的顺序表元素
想输入五个元素 然后在第六个位置插入99
可惜一运行 输入一个5之后就显示 顺序表.exe 停止工作了

分为主函数跟头文件
主函数:
#define maxsize 100
typedef int datatype;
#include<stdio.h>
#include"hh.h"
void main()
{
sqlist mylist;
int n,x,i;
printf("enter the number of elements:");
scanf("%d",&n);
for(i=0;i<n;i++)
{
printf("enter the %st number:",i+1);
scanf("%d",&x);
mylist.list[i]=x;
}
//insert(&l,6,99);
printf("print l:\n");
print(&mylist);
}
头文件#include"hh.h"
typedef struct
{
datatype list[maxsize];
int length;
}sqlist;
void initiate(sqlist *l)
{
l->length=0;
}
int length(sqlist *l)
{
return l->length;
}
int insert(sqlist *l,int i,datatype x)
{
int j;
if(l->length==maxsize)
{
printf("已满元素不可插!\n");
return 0;
}
else if(i<1 || i>l->length+1)
{
printf("参数出错!\n");
return 0;
}
else
{
for(j=l->length-1;j>=i-1;j--)
l->list[j+1]=l->list[j];
l->list[i-1]=x;
l->length++;
return 1;
}
}
int deletewithoutx(sqlist *l,int i)
{
int j;
if(l->length==0)
{
printf("表是空的,不可删!\n");
return 0;
}
else if(i<1 || i>l->length)
{
printf("参数出错!\n");
return 0;
}
else
{
for(j=i;j<=l->length-1;j++)
l->list[j-1]=l->list[j];
l->length--;
return 1;
}
}

int deletewithx(sqlist *l,int i,datatype *x)
{
int j;
if(l->length==0)
{
printf("表示空的,元素不可删!\n");
return 0;
}
else if(i<1 || i>l->length)
{
printf("参数出错!\n");
return 0;
}
else
{
*x=l->list[i-1];
for(j=i/* 这里是要将第i个后面的一个数字向前移前,覆盖第i个元素*/;j<=l->length-1;j++)
l->list[j-1]=l->list[j];
l->length--;
return 1;
}
}
void print(sqlist *l)
{
int i;
for(i=0;i<=l->length-1;i++)
printf("%d",l->list[i]);
printf("\n");
}
求高手指教!感激不尽!
展开
 我来答
丽舞倾心
2012-06-15 · TA获得超过462个赞
知道答主
回答量:75
采纳率:0%
帮助的人:71万
展开全部
修改如下:
其中,你的头文件楼主没有保留,主函数中增加initiate()的调用。另外删去没用调用的函数。
#include<stdio.h>
#define maxsize 100
typedef int datatype;
typedef struct
{
datatype list[maxsize];
int length;
} sqlist;
void initiate(sqlist *l);
void print(sqlist *l);
int insert(sqlist *l,int i,datatype x);

int main()
{
sqlist mylist;
int n,x,i;
initiate(&mylist);
printf("enter the number of elements:");
scanf("%d",&n);
for(i=0; i<n; i++)
{
printf("enter the %dst number:",i+1);
scanf("%d",&x);
mylist.list[i]=x;
mylist.length++;
}
insert(&mylist,6,99);
printf("print l:\n");
print(&mylist);
return 0;
}

void initiate(sqlist *l)
{
l->length=0;
}

int insert(sqlist *l,int i,datatype x)
{
int j;
if(l->length==maxsize)
{
printf("已满元素不可插!\n");
return 0;
}
else if(i<1 || i>l->length+1)
{
printf("参数出错!\n");
return 0;
}
else
{
for(j=l->length-1; j>=i-1; j--)
l->list[j+1]=l->list[j];
l->list[i-1]=x;
l->length++;
return 1;
}
}

void print(sqlist *l)
{
int i;
for(i=0; i<=l->length-1; i++)
printf("%d ",l->list[i]);
printf("\n");
}
追问
大侠
问题就是我开始时未调用初始化函数
后来照大侠您说的加了一个初始化的函数就好了
为什么一定要加一个初始化函数呢?
虽然书上每个程序开始时都会加一个初始化函数
但是后来我用for循环时 不是给每一个数组元素位置都赋值了吗?
就算系统随机赋值给每个位置 后来也会被我的赋值覆盖了呀?
就是这里想不太通
大侠可以再说下吗?谢谢!
追答
初始化函数其实就是这句话:l->length=0,将顺序表长初始化为0。不初始化的话,l->length是随机值,不能参与后面的运算和条件判断for(j=l->length-1; j>=i-1; j--)、 for(i=0; ilength-1; i++)等等。
另外你说的每个程序开始都会有初始化函数,其实就是将程序中某些重要的变量等等赋初值或是分配内存等等,你在主函数里面实现也行。单独放在初始化函数里面可以让程序的可读性更强,结构更清晰。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式