有关链表中指针高级操作(高手请进)

老鱼趣多多 2003-07-13 10:46:58
大家帮我看看,我的程序有点怪异,我用链表实现calloc函数,
calloc一次分配N字节的内存,使用一个结构指针p指向它分配的首地址,用一个结构指针数组str[N]同时指向它的首地址,使用sizeof(struct list p)求出寸入每个链表结构里数据的长度,依次用首地址加这个长度,到了最后一次的时候,我多使用了一个内存结构,因为我是按地址加加的,所以理论上多出的内存存在,我再释放它,
现在问题是,当建立链表模块返回头节点的时候,单步调试时,头节点内数据都满足要求,可是在main()里返回来的就成了NULL了,我把返回的head改名为phead,这个问题就不存在了,请高手指教!!我知道可以用数组实现这个函数,那样就没有什么意义了,我只是想理解链表。
#include <stdio.h>
#include <stdlib.h>
#define NULL 0
#define N 5

struct list
{
int data;
struct list *next;
};

/*链表建立模块*/
struct list *created()
{
struct list *head;
int i;
struct list *p;
struct list *str[N];

p=(struct list *)calloc(N,sizeof(struct list));
head=p;
str[0]=p;
for(i=0;i<N;i++)
{
printf("please enter a data:\n");
scanf("%d",&str[i]->data);
str[i+1]=str[i]+(sizeof(p));
str[i]->next=str[i+1];
}

str[i-1]->next=NULL;
return head;
}

/*打印模块*/
struct list *printed(struct list *head)
{
struct list *p;
p=head;
printf("The data you put are:");
while(p!=NULL)
{
printf("%d->",p->data);
p=p->next;
}

printf("\b\b ");
return head;
}

/*硬盘数据写入模块*/
struct list *writed(struct list *head)
{
struct list *p;
p=head;
FILE *fp;
fp=fopen("c:\\1.txt","a+");
if(fp==NULL)
{
printf("Error open file!\n");
exit(0);
}
while(p!=NULL)
{
fprintf(fp,"%d\n",p->data);
p=p->next;
}
printf("The file had been well done!\n");
return head;

fclose(fp);
}

/*内存空间释放模块*/
void freed(struct list *head)
{
struct list *p;
p=head;
free(p);
}

/*主函数体*/
main()
{
struct list *phead;
phead=NULL;
phead=created();
phead=printed(phead);
phead=writed(phead);
freed(phead);
return 1;
}
...全文
32 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
老鱼趣多多 2003-07-13
  • 打赏
  • 举报
回复
你指的得到长度是得到什么的长度呢?
listshyp 2003-07-13
  • 打赏
  • 举报
回复
用一个结构指针数组str[N]同时指向它的首地址
----------------------------
不明白为什么要用这个数组.完全可以从头指针得到长度吗
tosa 2003-07-13
  • 打赏
  • 举报
回复
没调试,但感觉有多处错误:

struct list *created()
{
struct list *head;
int i;
struct list *p;
struct list *str[N];

// calloc是分配动态数组的做法,不是分配链表空间的做法
p=(struct list *)calloc(N,sizeof(struct list));

head=p;
str[0]=p;
for(i=0;i<N;i++)
{
printf("please enter a data:\n");
scanf("%d",&str[i]->data);


// str已经是(struct list *)类型了,所以移到下一个元素只需+1,
// 不能+(sizeof(p)),极有可能是这引起的错误。
str[i+1]=str[i]+(sizeof(p));

str[i]->next=str[i+1];
}

str[i-1]->next=NULL;
return head;
}
老鱼趣多多 2003-07-13
  • 打赏
  • 举报
回复
问题就是出现在created()函数的返回上,请指教!

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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