| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 929 人关注过本帖
标题:求助:链表头节点插入数据,调用时又出现不确定的数据
只看楼主 加入收藏
lanke711
Rank: 9Rank: 9Rank: 9
来 自:流浪在天国之路
等 级:蜘蛛侠
威 望:7
帖 子:317
专家分:1437
注 册:2015-7-16
结帖率:100%
收藏
已结贴  问题点数:40 回复次数:2 
求助:链表头节点插入数据,调用时又出现不确定的数据
程序代码:
// liaobiao11.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"

void vprit(struct List_num* vhead);
//==============================================

/*创建链表结构体*/

 typedef struct List_num{
    int iscrose;
    struct List_num* lnext;
}List_num;


//===============================================
/*创建链表*/


 int i;                                                                //记录节点
struct List_num* lscreate()
{
    List_num* lhead, *lnew, *lend;
    int inum;                                                        //声明一个变量用来录入数据
    lhead = (struct List_num*)malloc(sizeof(struct List_num));        //创建头节点
    if (lhead == NULL)                                                //如果创建头节点失败,返回NULL
    {
        printf("头节点创建失败!\n");
        return NULL;
    }
    lhead->lnext = NULL;                                            //头节点指针域初始化为空
    lend = lhead;                                                    //指针尾部指向头节点
    i = 0;                                                            //初始化i为0,开始记录节点
                                                            
    lnew = (struct List_num*)malloc(sizeof(struct List_num));        //创建新节点
    if (lnew->lnext == NULL)                                        //如果新节点创建失败,返回NULL
    {
        printf("创建新节点失败!\n");
        return NULL;
    }

    printf("请录入数据:\n");        
    scanf_s("%d", &inum);                                            //录入数据

    while (inum > 0)                                                //如果录入的数据大于0,
    {
        i++;                                                        //节点递增
        lnew->iscrose = inum;                                        //新节点保存数据
        if (lhead == NULL)                                            //如果头节点为空时,数据保存在头节点
        {
            lhead = lnew;
        }
        else
        {
            lnew->lnext = NULL;                                        //置空新节点下一节点
            lend->lnext = lnew;                                        //尾部指针域指向新节点
            lend = lnew;                                            //指针尾部抽指新节点            
        }
        lnew = (struct List_num*)malloc(sizeof(struct List_num));    //再次分配新节点
        printf("请录入数据:\n");                
        scanf_s("%d", &inum);                                        //录入数据
    }
    lnew->lnext = NULL;                                                //置空新节点指针域
    return lhead;
}


/*表头插入数据*/
/*n为要插入的数据*/
struct List_num* Linsert(List_num *Lhead, int n)
{
    struct List_num* itemp1, *itemp2;                                //最后调用vprit(itemp2),所以,在之前,itemp2=Lhead.
    itemp1 = (struct List_num*)malloc(sizeof(struct List_num));        //创建新节点itemp1
    if (itemp1 == NULL)                                                //如果新节点itemp1为NULL时,返回NULL
    {
        printf("分配新节点失败:\n");
        return NULL;
    }
    else
    {
        i++;                                                        //节点增加
        itemp1->iscrose = n;                                        //新节点保存插入的数据
        itemp1->lnext = Lhead;                                        //新节点指针域指向头节点
        Lhead = itemp1;                                                //指针头节点指向新节点    
    }
    itemp2 = Lhead;                                                    
    vprit(itemp2);                                                    //调用vprit()打印
    return Lhead;

}


//================================================================
/*打印链表*/
void vprit(struct List_num* vhead)
{
    List_num *p1;
    p1 = vhead;                                        //p1保存头节点
    if (p1 == NULL)                                    //如果p1为NULL时,提示链表为空
    {
        printf("链表为空!\n");
        
    }
    p1 = p1->lnext;                                    //新节点指针指向下一节点
    while (p1!= NULL)
    {
        printf("节点数为:%d\n", i);
        printf("输入的数据为:%d\n",p1->iscrose);
        p1 = p1->lnext;                                //指向下一节点
    }
}


/*主函数*/
int _tmain(int argc, _TCHAR* argv[])
{
    List_num* itemp;
    int n;                                //用来录入插入的数据
    itemp = lscreate();                    //创建链表
    vprit(itemp);                        //打印链表
    printf("请输入要插入的数据:\n");
    scanf_s("%d", &n);                    //录入要插入的数据    
    Linsert(itemp, n);                    //调用Linsert()插入数据
    return 0;
}



在调试中,虽然运行成功。但是插入的数据完全是错误的。

调试情况如下:
请录入数据:
11
请录入数据:
12
请录入数据:
13
请录入数据:
14
请录入数据:
0
节点数为:4
输入的数据为:11
节点数为:4
输入的数据为:12
节点数为:4
输入的数据为:13
节点数为:4
输入的数据为:14

请输入要插入的数据:
17
节点数为:5
输入的数据为:-842150451
节点数为:5
输入的数据为:11
节点数为:5
输入的数据为:12
节点数为:5
输入的数据为:13
节点数为:5
输入的数据为:14
请按任意键继续. . .



求助前辈,这要怎么修正。
2015-12-19 13:08
newdos
Rank: 9Rank: 9Rank: 9
等 级:禁止访问
威 望:6
帖 子:251
专家分:1169
注 册:2012-8-13
收藏
得分:40 
struct List_num* Linsert(List_num *Lhead, int n)
{
    struct List_num* itemp1, *itemp2;                                //最后调用vprit(itemp2),所以,在之前,itemp2=Lhead.
    itemp1 = (struct List_num*)malloc(sizeof(struct List_num));        //创建新节点itemp1
    if (itemp1 == NULL)                                                //如果新节点itemp1为NULL时,返回NULL
    {
        printf("分配新节点失败:\n");
        return NULL;
    }
    else
    {
        i++;                                               //节点增加
        itemp1->iscrose = n;                               //新节点保存插入的数据
        itemp1->lnext = Lhead->lnext;              //新节点指针域指向头节点
        Lhead->lnext = itemp1;                     //指针头节点指向新节点   
    }
    itemp2 = Lhead;                                                   
    vprit(itemp2);                                         //调用vprit()打印
    return Lhead;

}
2015-12-19 15:12
lanke711
Rank: 9Rank: 9Rank: 9
来 自:流浪在天国之路
等 级:蜘蛛侠
威 望:7
帖 子:317
专家分:1437
注 册:2015-7-16
收藏
得分:0 
谢谢

普通人之所以普通,是因为他们普遍有一个通病,那就是认为自己永远普通。
千夫所指,我亦坚持。就算被所有人误解,我也照样守护这一切。
我们总是觉得,这些灵魂的表情,傲慢自大,目中无人,其实,真正目中无人的是我们。它们傲慢的不过是表情,而我们傲慢的却是行为!
记得,是为了忘记!
只要想着有那么一天,我就能忍受现在的每一天!
灾难并不可怕,可怕的是心中没有了希望。
你以为我在天堂,其实我正在路上。
当你觉得自己走不到终点的时候,请不要放弃。或许你的对手也是这种感觉。
2015-12-19 22:41
快速回复:求助:链表头节点插入数据,调用时又出现不确定的数据
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.170877 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved