注册 登录
编程论坛 C语言论坛

链表中查找第n个节点信息节点信息

LGD335060087 发布于 2020-04-12 16:57, 2609 次点击
程序代码:
#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)函数里面呢
5 回复
#2
海底石2020-04-12 19:34
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函数写错了,我刚学 错了勿怪!!!
#3
wmf20142020-04-12 20:29
吧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;
}
#4
fulltimelink2020-04-13 07:51
第一个问题是因为用了
while(n<sum)

sum 为5, n为4, 循环执行一次就结束 了。
第二个问题可以使用全局变量或者接收函数返回。
#5
LGD3350600872020-04-14 10:29
程序代码:
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函数改为这样可以准确输出除了头节点和尾节点之外的节点信息但是还是输出不了头节点和尾节点的信息
只有本站会员才能查看附件,请 登录
#6
fulltimelink2020-04-14 11:11
回复 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;
}
1