初学数据结构,C语言基础不太好,做这么一个练习,东拼西凑,严蔚敏的书上C++和C混用,不知道纯用C怎么写
设顺序表va中的数据元数递增有序。试写一算法,将x插入到顺序表的适当位置上,以保持该表的有序性
测试输入:
1,3,5,8,9
2
期待输出:
1,2,3,5,8,9
#include<stdio.h>
#include<stdlib.h>
#define LIST_INIT_SIZE 20
#define OK 1
#define ERROR 0
#define OVERFLOW -1
typedef int Status;
typedef int ElemType;
typedef struct
{
ElemType *elem;
int length;
int listsize;
}SqList;
Status InitList(SqList *L){ //构造一个空的线性表L
L->elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L->elem){
exit(OVERFLOW);
}
L->length = 0;
L->listsize = LIST_INIT_SIZE;
return OK;
}
SqList *L;
void Input(SqList *L,char shu)//写入
{
InitList(L);
int input=0;
while((getchar())!='\n')
{
if(shu!=',')
{
shu=shu-48;
L -> elem[input]=shu;
input++;
}
}
}
Status ListInsert(SqList *L, int i, ElemType e){
int k;
if (L->length == LIST_INIT_SIZE){ //线性表已满
return ERROR;
}
if (i < 1 || i > L->length+1){ //当i不在范围内时
return ERROR;
}
if (i <= L->length){ //若插入位置不在表尾
for(k = L->length-1;k >= i-1;k--){
L->elem[k+1] = L->elem[k];
}
}
L->elem[i-1] = e;
L->length++;
return OK;
}
int main(){
int x,i;
char shu;
int d=0;
InitList(L);
Input(L,shu);
scanf("%d",&x);
int r=0;
while((L->elem[r])>x){
r++;
}
ListInsert(L, i, x);
for(d=0;d<L->length;d++){
if(d!=(L->length-1)){
printf("%d,",L->elem[d]);
}else{
printf("%d",L->elem[d]);
}
}
return 0;
}
编译不报错,但运行时弹出黑框后无法操作,过几秒返回 3221225477
应该是读入的时候出的问题,这个逗号也很难办
问题一: 30行 L没有初始化,没有分配内存空间。有两种修改方法:
一是:用malloc申请空间
SqList *L = (SqList*)malloc(sizeof(SqList));
第二种方法是直接用全局变量,SqList *L改成 SqList L;下面main函数中使用的时候直接用&L就可以了。
问题二:Input函数中不需要调用InitList(L);函数了,因为已经在main函数中调用了。
问题三:Input函数中的shu是干什么用的?在main中也没有初始化就出入Input函数了
代码修改如下,修改部分在代码中有注释:
代码:
#include<stdio.h>
#include<stdlib.h>
#define LIST_INIT_SIZE 20
#define OK 1
#define ERROR 0
#define OVERFLOW -1
typedef int Status;
typedef int ElemType;
typedef struct
{
ElemType *elem;
int length;
int listsize;
}SqList;
Status InitList(SqList *L){ //构造一个空的线性表L
L->elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L->elem){
exit(OVERFLOW);
}
L->length = 0;
L->listsize = LIST_INIT_SIZE;
return OK;
}
SqList L;//修改 直接用全局变量,这时候内存由编译器自动分配
void Input(SqList *L /*,char shu*/ )//修改,这里不需要第二个参数
{
//InitList(L); //修改,这里不需要在调用,因为在main函数中已经初始化过了
char ch;
int input=0;
while(1) //修改,这里用ch接收一下输入的字符
{
scanf("%d",&L->elem[input]);
input++;
if( (ch = getchar())!='\n') //如果输入字符不是回车,继续读取
continue;
else
break;
/*if(shu!=',')
{
shu=shu-48;
L -> elem[input]=shu;
input++;
}*/
}
L->length = input; //这里设置表中的实际数据个数
}
Status ListInsert(SqList *L, int i, ElemType e){
int k;
if (L->length == LIST_INIT_SIZE){ //线性表已满
return ERROR;
}
if (i < 0 || i > L->length){ //当i不在范围内时 修改,范围
return ERROR;
}
if (i < L->length){ //若插入位置不在表尾
for(k = L->length-1;k >= i;k--){ //修改
L->elem[k+1] = L->elem[k];
}
}
L->elem[i] = e;//修改
L->length++;
return OK;
}
int main(){
int x,i;
//char shu;
int d=0;
InitList(&L);
Input(&L /*,shu*/);
scanf("%d",&x);
int r=0;
while((L.elem[r])<x){ //修改,应该是<,不是>
r++;
}
ListInsert(&L, r, x);
for(d=0;d<L.length;d++){
if(d!=(L.length-1)){
printf("%d,",L.elem[d]);
}else{
printf("%d",L.elem[d]);
}
}
return 0;
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!