数据结构查找删除操作哪里出错了

weixin_40458321 2018-09-17 10:50:11
#include<stdio.h>
#include<malloc.h>
#define ERROR 0
#define OK 1
#define INIT_SIZE 100
#define INCREM 10
typedef int ElemType;


typedef struct Sqlist{
ElemType *slist;
int length;
int listsize;
}Sqlist;
int InitList_sq(Sqlist *L);
int CreateList_sq(Sqlist *L,int n);
int ListInsert_sq(Sqlist *L,int i,ElemType e);
int PrintList_sq(Sqlist *L);
int ListDelete_sq(Sqlist *L,int i,ElemType *e);
int ListLocate(Sqlist *L,ElemType e,int *pos);

int InitList_sq(Sqlist *L){
L->slist = (ElemType *)malloc(INIT_SIZE*sizeof(ElemType));
if(!L->slist)return ERROR;
L->length = 0;
L->listsize = INIT_SIZE;
return OK;
}

int CreateList_sq(Sqlist *L,int n){
int i = 0;
for(;i<n;i++)
scanf("%d",&L->slist[i]);
L->length += n;
return OK;

}
int PrintList_sq(Sqlist *L){
int i=0;
if(L->length==0)return ERROR;
for(;i<L->length;i++)
printf("%d ",L->slist[i]);
printf("\n");
return OK;
}

int ListInsert_sq(Sqlist *L,int i,ElemType e){
int k;
if(i<1||i>L->length+1) return ERROR;
if(L->length==L->listsize){
L->slist = (ElemType *)realloc(L->slist,(L->listsize+INCREM)*sizeof(ElemType));
if(!L->slist) return ERROR;
L->listsize += INCREM;
}
for(k=L->length-1;k>=i-1;k--)
L->slist[k+1] = L->slist[k];
L->slist[i-1] = e;
L->length++;
return OK;
}



int ListLocate(Sqlist *L,ElemType e,int *pos){
int i=0;
for(;i<L->length;i++){
if(L->slist[i]==e)
{
*pos = i;
break;
}
}
if(i>=L->length)
return ERROR;
else
return OK;

}
int ListDelete_sq(Sqlist *L,int i,ElemType *e){
int j;
if(i<1||i>L->length) return ERROR;
*e=L->slist[i-1];
for(j=i;j<L->length;j++)
L->slist[j-1]=L->slist[j];
L->length--;
return OK;

}
int main(void){
Sqlist L;
ElemType *e1;
int *pos;
if(!InitList_sq(&L))
printf("初始化失败!\n");
else
printf("初始化cg!\n");
if(!CreateList_sq(&L,5))
printf("创建失败!");
else
printf("创建cg!\n");

if(!PrintList_sq(&L))
printf("没有元素!");



if(!ListInsert_sq(&L,4,10))
printf("插入位置不准确");
if(!PrintList_sq(&L))
printf("没有元素!");

if(!ListLocate(&L,4,pos))
printf("没有此元素");
else
printf("元素位置为%d",(*pos)+1);

if(ListDelete_sq(&L,2,e1)){
if(!PrintList_sq(&L))
printf("没有元素!");
}
}
...全文
769 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
沐雨青城 2018-09-18
  • 打赏
  • 举报
回复
ElemType *e1;
int *pos;
把这两个指针换成变量pos和e1,传递进函数ListLocate(&L,4,&pos)和ListDelete_sq(&L,2,&e1)中,就 不会报错了,在这两个函数中,有*pos = i;和 *e=L->slist[i-1];,对这两个指针赋值了,但你还没有对这两个指针分配内存,所以会报访问非法内存的错误。
weixin_40458321 2018-09-18
  • 打赏
  • 举报
回复
我想知道为什么指针用了就错
赵4老师 2018-09-17
  • 打赏
  • 举报
回复
数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633
程序小黑 2018-09-17
  • 打赏
  • 举报
回复
我用#CSDN#这个app发现了有技术含量的博客,小伙伴们求同去《C/C++泛型编程实现数据结构之线性表》, 一起来围观吧 https://blog.csdn.net/qq_27180763/article/details/82656677
@风轻云淡_ 2018-09-17
  • 打赏
  • 举报
回复
ElemType *e1 = new int;
int *pos = new int;
末尾加上
if(pos) delete pos;
if(e1) delete e1;
饭要一口一口吃,你在学习链表的时候,最好先别掺杂上一些影响代码阅读的东西,要分清主次。其次你的命名让人看了很难受(int的重命名没感觉出来有什么必要,反而使代码更加晦涩难懂,带大小写和下划线的命名方法好像有点不太规范。。),我也是小白,共同学习,共同进步吧。

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧