月满霜华 发表于 2017-11-10 23:08:27

头结点问题

本帖最后由 月满霜华 于 2017-11-11 10:13 编辑

Node *InvertLink(Node *h)//链表的逆置
{
      Node *p,*q;
      p=h->next;
      h->next=NULL;
      while(p!=NULL)
      {
                q=p->next;
                p->next=h->next;
                h->next=p;
                p=q;
      }
      return h;
}
h->next=NULL是建立头结点吧,不理解{:10_262:} ,h是头指针?头指针的next本来是第一个结点的地址吧,为啥把他置空就建立了头结点啊。大佬请救救菜鸟吧,讲详细点,谢谢{:10_266:}

丶忘却的年少o 发表于 2017-11-10 23:11:31

本帖最后由 丶忘却的年少o 于 2017-11-10 23:13 编辑

我也是一脸懵逼,快请大神{:10_245:}

BngThea 发表于 2017-11-10 23:13:01

需要付费才能看?
{:10_249:}

ba21 发表于 2017-11-10 23:52:08

BngThea 发表于 2017-11-10 23:13
需要付费才能看?

{:10_319:}

月满霜华 发表于 2017-11-10 23:52:36

BngThea 发表于 2017-11-10 23:13
需要付费才能看?

额,那个不是给报酬的吗?第一次弄这个,不太懂,抱歉

月满霜华 发表于 2017-11-10 23:54:55

丶忘却的年少o 发表于 2017-11-10 23:11
我也是一脸懵逼,快请大神

大神在哪?{:10_250:}

知表不言 发表于 2017-11-11 11:55:05

变量名定义最好有点含义,不要全是单个的字母,还有你说的逆置是什么意思,如果是把链表头尾颠倒的话可以试试这样行不行


Node *InvertLink(Node *h)//链表的逆置
{
      if(h->next == NULL)
      {return h;}

      Node *current,*prior,*temp;//当前处理节点 前一个节点 临时节点
      prior = h->next;
      current = prior->next;
      prior->next = NULL;
      temp = next = NULL;
      while(current->next != NULL)
      {
                temp=current->next;
                current->next=prior;
                current=temp;
      }
      current->next=prior;
      h = current;
      return h;
}

知表不言 发表于 2017-11-11 11:56:43

上层多了个next删掉即可

知表不言 发表于 2017-11-11 11:57:42

就是temp = next = NULL;改为temp = NULL;

月满霜华 发表于 2017-11-11 13:33:49

知表不言 发表于 2017-11-11 11:55
变量名定义最好有点含义,不要全是单个的字母,还有你说的逆置是什么意思,如果是把链表头尾颠倒的话可以试 ...

就地逆置就是把单链表递增的顺序改成递减,且不另建新节点,利用原有节点

zqianglh 发表于 2017-11-11 13:41:59

多级指针
头指针 头节点 首节点(以及增加节点Node 各指针的指向)
链条增加一环 只需要改变相邻节点指针的指向
比如Head节点->Tail节点 增加b节点变成Head->b->Tail
再增加一个节点 就成了   Head->b->??->Tail
节点有指针域 data域
你创建HeadNode时,需要初始化数据域值 和 指针域值
h->next=NULL 是初始化NULLh->next是一个随机值有可能会使程序出现意外的错误
理清指针指向就好

月满霜华 发表于 2017-11-11 14:01:03

知表不言 发表于 2017-11-11 11:57
就是temp = next = NULL;改为temp = NULL;

我不是问怎么逆置,就想知道建立头节点那地方,为什么把头指针的next域置空就成功建立头节点了,建成的话头节点不就接在头指针后面吗?又说头指针后面是空的,这不是矛盾嘛{:10_257:}

shuofxz 发表于 2017-11-11 14:37:38

你这个程序是哪里找的呀?
我把流程过了一遍发现是有问题的呀,先不说h->next=NULL那块是如何表示头结点的,while循环里面的逆置流程也不对呀

月满霜华 发表于 2017-11-11 15:42:39

这个人写的

橙C 发表于 2017-11-11 16:49:06

{:10_257:}{:10_257:}看不懂~~~大婶在那里....

zqianglh 发表于 2017-11-12 00:20:53

Node *InvertLink(Node *h)
//创建函数
{
      Node *p,*q;
//建2个指针
      p=h->next;
//把h节点 指针域所指向的 节点 赋值给P
//这时p 和 h->next都有了 h->next所指向的那个节点的地址
      h->next=NULL;
//清空h->next(这里只有置空的作用没有 就建立了头结点这一说法)
      while(p!=NULL)
      {
                q=p->next;
                p->next=h->next;
//此时h->next为NULL,把一个NULL赋值给p->next 此时p->next=NULL达不到逆置的作用
//h->next=NULL 这句应该需要删除
                h->next=p;
                p=q;
      }
      return h;
}

月满霜华 发表于 2017-11-13 12:34:44

zqianglh 发表于 2017-11-12 00:20
Node *InvertLink(Node *h)
//创建函数
{


网上各个版本都说那个地方是建立头节点,而且把它置空这一句是整个逆置函数的核心,即把原来的头节点拆下来,再利用头插法把原链表后面的节点一个一个头节点插过来。{:10_245:}哥们儿你应该不知道啥是单链表的逆置吧

月满霜华 发表于 2017-11-13 12:36:54

算法思想:逆置链表初始为空,表中节点从原链表中依次“删除”,再逐个插入逆置链表的表头(即“头插”到逆置链表中),使它成为逆置链表的“新”的第一个结点,如此循环,直至原链表为空。

zqianglh 发表于 2017-11-13 23:10:47

本帖最后由 zqianglh 于 2017-11-13 23:17 编辑

head=(node*)malloc(sizeof(node));
head->next=NULL;
//这2句的意思是 1) 分配一个空间 2) 初始化head->next
//这2步的计算机作用 加上 人为主观告知 说明我在这里新建的节点是头节点
h->next=NULL;(加上主程序的节点空间分配) 合在一起说建立一个头节点????

月满霜华 发表于 2017-11-14 00:18:14

zqianglh 发表于 2017-11-13 23:10
head=(node*)malloc(sizeof(node));
head->next=NULL;
//这2句的意思是 1) 分配一个空间 2) 初始化he ...

what?啥叫计算机作用和人为告知。。{:10_249:}
页: [1] 2
查看完整版本: 头结点问题