这个代码错得太奇怪了,求大神帮忙啊关于内存储器分配
这个代码错得太奇怪了,,,求大神帮忙啊....关于内存分配
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
//////电话本存储结构//////////
typedef enum {ERROR, OK} Status; //用枚举数据类型定义函数返回状态, ERROR == 0, OK == 1.
typedef struct //定义数据的结构
{
char name[24]; //存姓名
char tele_num[24]; //存号码
}ElemType; //ElemType 作为链表数据域数据类型
typedef struct node//定义结点的结构
{
ElemType data; //存放数据
int length; //表长, 只有头结点用, 其他结点不用这个变量
struct node *next; //指向下一个结点的指针
}*PhoneLink, PhoneNode;
///////电话本基本操作/////////
//-----链表基本操作-----//
/*
1.初始化
操作结果: 建立一张带头结点的空链表.
*/
Status InitPhoneBook(PhoneLink *PBook)
{
*PBook = (PhoneLink)malloc(sizeof(sizeof(PhoneNode))); //申请头结点所需内存
assert(*PBook); //检测内存是否合法
(*PBook)->next = NULL; //最初使头结点next指针指向空.
(*PBook)->length = 0; //最初表长为0.
return OK;
}
/*
2.插入节点.
操作条件: 插入的位置合法.
操作结果: 在指定位置插入新的结点.
函数说明: pos表示位序, 即结点属于第几个位置,除头结点外,
第一个结点的位序为1, 后面的一次类推.
*/
Status ListInsert(PhoneLink Book, int pos, ElemType data) //pos表示插入的位置.范围是1~length+1.
{
int i = 0; //最初位置为0
PhoneLink p = Book; //头指针的位置为0.虽然不科学, 没有0这个位置,但是这样很好理解.
PhoneLink p_new; //保存新增的结点地址
//判断插入条件是否满足(位序是否合法)
if(pos < 0 || pos > Book->length + 1)
{
fprintf(stderr, "对不起, 插入位置错误."); //向错误流输出错误
return ERROR;
}
//p开始定位到pos-1的位置.
while(p != NULL && i < pos - 1) //找到pos前一个位置
{
p = p->next;
++i;
}
p_new = (PhoneLink)malloc(sizeof(PhoneNode)); //申请新的结点
assert(p_new); //检测是否成功申请内存
p_new->data = data; // C语言中, 结构体可以直接赋值
//插入的两个步骤
p_new->next = p->next;
p->next = p_new;
//表长加一
Book->length += 1;
return OK;
}
//-----电话本附加操作-----//
/*
从文本中载入电话号码信息
操作条件:链表存在.
操作结果:将保存的信息载入到电话本中, 然后进入主菜单
*/
Status LoadFile(PhoneLink Book)
{
FILE *fp;
ElemType data; //定义一个数据元素, 含有2个数据
int pos = 1; //插入位置, 采用尾部插入方法, 即每次都在表尾插入, 简称尾插法.
assert(Book); //检测链表是否存在, Book == NULL表不存在, Book->next == NULL表示该表位空表.
if((fp = fopen("tele.txt", "r")) == NULL) //以读的方式打开文本 tele.txt
return ERROR; //读取失败
while(fscanf(fp, "%s %s", data.name, data.tele_num) != EOF)
{
ListInsert(Book, pos++, data);
}
return OK;
}
////////////main/////////////
int main(void)
{
PhoneLink Book, p;
InitPhoneBook(&Book);
LoadFile(Book);
p = Book->next;