SmithDimon 发表于 2020-3-2 08:53:23

请教小甲鱼视频中的快慢指针问题

第一个函数是创建单向链表 第二个函数就是快慢指针法求链表中间元素为啥我编译并运行后并没有输出中间元素呢?
程序如下:

#include<stdio.h>
#include<stdlib.h>
#define N sizeof(node)
typedef struct Node{//构造结构体

   int num;
   struct Node *next;
}node,pnode;//node pnode其实都代表struct Node 结构体

    int n=0;

        node* creat(void){         //创建单向动态链表
        pnode* p1,*p2,*head;
        p1=p2=(node*)malloc(N);   //创建第一个节点
        scanf("%d",&p1->num);      //输入第一个节点的数据
        head=NULL;         //创建链表前都要让头指针为NULL
        while(p1->num!=0){       //判断输入的数据是否有效 若为0则结束链表
                n=n+1;      
                if(n==1){
                head=p1;                //输入第一个有效数据后将头指针head指向链表第一个节点
                }
                p1=(node*)malloc(N);       //创建第二个节点此时p1指向第二个节点
                p2->next=p1;            // 此时p2还是指向第一个节点 将第一个节点的指针指向第二个节点
                p2=p1;                   //再让p2进入第二个节点
                scanf("%d",&p1->num);       //输入第二个节点的数据
        }
        p2->next=NULL;          //结束后让末尾的节点指针指向NULL
        free (p1);         
        return head;         
       
}   

/*求链表的中间节点(利用快慢指针)*/

int Getmidnode(node*head){
       node* mid,*search;
       int e;
       mid=search=head;
       while(search->next){
               if(search->next->next){
                       search=search->next->next;
                       mid->next;
                  }else {
                          search=search->next;
                  }
                  
          }
          e=mid->num;
          return e;
}
int main(){
        node* p;
        p=creat();
        printf("链表建立完成");
        printf("mid=%d",Getmidnode(p)); //输出链表中间节点元素
        return 0;
}

ByTime 发表于 2020-3-2 09:27:53

while用numb来终止,
mid也要赋值,不然mid一直指的都是头结点,所以值一直为头结点的值
while(search->next->num){
               if(search->next->next){
                         search=search->next->next;
                         mid = mid->next;
                  }else {
                        search=search->next;
                  }
                  
          }

SmithDimon 发表于 2020-3-4 16:05:33

ByTime 发表于 2020-3-2 09:27
while用numb来终止,
mid也要赋值,不然mid一直指的都是头结点,所以值一直为头结点的值
while(search- ...

改了 但是还是没出结果
#include<stdio.h>
#include<stdlib.h>
#define N sizeof(node)
typedef struct Node{//构造结构体

   int num;
   struct Node *next;
}node,pnode;//node pnode其实都代表struct Node 结构体

    int n=0;

        node* creat(void){         //创建单向动态链表
        pnode* p1,*p2,*head;
        p1=p2=(node*)malloc(N);   //创建第一个节点
        scanf("%d",&p1->num);      //输入第一个节点的数据
        head=NULL;         //创建链表前都要让头指针为NULL
        while(p1->num!=0){       //判断输入的数据是否有效 若为0则结束链表
                n=n+1;      
                if(n==1){
                head=p1;                //输入第一个有效数据后将头指针head指向链表第一个节点
                }
                p1=(node*)malloc(N);       //创建第二个节点此时p1指向第二个节点
                p2->next=p1;            // 此时p2还是指向第一个节点 将第一个节点的指针指向第二个节点
                p2=p1;                   //再让p2进入第二个节点
                scanf("%d",&p1->num);       //输入第二个节点的数据
        }
        p2->next=NULL;          //结束后让末尾的节点指针指向NULL
        free (p1);         
        return head;         
       
}   

/*求链表的中间节点(利用快慢指针)*/

int Getmidnode(node*head){
       node* mid,*search;
       int e;
       mid=search=head;
       while(search->next->num){
               if(search->next->next){
                       search=search->next->next;
                       mid=mid->next;
                  }else {
                          search=search->next;
                  }
                  
          }
          e=mid->num;
          return e;
}
int main(){
        node* p;
        p=creat();
        printf("链表建立完成");
        printf("mid=%d",Getmidnode(p)); //输出链表中间节点元素
        return 0;
}
页: [1]
查看完整版本: 请教小甲鱼视频中的快慢指针问题