关于单链表的头插入和尾插入法

anequitousse 2013-07-04 02:49:59
最近在自学数据结构,下面是单链表头插入和尾插入的代码
typedef struct Lnode
{
ElemType data;
struct Lnode *next;
}Lnode;

Lnode *createHead_LinkList(void)
{
int data;
Lnode *head,*p;
head=(Lnode *)malloc(sizeof(Lnode));
head->next=NULL;

while(1)
{
scanf("%d",&data);
if(data==32767) break;
p=(Lnode *)malloc(sizeof(Lnode));
p->data=data;
p->next=head->next;
head->next=p;
}
return head;
}

Lnode *createRear_LinkList(void)
{
int data;
Lnode *head,*p,*q;
head=p=(Lnode *)malloc(sizeof(Lnode));
p->next=NULL;
while(1)
{
scanf("%d", &data);
if(data==32767) break;
q=(Lnode *)malloc(sizeof(Lnode));
q->data=data;
q->next=p->next;
p->next=q;
p=q;
}
return head;
}

我不太清楚这几行代码是如何完成插入的。求解释
p->next=head->next;
head->next=p;

 q->next=p->next;
p->next=q;
p=q;

...全文
580 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
544wss 2014-03-11
  • 打赏
  • 举报
回复
引用 8 楼 my_live_123 的回复:

头插入
|0|->|a|->|b|
|0|是头结点head
p->|n|->NULL;新建结点,next没有指向,暂时认为NULL,把p插入到0a之间

p->next = head->next
      p
      |
|0|->|a|->|b|

head->next = p
|0|->p
     |
    |a|->|b|
即
|0|->|n|->|a|->|b|


末尾插入
|0|->|a|->|b|->NULL
|0|是头结点head;p->|b|;p->next = NULL
q->|n|->NULL;新建结点,next没有指向,暂时认为NULL,把q插入到p之后

q->next = p->next;
           p    q
           |    |
|0|->|a|->|b|->NULL

p->next = q;

           p -> q
           |    |
|0|->|a|->|b|  NULL 

p = q;//因为p要始终指向最后一个结点,前面插入一个后,p就要后移
                p
                |          
|0|->|a|->|b|->|n|->NULL

        
我是在回复框内编辑的内容,不知道提交后会不会错位。 总之,要理解思想,我简单的模拟下,应该能理解。自己画拉下就明白了。
我看懂了,谢谢
幻竹 2013-07-06
  • 打赏
  • 举报
回复
地址不变,前一个指向下一个节点的前地址
LubinLew 2013-07-06
  • 打赏
  • 举报
回复
记住指针变量只是节点的一个名字, 节点所在的物理地址不变,但是节点可以换名字或有多个名字
anequitousse 2013-07-06
  • 打赏
  • 举报
回复
引用 12 楼 my_live_123 的回复:
[quote=引用 11 楼 a174787252 的回复:] [quote=引用 8 楼 my_live_123 的回复:]

头插入
|0|->|a|->|b|
|0|是头结点head
p->|n|->NULL;新建结点,next没有指向,暂时认为NULL,把p插入到0a之间

p->next = head->next
      p
      |
|0|->|a|->|b|

head->next = p
|0|->p
     |
    |a|->|b|
即
|0|->|n|->|a|->|b|


末尾插入
|0|->|a|->|b|->NULL
|0|是头结点head;p->|b|;p->next = NULL
q->|n|->NULL;新建结点,next没有指向,暂时认为NULL,把q插入到p之后

q->next = p->next;
           p    q
           |    |
|0|->|a|->|b|->NULL

p->next = q;

           p -> q
           |    |
|0|->|a|->|b|  NULL 

p = q;//因为p要始终指向最后一个结点,前面插入一个后,p就要后移
                p
                |          
|0|->|a|->|b|->|n|->NULL

        
我是在回复框内编辑的内容,不知道提交后会不会错位。 总之,要理解思想,我简单的模拟下,应该能理解。自己画拉下就明白了。
你画出来的 你很懂 但是他不一定能看懂[/quote] 那就看lz的悟性了[/quote] thanx i see
zybjtu 2013-07-05
  • 打赏
  • 举报
回复
看看算法导论,学学画图,就好了
一根烂笔头 2013-07-05
  • 打赏
  • 举报
回复
引用 11 楼 a174787252 的回复:
[quote=引用 8 楼 my_live_123 的回复:]

头插入
|0|->|a|->|b|
|0|是头结点head
p->|n|->NULL;新建结点,next没有指向,暂时认为NULL,把p插入到0a之间

p->next = head->next
      p
      |
|0|->|a|->|b|

head->next = p
|0|->p
     |
    |a|->|b|
即
|0|->|n|->|a|->|b|


末尾插入
|0|->|a|->|b|->NULL
|0|是头结点head;p->|b|;p->next = NULL
q->|n|->NULL;新建结点,next没有指向,暂时认为NULL,把q插入到p之后

q->next = p->next;
           p    q
           |    |
|0|->|a|->|b|->NULL

p->next = q;

           p -> q
           |    |
|0|->|a|->|b|  NULL 

p = q;//因为p要始终指向最后一个结点,前面插入一个后,p就要后移
                p
                |          
|0|->|a|->|b|->|n|->NULL

        
我是在回复框内编辑的内容,不知道提交后会不会错位。 总之,要理解思想,我简单的模拟下,应该能理解。自己画拉下就明白了。
你画出来的 你很懂 但是他不一定能看懂[/quote] 那就看lz的悟性了
_暮落_ 2013-07-05
  • 打赏
  • 举报
回复
引用 8 楼 my_live_123 的回复:

头插入
|0|->|a|->|b|
|0|是头结点head
p->|n|->NULL;新建结点,next没有指向,暂时认为NULL,把p插入到0a之间

p->next = head->next
      p
      |
|0|->|a|->|b|

head->next = p
|0|->p
     |
    |a|->|b|
即
|0|->|n|->|a|->|b|


末尾插入
|0|->|a|->|b|->NULL
|0|是头结点head;p->|b|;p->next = NULL
q->|n|->NULL;新建结点,next没有指向,暂时认为NULL,把q插入到p之后

q->next = p->next;
           p    q
           |    |
|0|->|a|->|b|->NULL

p->next = q;

           p -> q
           |    |
|0|->|a|->|b|  NULL 

p = q;//因为p要始终指向最后一个结点,前面插入一个后,p就要后移
                p
                |          
|0|->|a|->|b|->|n|->NULL

        
我是在回复框内编辑的内容,不知道提交后会不会错位。 总之,要理解思想,我简单的模拟下,应该能理解。自己画拉下就明白了。
你画出来的 你很懂 但是他不一定能看懂
艾薇儿More 2013-07-04
  • 打赏
  • 举报
回复
那笔画画就知道 了
一根烂笔头 2013-07-04
  • 打赏
  • 举报
回复

头插入
|0|->|a|->|b|
|0|是头结点head
p->|n|->NULL;新建结点,next没有指向,暂时认为NULL,把p插入到0a之间

p->next = head->next
      p
      |
|0|->|a|->|b|

head->next = p
|0|->p
     |
    |a|->|b|
即
|0|->|n|->|a|->|b|


末尾插入
|0|->|a|->|b|->NULL
|0|是头结点head;p->|b|;p->next = NULL
q->|n|->NULL;新建结点,next没有指向,暂时认为NULL,把q插入到p之后

q->next = p->next;
           p    q
           |    |
|0|->|a|->|b|->NULL

p->next = q;

           p -> q
           |    |
|0|->|a|->|b|  NULL 

p = q;//因为p要始终指向最后一个结点,前面插入一个后,p就要后移
                p
                |          
|0|->|a|->|b|->|n|->NULL

        
我是在回复框内编辑的内容,不知道提交后会不会错位。 总之,要理解思想,我简单的模拟下,应该能理解。自己画拉下就明白了。
qzf362269994 2013-07-04
  • 打赏
  • 举报
回复
打错了.. p->next=head->next; //p->next指向head后面的结点 head->next=p; 每次添加的元素都插入到头结点的后面(头插法) q->next=p->next; //q->next=NULL p->next=q; //把q插入到链表末尾 p=q; //p指向链表末尾结点 每次添加的元素都插入到链表的末尾(尾插法)
qzf362269994 2013-07-04
  • 打赏
  • 举报
回复
p->next=head->next;//(p->next=NULL) head->next=p; 每次添加的元素都插入到头结点的后面(头插法) q->next=p->next; //q->next=NULL p->next=q; p=q; 每次添加的元素都插入到链表的末尾(尾插法)
猪头小哥 2013-07-04
  • 打赏
  • 举报
回复
引用 3 楼 ForestDB 的回复:
拿个纸笔画画,或者用debugger跟踪。
动手用笔画一画是最清楚的。
starytx 2013-07-04
  • 打赏
  • 举报
回复
拿个笔画一下比较形象的就理解了 p1 = p2;的意思就是 p1指向p2指向的内存(也就是说两者的值相同,指向相同的地方)
qzf362269994 2013-07-04
  • 打赏
  • 举报
回复
引用 4 楼 anequitousse 的回复:
[quote=引用 2 楼 qzf362269994 的回复:] 打错了.. p->next=head->next; //p->next指向head后面的结点 head->next=p; 每次添加的元素都插入到头结点的后面(头插法) q->next=p->next; //q->next=NULL p->next=q; //把q插入到链表末尾 p=q; //p指向链表末尾结点 每次添加的元素都插入到链表的末尾(尾插法)
那head->next=p;是什么意思?[/quote] 把p插入到head指针的后面,p->next指向原来head指针后面的节点
anequitousse 2013-07-04
  • 打赏
  • 举报
回复
引用 2 楼 qzf362269994 的回复:
打错了.. p->next=head->next; //p->next指向head后面的结点 head->next=p; 每次添加的元素都插入到头结点的后面(头插法) q->next=p->next; //q->next=NULL p->next=q; //把q插入到链表末尾 p=q; //p指向链表末尾结点 每次添加的元素都插入到链表的末尾(尾插法)
那head->next=p;是什么意思?
ForestDB 2013-07-04
  • 打赏
  • 举报
回复
拿个纸笔画画,或者用debugger跟踪。

69,371

社区成员

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

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