moon19961996 2019-04-05 20:58 采纳率: 66.7%
浏览 238
已采纳

双向链表,尾插函数用了之后得到结果不正常?

typedef struct Dlist //链表结构体
{
Dlist* p_head;
int data;
Dlist* p_last;
}Dlist;

void Initialization(int data, Dlist ** list) //初始化链表
{
Dlist * p = new Dlist;
p->data = data;
p->p_last = NULL;
p->p_head = NULL;
*list = p;
}

void InsertNode_head(int data, Dlist ** list) //头部插入
{
while ((*list)->p_last != NULL)
{
(*list)->p_last = (*list)->p_last->p_last;
}
Dlist * p = new Dlist;
p->data = data;
p->p_last = NULL;
p->p_head =*list;
(*list)->p_last = p;
*list = p;
}

void InsertNode_end(int data,Dlist**list) //尾部插入
{
while ((*list)->p_head != NULL)
{
(*list)->p_head = (*list)->p_head->p_head;
}
if ((*list)->p_head = NULL)
{
printf("我是空");
}

Dlist * p = new Dlist;
p->data = data;
p->p_last = *list;
p->p_head = NULL;
(*list)->p_head = p;

}void print(Dlist * list) //打印数据
{
while (list->p_last!=NULL)
{
list->p_last = list->p_last->p_last;
}
while (list->p_head!= NULL)
{
printf("%d\n", list->data);

    list  = list->p_head;
}
printf("最后一个数是:");
printf("%d", list->data);

}
//函数原型 void InsertNode(int data, Dlist * list); 其中data是需要插入的数据,list是链表的结构体指针
//链表的结构体中有如下内容 typedef struct Dlist { Node* p_head; Node* p_last; }Dlist;
int main()
{
Dlist* list = new Dlist;
Initialization(1, &list);
InsertNode_head(2, &list);
InsertNode_head(4, &list);

InsertNode_end(4, &list);

print(list);
getchar();

}

结果显示:
4
最后一个数:4

如果不用尾插函数一切正常,如果用了,显示结果就不正常,求大神解答
  • 写回答

1条回答 默认 最新

  • threenewbee 2019-04-05 21:21
    关注

    首先,P_Last这个名字我给你换了,因为它会误导人,双链表的前驱节点指针应该叫Prev(ious),而Last这个单词表示最后的意思,

    #include <iostream>
    using namespace std;
    
    typedef struct Dlist 
    {
        Dlist* p_Prev;
        int data;
        Dlist* p_Next;
    }Dlist;
    
    void Initialization(int data, Dlist ** list)
    {
        Dlist * p = new Dlist; 
        p->data = data;
    
        p->p_Next = NULL;
        p->p_Prev = NULL;
        *list = p;
    }
    
    void InsertNode_head(int data, Dlist ** list)
    {
        Dlist * p = new Dlist; 
        p->data = data;
        p->p_Next = *list;
        p->p_Prev = NULL;
        *list = p;
    }
    void InsertNode_end(int data,Dlist*list)
    {
        while (list->p_Next != NULL)   
        {
            list = list->p_Next;
        }
    
        Dlist * p = new Dlist; 
        p->data = data;        
        p->p_Next = NULL;      
        p->p_Prev = list;  
        list->p_Next = p;
    }
    
    void print(Dlist*list)
    {
        while (list != NULL)   
        {
            cout << list->data << " ";
            list = list->p_Next;
        }
    }
    
    int main()
    {
        Dlist* list = new Dlist;
        Initialization(1, &list);
        InsertNode_head(2, &list);
        InsertNode_head(4, &list);
        InsertNode_end(4, list);
        print(list);
        getchar();
    }
    

    4 2 1 4

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 虚拟机打包apk出现错误
  • ¥30 最小化遗憾贪心算法上界
  • ¥15 用visual studi code完成html页面
  • ¥15 聚类分析或者python进行数据分析
  • ¥15 逻辑谓词和消解原理的运用
  • ¥15 三菱伺服电机按启动按钮有使能但不动作
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝