线性表顺序存储运行时出错,什么原因?

coincidenceWQ 西安电子科技大学 学生  2014-01-14 03:47:10
源码:
#include <stdio.h>
#include <stdlib.h>
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#include <malloc.h>

typedef struct{
int *elem;
int length;
int listsize;
}sqlist;

int Initlist(sqlist &L)
{
L.elem = (int *)malloc(LIST_INIT_SIZE*sizeof(int));
if(!L.elem) exit(-2);
L.length = 0;
L.listsize = LIST_INIT_SIZE;
return 1;
}

int Insert(sqlist &L,int i,int e)
{
if(i<1||i>L.length + 1)return 0;
if(L.length>=L.listsize){
int * newbase = (int *)realloc(L.elem,(L.listsize + LISTINCREMENT)*sizeof(int));
if(!newbase) exit(-2);
L.elem = newbase;
L.listsize += LISTINCREMENT;
}
int *q = &(L.elem[i-1]);
for(int *p = &(L.elem[L.length - 1]); p>=q;--p) *(p+1) = *p;
*q = e;
L.length ++;
return 1;
}

int Delete(sqlist &L,int i)
{
if(i<1||i>L.length) return 0;
int *q = &(L.elem[i-1]);
for(int *p = &L.elem[L.length - 1];q != p;++q) *q = *(q+1);
--L.length;
return 1;
}

void Print(sqlist&L)
{
int i=0;
int *p = L.elem;
int *q = L.elem + L.length - 1;
while(p != q) printf("%d",L.elem[i++]);
printf("%d",L.elem[i]);

}

int main()
{
sqlist L;
Initlist(L);
int i,j=0;
while(scanf("%d",&i)) Insert(L,j++,i);
Print(L);
return 0;
free(L.elem);

}

运行时出现:
线性表的顺序存储.exe 中的 0x001216df 处有未经处理的异常: 0xC0000005: 读取位置 0x001d6000 时发生访问冲突
...全文
114 点赞 收藏 9
写回复
9 条回复
coincidenceWQ 2014年01月14日
灰常感谢,
回复 点赞
starytx 2014年01月14日
引用 3 楼 starytx 的回复:
Print函数中这句: while(p != q) printf("%d",L.elem[i++]); p和q少个++吧? while(p++ != q++) printf("%d",L.elem[i++]);
大意了,q不用自增
回复 点赞
肖邦之离歌 2014年01月14日
把楼主的代码修改了下,修改地方会注释 所有。运算符的地方我都改成了->,因为这里用的是指针

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>//这里我调整了位置,不知道你的行不行,我看着舒服这样
#define LIST_INIT_SIZE 100
#define LISTINCREMENT  10
typedef struct{
int *elem;
int length;
int listsize;
}sqlist;

int Initlist(sqlist *L)//这里改成指针
{
    L->elem = (int *)malloc(LIST_INIT_SIZE*sizeof(int));
    if(!L->elem) exit(-2);
    L->length = 0;
    L->listsize = LIST_INIT_SIZE;
    return 1;
}

int Insert(sqlist *L,int i,int e)//这里改成指针
{
    if(i<1||i>L->length + 1)return 0;
    if(L->length>=L->listsize)
    {
        int * newbase = (int *)realloc(L->elem,(L->listsize + LISTINCREMENT)*sizeof(int));
        if(!newbase) exit(-2);
        L->elem = newbase;
        L->listsize += LISTINCREMENT;
    }
    int *q = &(L->elem[i-1]);
    int *p = &(L->elem[L->length - 1]);
    for(; p>=q;--p) *(p+1) = *p;
    *q = e;
    L->length ++;
    return 1;
}

int Delete(sqlist *L,int i)//这里改成指针
{
    if(i<1||i>L->length) return 0;
    int *q = &(L->elem[i-1]);
    int *p = &L->elem[L->length - 1];
    for(;q != p;++q) *q = *(q+1);
    --L->length;
    return 1;
}

void Print(sqlist *L)//这里改成指针
{
    int i=0;
    int *p = L->elem;
    int *q = L->elem + L->length;//这里改了,所以最后的一句输出不需要了
    while(p != q)
    {
        printf("%d",L->elem[i++]);
        p++;//这里添加了一句
    }
}

int main()
{
    sqlist *L;
    L = (sqlist *)malloc(sizeof(sqlist));
    Initlist(L);
    int i = 0,j = 1;
    while(scanf("%d",&i) != EOF) Insert(L,j++,i);
    Print(L);
    free(L->elem);//建议楼主这个地方在写一个destory函数用来释放Initlist开辟的空间。这里用free有点四不象。
    free(L);
    return 0;
}
回复 点赞
coincidenceWQ 2014年01月14日
好吧,失误,但是为什么还是出错呢,依然是那样的
回复 点赞
starytx 2014年01月14日
引用 4 楼 coincidenceWQ 的回复:
受教!那个free加在最后可以么?
你说呢?都return 0;了,你后边的free还能执行到吗?
回复 点赞
coincidenceWQ 2014年01月14日
受教!那个free加在最后可以么?
回复 点赞
starytx 2014年01月14日
Print函数中这句: while(p != q) printf("%d",L.elem[i++]); p和q少个++吧? while(p++ != q++) printf("%d",L.elem[i++]);
回复 点赞
coincidenceWQ 2014年01月14日
我用的VS,怎么调试?其实我是感觉顺序存储的原因,不是代码错了。。想知道这个顺序存储的一些利弊。
回复 点赞
starytx 2014年01月14日
按F5,调试一下
回复 点赞
发动态
发帖子
C语言
创建于2007-09-28

3.2w+

社区成员

24.0w+

社区内容

C语言相关问题讨论
社区公告
暂无公告