| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2087 人关注过本帖
标题:链表中查找第n个节点信息节点信息
只看楼主 加入收藏
LGD335060087
Rank: 2
等 级:论坛游民
帖 子:36
专家分:13
注 册:2020-3-15
结帖率:80%
收藏
已结贴  问题点数:20 回复次数:5 
链表中查找第n个节点信息节点信息
程序代码:
#include<stdio.h>
#include<stdlib.h>
//定义节点类型 
typedef struct player{
    int number;                    //数据域用来存放节点信息可以有定义多个不同类型的数据信息 
    char name[20];
    struct player*next;            //指针域必须是与结构体同类型的指针用来存放下一个节点的地址 
}Player;
Player*game(int sum);            //定义game函数 函数返回类型为结构体类型的指针需要一个sum参数来表示有多少个节点 
void print(Player*head,Player*node);        //定义输出函数 

Player*Find(Player*head,int sum);        //定义查找第n个节点信息 
int main()
{
    int sum;
    printf("请输入玩家个数:");
    scanf("%d",&sum);            //用户输入节点个数 
    Player*head=NULL,*node;                
    head=game(sum);
    node=Find(head,sum);
    print(head,node);

    return 0; 
}
Player*game(int sum)
{
    int i;
    Player*head=NULL,*pt,*pre;    //定义头节点,过度节点,尾节点 
    for(i=0;i<sum;i++){        //用循环的方式创建sum个节点 
     
        pt=(Player*)malloc(sizeof(Player));        //向系统空间为过度节点申请一个Player结构类型的空间  
        if(pt!=NULL){                            //判断是否成功的向系统空间申请了内存 
            scanf("%d%s",&pt->number,pt->name);        //用户输入节点的数据域(赋值)
            if(head==NULL){    //head==NULL时说明链表是空链表进行头节点的处理 也可将此条语句改为if(i==0) 
                head=pt;    //让头节点的地址指向过度节点的地址 
                pre=pt;     //此时pt既是头节点也是尾节点 
            } 
            else {            //执行else语句的说明链表已经创建好了头节点 
                
                pre->next=pt;  //将尾节点与过度节点连接起来 
                pre=pt;    //将尾节点的地址指向过度节点的地址(此时pt既是过度节点也是为节点) 
            }      
        }
        else{
            printf("Failed.\n");
            exit(0);
        }
        
    }
    pre->next=NULL;      //让尾节点的指针域为空表明链表结束  
    return head; 
}


 //查找第n个节点信息 
 Player*Find(Player*head,int sum)

 {
     int n=1;
     Player*node=head;
     printf("请输入需要查找节点的序号:"); 
     scanf("%d",&n);
     while(n<sum&&node!=NULL){
         node=node->next;
         n++;
     }
     return node;
     

 }

 //输出节点信息 
void print(Player*head,Player*node)
{    
    //遍历输出链表信息 
    while(head!=NULL){
            printf("%d,%s\n",head->number,head->name);
            head=head->next; 
            
    }
    //输出第n个节点信息
    printf("the number is %d name is %s\n",node->number,node->name); 
    return;
}

图片附件: 游客没有浏览图片的权限,请 登录注册

问题一:我查找的是第四个节点的信息为什呢输出的第二个节点的信息呢?
问题二://输出第n个节点信息
    printf("this player number  is %d name is %s\n",node->number,node->name); 我想把这句代码改为printf("the first %d player number is %d name is %s",n,node->number,node->name);但是n在 Player*Find(Player*head,int sum);函数里怎么样把它返回到void print(Player*head,Player*node)函数里面呢
搜索更多相关主题的帖子: head 节点 player 信息 sum 
2020-04-12 16:57
海底石
Rank: 1
等 级:新手上路
帖 子:2
专家分:7
注 册:2020-4-12
收藏
得分:7 
Player*Find(Player*head,int sum)

 {   
     int a =1 ,n =1;
     Player*node=head;
     printf("请输入需要查找节点的序号:");
     scanf("%d",&n);
    if(n <= sum && n > 0)
    {
      while(a < n)
     {
         node = node->next;
         a++;
     }
     
     return node;
    }
    else
    {
        printf("请重新输入:");
        Find(head,sum);
    }

 }
你find函数写错了,我刚学 错了勿怪!!!
2020-04-12 19:34
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:7 
吧Find和print函数做如下修改,应该能满足你的要求:
程序代码:
//查找第n个节点信息 
 Player*Find(Player*head,int sum)


 {
     int n;
     Player*node=head;
     printf("请输入需要查找节点的序号:"); 
     scanf("%d",&n);
     while(node!=NULL && --n){
         node=node->next;
     }
     return node;

 }


 //输出节点信息 
void print(Player*head,Player*node)
{
    int i=1,n=0;
    //遍历输出链表信息 
    while(head!=NULL){
            if(node && head->number ==node->number )n=i;
            i++;
            printf("%d,%s\n",head->number,head->name);
            head=head->next; 
    }
    //输出第n个节点信息
    if(node)printf("the first %d player number is %d name is %s\n",n,node->number,node->name); 
    else printf("没有要找的玩家信息\n");
    return;
}

能编个毛线衣吗?
2020-04-12 20:29
fulltimelink
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:7
帖 子:171
专家分:752
注 册:2020-4-1
收藏
得分:7 
第一个问题是因为用了
while(n<sum)

sum 为5, n为4, 循环执行一次就结束 了。
第二个问题可以使用全局变量或者接收函数返回。
2020-04-13 07:51
LGD335060087
Rank: 2
等 级:论坛游民
帖 子:36
专家分:13
注 册:2020-3-15
收藏
得分:0 
程序代码:
Player*Find(Player*head,int sum)

 {
     int a=1;
     int n;
     Player*node=head;
     printf("请输入需要查找节链表节点的序号:"); 
     scanf("%d",&n);
    while(n<sum&&node!=NULL){  //只要用户输入的序号小于链表的总结点数并且node不为尾节点的 
        node=node->next;     
            a++;
        if(a==n){
            return node;
        }
    }


 }

Find函数改为这样可以准确输出除了头节点和尾节点之外的节点信息但是还是输出不了头节点和尾节点的信息
图片附件: 游客没有浏览图片的权限,请 登录注册

知识改变命运,代码更改时代
2020-04-14 10:29
fulltimelink
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:7
帖 子:171
专家分:752
注 册:2020-4-1
收藏
得分:0 
回复 5楼 LGD335060087
你a先++ 就把第1个给跳过去了,还有你应该先判断后next
程序代码:
//查找第n个节点信息 
Player*Find(Player*head, int sum)

{
    int a = 1;
    int n;
    Player*node = head;
    printf("请输入需要查找节链表节点的序号:");
    scanf("%d", &n);
    if (n < 1 || n > sum) return NULL;
    while (n <= sum&&node != NULL) {  //只要用户输入的序号小于链表的总结点数并且node不为尾节点的 
        if (a++ == n) {
            return node;
        }
        node = node->next;
    }
    return NULL;
}
2020-04-14 11:11
快速回复:链表中查找第n个节点信息节点信息
数据加载中...
 
   



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

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