你们好这是一个c语言程序解决数据结构堆栈的构建 速等答案,立刻采纳

这个堆栈是一个动态的,当内存不足时会新申请一些内存,所以数据应该是可以不断地输入的,可是为什么每次输入到10左右数字的时候就总会出错啊?

#include<stdio.h>
#include<string.h>
#include<malloc.h>
#include<stdlib.h>
#define STACK_SIZE 2
#define STACKINCREAT 2
#define len sizeof(struct simple)
typedef struct simple
{
int * base;
int * top;
int stacksize;
} * stack;
int * creat(stack p)
{

int n;
int * baocun;

int * q;
int * head;
p=(stack)malloc(len);
p->stacksize=STACK_SIZE;
p->top=(int *)malloc(p->stacksize);
head=p->base=p->top;
scanf("%d",p->top);

while(*p->top!=25)
{
q=p->top;
(p->top)++;

if((p->top-p->base)>(p->stacksize))
{

(p->stacksize)+=STACKINCREAT;

p->top=(int *)malloc(p->stacksize);
if(p->top==NULL)
{
printf("your number is wrong!");
}
else
{
p->base=p->top;
while(head<=q)
{
*(p->top)=*head;

head++;

(p->top)++;
}
head = p->base;
scanf("%d",p->top);
}

}
else
{
scanf("%d",p->top);
}
}

return p->base;

}
print(int * p)
{
while(*p!=25)
{
printf("%d\n",*p);
p++;
}

}
void main()
{
stack p;
creat(p);

}

你使用错了 (p->top)++;
这个不能只要使用,这个相当于数组的存储结构,而计算机空间是没有那么大的连续的存储空间。因为你的数据存储出错了,要更改你的程序比较麻烦,只能重新设计
我给两个例子给你看,希望你理解,不理解可以百度hi我。
我做了一个测试程序帮助你理解:
1.不能达到要求程序,像你上面的:
#include <iostream>
using namespace std;
void main()
{
int *p=new int;//new相当于malloc,是分配内存空间
cin>>*p;
while(*p!=0)
{
cout<<p;//输出地址
p++;//地址是连续的,可计算机这样连续的内存是很短的
cin>>*p;

}
cout<<*p<<endl;
}
2.正确:
#include <iostream>
using namespace std;
void main()
{
int *p=new int;
int *q;

cin>>*p;
while(*p!=0)
{
cout<<p;//输出地址,你可以看到地址是随机的
q=new int;
p=q;
cin>>*p;

}
cout<<*p<<endl;
}追问

可是我每次 P->top++的时候都在之前 加上了 p->top=malloc(10);啊 这样说是不是 这个新申请的内存空间不是连续的呢?

追答

这里严重问题: while(*p->top!=25)
{
q=p->top;
(p->top)++;//把地址加4个字节
虽然你后面使用了Malloc分配了空间,可以你只在if中使用了,当不是if的时候,就是到这里了,
这样内存访问出错了,
建议你看看链表的数据结构,怎么用指针实现其功能,堆栈就理解了。

温馨提示:内容为网友见解,仅供参考
第1个回答  2012-05-08
p->top=(int *)malloc(p->stacksize);

内存不足时要重新申请一片更大的内存,realloc()函数;
指针名=(数据类型*)realloc(要改变内存大小的指针名,新的大小)
sizeof(获得类型的内存大小)
第2个回答  2011-05-04
erfbQ#N
相似回答