单链表的c实现问题。

hyneal 2009-05-16 12:04:01
问题见代码~

#define ElemType int

typedef struct node{
ElemType data;
struct node *next;
}Lnode;

void outline(Lnode *);
void create();
void insert(Lnode *h,ElemType x,ElemType y);
void ldelete(Lnode *h,ElemType x);

Lnode *p,*q,*s,*head;

int main(){
int i,x,y,cord;
do{
printf("\n 主菜单 \n");
printf("\n 1 建立线性表 \n");
printf("\n 2 插入一个元素 \n");
printf("\n 3 删除一个元素 \n");
printf("\n 4 结束程序 \n");
printf("-----------------\n");
printf("请输入您的选择(1,2,3,4)");
scanf("%d",&cord);
switch(cord){
case 1:{
create();
outline(head);
}
break;
case 2:{
printf("\n x,y=? 注意用逗号分隔");
scanf("%d%d",&x,&y);
insert(head,x,y);
outline(head);
}
break;
case 3:{
printf("\n 请输入删除的位置 i: ");
scanf("%d",&i);
ldelete(head,i);
outline(head);
}
break;
case 4:exit(0);
}
}while(cord<=4);

return 0;
}

void create(){
ElemType x;
Lnode *ptr;
head=(Lnode *)malloc(sizeof(Lnode));
head->next=NULL;
p=head;
printf("\n x=? ");
scanf("%d",&x);
while(x!=-999){
ptr=(Lnode *)malloc(sizeof(Lnode));
ptr->data=x;
ptr->next=NULL;
p->next=ptr;// 我的问题在这里,为什么这里head->next=p->next?不明白,为什么会自动插到head里面去
p=ptr;
printf("\n x=? ");
scanf("%d",&x);
}
}

void outline(Lnode *h){
p=h->next;
printf("\n ");
while(p!=NULL){
printf(" data=%4d",p->data);
p=p->next;
}
printf("\n 输出结束\n\n");
}

void insert(Lnode *h,ElemType x,ElemType y){
s=(struct node*)malloc(sizeof(struct node));
s->data=y;
q=h;
p=h->next;
while(p!=NULL&&p->data!=x){
q=p;
p=p->next;
}
q->next=s;
s->next=p;
}

void ldelete(Lnode *h,ElemType x){
p=h;
while(p->next!=NULL&&p->next->data!=x){
p++;
}
if(p->next==NULL){
printf("\n x 不存在 !");
}else{
q=p->next;
p->next=q->next;
free(q);
}
}
...全文
155 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
dinghdong 2009-05-16
  • 打赏
  • 举报
回复
顶 6楼 7楼
ahui5252 2009-05-16
  • 打赏
  • 举报
回复
ptr->data=x;
ptr->next=NULL;
p->next=ptr;// 我的问题在这里,为什么这里head->next=p->next?不明白,为什么会自动插到head里面去
p=ptr;

那来的head->next=p->next??

head保存了表头,p从表头开始把之后的数都链接进链表,p->next=ptr,把ptr空间与链表相连,p=ptr;让p指向ptr空间,
这样再有新申请空间才能从上一个ptr空间链接下去,也就是重复用上几行代码
magipan 2009-05-16
  • 打赏
  • 举报
回复
ptr=(Lnode *)malloc(sizeof(Lnode));//新建一个结点
ptr->data=x;//存入数据
ptr->next=NULL;//新结点指针置空
p->next=ptr;//p为链表原来最后的一个结点,现在在p的后面接上新结点,则ptr是新的最后结点
p=ptr;//p指向ptr,p成为链表最后的一个结点
hyneal 2009-05-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 allen1986 的回复:]
很正常啊,新键一个连表啊。新键的接点放在头接点的后面啊。
[/Quote]
怎么实现的?
allen1986 2009-05-16
  • 打赏
  • 举报
回复
很正常啊,新键一个连表啊。新键的接点放在头接点的后面啊。
datacode 2009-05-16
  • 打赏
  • 举报
回复
答案见楼下...
hyneal 2009-05-16
  • 打赏
  • 举报
回复
谢谢帮顶,一个上午都在调试,不知道为啥。。。。
暗示的减肥 2009-05-16
  • 打赏
  • 举报
回复
up
hyneal 2009-05-16
  • 打赏
  • 举报
回复
我重新看了调试时变量存储情况。。。
在p->next=ptr时,p中存储的地址与head是一样的,所以就。。。。
艾,失误。。。。
谢谢大家

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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