共2条
1/1 1 跳转至页
keilC keilC 中建立单链表程序,大侠们看看是哪的毛病
问
struct det{
uchar hole;
uint sn; //序列号
uchar stat; //状态
struct det *next; //下一个地址
};
typedef struct det list;
/*---------------------建立单链表------------------------------------*/
list * creat(void) /*建立单链表的函数*/
{list *p,*h,*s; /* *h保存表头结点的指针,*p指向当前结点的前一个结点,*s指向当前结点*/
h=(list *)malloc(sizeof(list)); /*分配空间并检测*/
h->hole='\0';
h->sn='\0'; /*把表头结点的数据域置空*/
h->stat='\0';
h->next=NULL; /*把表头结点的链域置空*/
p=h; /*p指向表头*/
s= (list *) malloc(sizeof(list)); /*分配新存储空间并检测*/
p->next=s; /*把s的地址赋给p所指向的结点的链域,这样就把p和s所指向的结点连接起来了*/
s->hole=0;
s->sn=0;
s->stat=0;
s->next=NULL;
return h;
}
list * search(char n) /*查找链表的函数,n要查找的坑号,当前结点的坑号小于n,后结点的坑号小于n,用于执行插入前确定位置,返回<n的结点指针*/
{ list *p,*p1; /*p当前指针,指向要与所查找的坑号比较的结点,,p1后一结点的指针*/
char y; /*保存结点数据域内坑号的变量*/
p=head->next;
while(p!=NULL)
{ y=p->hole;
p1=p->next;
if((p->next)!=NULL&&y<n&&n<(p1->hole)) /*把数据域里的坑号与所要查找的坑号比较,若相同则返回0,即条件成立*/
return p; /*返回与所要查找结点的地址*/
else
p=p->next;
}
if(p==NULL&&(p->hole)<n) return p;
}
void insert(n,pin1,st1) /*插入坑号为n,序列码为pin1,状态字为st1的结点*/
{ list *s; /*指针s是保存新结点地址的*/
list *p;
if(n!=1)
{ p=search(n);
s= (list *)malloc(sizeof(list));
s->hole=n;
s->sn=pin1;
s->stat=st1;
s->next=p->next; /*把新结点的链域指向原来p结点的后继结点*/
p->next=s; /*p结点的链域指向新结点*/
}
else{
s= (link) malloc(sizeof(list));
s->hole=n;
s->sn=pin1;
s->stat=st1;
s->next=head->next; /*把新结点的链域指向原来p结点的后继结点*/
head->next=s; /*p结点的链域指向新结点*/
}
}
void main(void)
{ list *head;
int y;
y=init_mempool(0x1000,sizeof(list)*200);
head=creat();
insert(1,12345,0x81);
insert(2,23540,0x85);
}
各位GGJJ帮忙看看,这程序有什么毛病,我的本意是想建立的一个单链表,只有个头结点和尾,然后在插入两个结点,结果在执行插入操作时,这两个结点分配的空间地址s都为0x0000,所以导致每插入一个就将之前插入的那个结点给覆盖掉了,但是在创建链表程序中melloc函数返回的值却是正确的,郁闷 答 1: malloc 返回分配的地址空间,如果失败应该返回0
uchar hole;
uint sn; //序列号
uchar stat; //状态
struct det *next; //下一个地址
};
typedef struct det list;
/*---------------------建立单链表------------------------------------*/
list * creat(void) /*建立单链表的函数*/
{list *p,*h,*s; /* *h保存表头结点的指针,*p指向当前结点的前一个结点,*s指向当前结点*/
h=(list *)malloc(sizeof(list)); /*分配空间并检测*/
h->hole='\0';
h->sn='\0'; /*把表头结点的数据域置空*/
h->stat='\0';
h->next=NULL; /*把表头结点的链域置空*/
p=h; /*p指向表头*/
s= (list *) malloc(sizeof(list)); /*分配新存储空间并检测*/
p->next=s; /*把s的地址赋给p所指向的结点的链域,这样就把p和s所指向的结点连接起来了*/
s->hole=0;
s->sn=0;
s->stat=0;
s->next=NULL;
return h;
}
list * search(char n) /*查找链表的函数,n要查找的坑号,当前结点的坑号小于n,后结点的坑号小于n,用于执行插入前确定位置,返回<n的结点指针*/
{ list *p,*p1; /*p当前指针,指向要与所查找的坑号比较的结点,,p1后一结点的指针*/
char y; /*保存结点数据域内坑号的变量*/
p=head->next;
while(p!=NULL)
{ y=p->hole;
p1=p->next;
if((p->next)!=NULL&&y<n&&n<(p1->hole)) /*把数据域里的坑号与所要查找的坑号比较,若相同则返回0,即条件成立*/
return p; /*返回与所要查找结点的地址*/
else
p=p->next;
}
if(p==NULL&&(p->hole)<n) return p;
}
void insert(n,pin1,st1) /*插入坑号为n,序列码为pin1,状态字为st1的结点*/
{ list *s; /*指针s是保存新结点地址的*/
list *p;
if(n!=1)
{ p=search(n);
s= (list *)malloc(sizeof(list));
s->hole=n;
s->sn=pin1;
s->stat=st1;
s->next=p->next; /*把新结点的链域指向原来p结点的后继结点*/
p->next=s; /*p结点的链域指向新结点*/
}
else{
s= (link) malloc(sizeof(list));
s->hole=n;
s->sn=pin1;
s->stat=st1;
s->next=head->next; /*把新结点的链域指向原来p结点的后继结点*/
head->next=s; /*p结点的链域指向新结点*/
}
}
void main(void)
{ list *head;
int y;
y=init_mempool(0x1000,sizeof(list)*200);
head=creat();
insert(1,12345,0x81);
insert(2,23540,0x85);
}
各位GGJJ帮忙看看,这程序有什么毛病,我的本意是想建立的一个单链表,只有个头结点和尾,然后在插入两个结点,结果在执行插入操作时,这两个结点分配的空间地址s都为0x0000,所以导致每插入一个就将之前插入的那个结点给覆盖掉了,但是在创建链表程序中melloc函数返回的值却是正确的,郁闷 答 1: malloc 返回分配的地址空间,如果失败应该返回0
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |