| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1229 人关注过本帖
标题:关于链表修改某节点值的问题(调试就是不会改)?
只看楼主 加入收藏
lanke711
Rank: 9Rank: 9Rank: 9
来 自:流浪在天国之路
等 级:蜘蛛侠
威 望:7
帖 子:317
专家分:1437
注 册:2015-7-16
结帖率:100%
收藏
已结贴  问题点数:40 回复次数:6 
关于链表修改某节点值的问题(调试就是不会改)?
问题:找到某个节点,然后把这个节点的数值改成为其它值
     调试运行值依然没有改变,还是原来那个数据,并没有变成修改后的数据。
不知道错在哪里,请指导!

程序代码:
#include "stdio.h"
#include "stdlib.h"
//=================================================================
struct num_list
{
    int inum;
    struct num_list* nnext;
};


int i;                //记录节点

//==================================================================
/*创建链表*/
struct num_list* iscreate()                    
{    i=0;
    int datanum_1;
    struct num_list* itemp_1,*iend,*ihead;
    ihead=(struct num_list*)malloc(sizeof(struct num_list));
    if(ihead==NULL)
    {
        printf("头节点申请空间失败!\n");
        return NULL;
    }
    iend=ihead;

    printf("请输入数据:\n");
    scanf("%d",&datanum_1);
    itemp_1=(struct num_list*)malloc(sizeof(struct num_list));
    while(datanum_1!=0)
    {
    if(itemp_1==NULL)
    {
        iend=itemp_1;
    }
    else
        {
            i++;
            itemp_1->inum=datanum_1;
            itemp_1->nnext=NULL;
            iend->nnext=itemp_1;
            iend=itemp_1;
        }
            itemp_1=(struct num_list*)malloc(sizeof(struct num_list));
            printf("请输入数据:\n");
            scanf("%d",&datanum_1);
    }
    iend->nnext=NULL;
    return ihead;
}
//========================================================================================
/*修改某节点数据*/
struct num_list* datachange(struct num_list* shead,int numcha,int datanum)
{
    struct num_list* itemp;
    
    itemp=shead;            //临时指针指向头节点                

    if(itemp==NULL)            //头节点为空时
    {
        printf("链表为空!\n");
        return NULL;
    }
    
    if(datanum<0)                        //如果要修改的数据小于0时
    {
        printf("输入的数据小于0!\n");
        return NULL;
    }
    itemp=itemp->nnext;                    //指向下一节点
    while(i<numcha-1)                    //节点从头节点开始循环到要修改节点的前一个节点
    {
        itemp=itemp->nnext;
    }

    if(i==numcha-1)                        //循环到要修改节点的前一个节点时。
    {
        itemp=itemp->nnext;                //指向要修改的节点
        itemp->inum=datanum;            //修改数据    
        
    }

    return shead;
}

struct num_list* prit(struct num_list* shead)
{
    struct num_list* temp;
    int numdata=0;
    temp=shead;
    if(shead==NULL)
    {
        printf("链表为空!\n");

    }
    temp=temp->nnext;
    while(temp!=NULL)
    {
        numdata++;
        printf("链表长度为:%d\n",numdata);
        printf("录入的数据为:%d\n",temp->inum);
        temp=temp->nnext;
    }
    return shead;
}


int main()
{
    struct num_list* temp;
    temp=iscreate();
    int num_1,num_2;
    prit(temp);
    printf("请输入要修改的节点位置:\n");
    scanf("%d",&num_1);
    printf("请输入要修改的数据:\n");
    scanf("%d",&num_2);
    datachange(temp,num_1,num_2);
    prit(temp);
    return 0;
}




2016-01-03 00:57
ms268el8
Rank: 4
等 级:业余侠客
威 望:1
帖 子:84
专家分:299
注 册:2015-11-30
收藏
得分:0 
while(i<numcha-1)                    //节点从头节点开始循环到要修改节点的前一个节点
    {
        itemp=itemp->nnext;
    }
當條件成立時,這個已經是無限迴圈,執行內容沒改變條件判斷的變數。
2016-01-03 01:59
lanke711
Rank: 9Rank: 9Rank: 9
来 自:流浪在天国之路
等 级:蜘蛛侠
威 望:7
帖 子:317
专家分:1437
注 册:2015-7-16
收藏
得分:0 
回复 2楼 ms268el8
请问,应该如何来判断?才能达到修改的条件!

普通人之所以普通,是因为他们普遍有一个通病,那就是认为自己永远普通。
千夫所指,我亦坚持。就算被所有人误解,我也照样守护这一切。
我们总是觉得,这些灵魂的表情,傲慢自大,目中无人,其实,真正目中无人的是我们。它们傲慢的不过是表情,而我们傲慢的却是行为!
记得,是为了忘记!
只要想着有那么一天,我就能忍受现在的每一天!
灾难并不可怕,可怕的是心中没有了希望。
你以为我在天堂,其实我正在路上。
当你觉得自己走不到终点的时候,请不要放弃。或许你的对手也是这种感觉。
2016-01-03 02:12
ms268el8
Rank: 4
等 级:业余侠客
威 望:1
帖 子:84
专家分:299
注 册:2015-11-30
收藏
得分:0 
while(i>numcha-1)                    //节点从头节点开始循环到要修改节点的前一个节点
    {
        itemp=itemp->nnext;
        numcha++;
    }
    itemp->inum=datanum;            //修改数据  

改這樣貌似成功  
2016-01-03 02:37
ms268el8
Rank: 4
等 级:业余侠客
威 望:1
帖 子:84
专家分:299
注 册:2015-11-30
收藏
得分:10 
while(a<b) {
    ......
}
每次執行完一次迴圈內容時都應該將a的值遞增,或將b的值遞減
不然迴圈不會結束
另外,也可以在迴圈執行內容中加入if(...) break;,若if條件成立執行break跳出迴圈來結束迴圈
2016-01-03 02:53
eFun
Rank: 6Rank: 6
等 级:禁止访问
威 望:1
帖 子:58
专家分:400
注 册:2015-12-27
收藏
得分:30 
代码修改如下即可(红色部分为修改部分):

#include "stdio.h"
#include "stdlib.h"
//=================================================================
struct num_list
{
    int inum;
    struct num_list* nnext;
};


int i;                //记录节点

//==================================================================
/*创建链表*/
struct num_list* iscreate()                    
{    i=0;
    int datanum_1;
    struct num_list* itemp_1,*iend,*ihead;
    ihead=(struct num_list*)malloc(sizeof(struct num_list));
    if(ihead==NULL)
    {
        printf("头节点申请空间失败!\n");
        return NULL;
    }
    iend=ihead;

    printf("请输入数据:\n");
    scanf("%d",&datanum_1);
    itemp_1=(struct num_list*)malloc(sizeof(struct num_list));
    while(datanum_1!=0)
    {
    if(itemp_1==NULL)
    {
        iend=itemp_1;
    }
    else
        {
            i++;
            itemp_1->inum=datanum_1;
            itemp_1->nnext=NULL;
            iend->nnext=itemp_1;
            iend=itemp_1;
        }
            itemp_1=(struct num_list*)malloc(sizeof(struct num_list));
            printf("请输入数据:\n");
            scanf("%d",&datanum_1);
    }
    iend->nnext=NULL;
    return ihead;
}
//========================================================================================
/*修改某节点数据*/
struct num_list* datachange(struct num_list* shead,int numcha,int datanum)
{
    struct num_list* itemp;
   
    itemp=shead;            //临时指针指向头节点               

    if(itemp==NULL)            //头节点为空时
    {
        printf("链表为空!\n");
        return NULL;
    }
   
    if(datanum<0)                        //如果要修改的数据小于0时
    {
        printf("输入的数据小于0!\n");
        return NULL;
    }
    i=1;
    while(i<numcha)                    //节点从头节点开始循环到要修改节点的前一个节点
    {
        itemp=itemp->nnext;
        i++;
    }

    if(i==numcha)                        //循环到要修改节点的前一个节点时。
    {
        itemp=itemp->nnext;                //指向要修改的节点
        itemp->inum=datanum;            //修改数据   
        
    }

    return shead;
}

struct num_list* prit(struct num_list* shead)
{
    struct num_list* temp;
    int numdata=0;
    temp=shead;
    if(shead==NULL)
    {
        printf("链表为空!\n");

    }
    temp=temp->nnext;
    while(temp!=NULL)
    {
        numdata++;
        printf("节点编号为:%d\n",numdata);
        printf("录入的数据为:%d\n",temp->inum);
        temp=temp->nnext;
    }
    return shead;
}


int main()
{
    struct num_list* temp;
    temp=iscreate();
    int num_1,num_2;
    prit(temp);
    printf("请输入要修改的节点位置:\n");
    scanf("%d",&num_1);
    printf("请输入要修改的数据:\n");
    scanf("%d",&num_2);
    datachange(temp,num_1,num_2);
    prit(temp);
    return 0;
}

[此贴子已经被作者于2016-1-3 05:23编辑过]

2016-01-03 05:20
lanke711
Rank: 9Rank: 9Rank: 9
来 自:流浪在天国之路
等 级:蜘蛛侠
威 望:7
帖 子:317
专家分:1437
注 册:2015-7-16
收藏
得分:0 
回复 5楼 ms268el8
明白了,谢谢。原来我想错了i节点这个问题。我以为,前面创建了节点数据后,这里会从i=0一直循环到需要修改的前一个节点。我却忽略了在这里i必须重新初始化,不然会无限循环。。这下明白了。谢谢

普通人之所以普通,是因为他们普遍有一个通病,那就是认为自己永远普通。
千夫所指,我亦坚持。就算被所有人误解,我也照样守护这一切。
我们总是觉得,这些灵魂的表情,傲慢自大,目中无人,其实,真正目中无人的是我们。它们傲慢的不过是表情,而我们傲慢的却是行为!
记得,是为了忘记!
只要想着有那么一天,我就能忍受现在的每一天!
灾难并不可怕,可怕的是心中没有了希望。
你以为我在天堂,其实我正在路上。
当你觉得自己走不到终点的时候,请不要放弃。或许你的对手也是这种感觉。
2016-01-03 16:49
快速回复:关于链表修改某节点值的问题(调试就是不会改)?
数据加载中...
 
   



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

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