Christopher. 发表于 2020-9-17 19:17:50

各位大佬想问一下,我这个元素不存在的时候为什么没办法正常运行

//4.屏幕提示后,在以DLList1为头指针的线性表中搜索这个元素key,并给出相应的位置或不存在
void search(Node *DLList1,int key)
{
        Node *p;
        int i=0;
        int flag=1;
       
        p=DLList;
       
        while(p)
        {
                p=p->next;
                i++;
                if(p->data == key)
                {
                        flag=0;
                        break;
                }
        }
       
        if(flag)
        {
                printf("元素不存在!");
                wait();
                return;
        }
        else{
                printf("元素所在位置为:%d",i);
                wait();
        }
       
}

孟婆汤 发表于 2020-9-17 19:27:58

贴一下完整代码看看,感觉是死循环了

Christopher. 发表于 2020-9-17 19:31:49

孟婆汤 发表于 2020-9-17 19:27
贴一下完整代码看看,感觉是死循环了

好的

Christopher. 发表于 2020-9-17 19:33:16

#include <conio.h>
#include <stdio.h>
#include <process.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
struct Node{
                int data;
                Node *next;
                };

Node Head;       //头结点
Node *DLList;    //头指针
void init(Node *DLList);
void display(Node *DLList);
void insert(Node *DLList1,int,int);
void search(Node *DLList1,int);
void del(Node *DLList1,int);

int main()
{
      char choice;
      int wz,key;
    key=0;
      DLList=&Head;   //使头指针指向头结点
      Head.next=NULL;

      while (1)
      {
                system("cls");
   
                printf("\n\n\n\n");                           
                printf("\t\t            单链表操作\n");
                printf("\t\t======================================");
                printf("\n\n");
                printf("\t\t             1:初始化      \n");
                printf("\t\t             2:显示      \n");
                printf("\t\t             3:单个插入    \n");
                printf("\t\t             4:查找      \n");
                printf("\t\t             5:删除      \n");
                printf("\t\t             0:退出      \n");
                printf("\n");
                printf("\t\t请选择:" );

                choice = getch();
                system("cls");
               
                switch(choice)
                {
                        case '1':
                            //调用实现函数
                            init(DLList);
                              break;
                        case '2':
                            //调用实现函数
                            display(DLList);
                              break;
                        case '3':
                //位置wz,需插入的数key
                     
                              break;
                        case '4':
                              //请输入需要查找的数key
                            //调用实现函数
                              break;
                        case '5':
                              //请输入需要删除的数
                            //调用实现函数
                              break;
                        case '0':
                              exit(0);
                }
      }
      return 0;
}

//公用的等待函数
void wait()
{
      printf("\n\n请按任意键继续\n");
      getch();
}

void init(Node *DLList)
{
      int length;
      Node *p,*q;
      while (1)
      {
                printf("输入元素个数(0- 10000 ):\n");
                scanf("%d",&length);
                if (length >= 0 && length <= 10000)
                        break;
                printf("\n");
      }

    int i;
      while (1)
      {
                printf("输入随机数种子(0-32767):\n");
                scanf("%d",&i);
                if (i >= 0 && i <= 32767)
                        break;
                printf("\n");
      }

    //从线性表中删除并释放原有的结点,使其成为空表
      p=DLList;
      while (p->next!=NULL)
      {
                q=p->next;
                p->next=q->next;
                free(q);
      }

      srand(i);//指定随机数种子,相同的种子将产生相同的数据序列
      rand();

      //向线性表插入length个新结点
    for (int j=1;j<=length;j++)   
    {
                p=new Node;
                p->next=DLList->next;
                DLList->next=p;
                p->data=rand() % 10000;
    }
}

void display(Node *DLList)
{
        Node *p;
        int count=0;
        p=DLList;
        p=p->next;            //头结点未初始化,值自动为0,需要跳过头结点
       
        while(p)
        {
                printf("%d ",p->data);
                p=p->next;
                count++;
        }
       
        printf("\n");
        printf("元素个数:%d",count);
       
        wait();
}


//4.屏幕提示后,在以DLList1为头指针的线性表中搜索这个元素key,并给出相应的位置或不存在
void search(Node *DLList1,int key)
{
        Node *p;
        int i=0;
        int flag=1;
       
        p=DLList;
       
        while(p&&)
        {
                p=p->next;
                i++;
                if(p->data == key)
                {
                        flag=0;
                        break;
                }
        }
       
        if(flag)
        {
                printf("元素不存在!");
                wait();
                return;
        }
        else{
                printf("元素所在位置为:%d",i);
                wait();
        }
       
}

孟婆汤 发表于 2020-9-17 19:53:37

#include <conio.h>
#include <stdio.h>
#include <process.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
typedef struct Node {
        int data;
        Node *next;
}Node;

Node Head;       //头结点
Node *DLList;    //头指针
void init(Node *DLList);
void display(Node *DLList);
void insert(Node *DLList1, int, int);
void search(Node *DLList1, int);
void del(Node *DLList1, int);

int main()
{
        char choice;
        int wz, key;
        key = 0;
        DLList = &Head;   //使头指针指向头结点
        Head.next = NULL;

        while (1)
        {
                system("cls");

                printf("\n\n\n\n");
                printf("\t\t            单链表操作\n");
                printf("\t\t======================================");
                printf("\n\n");
                printf("\t\t             1:初始化      \n");
                printf("\t\t             2:显示      \n");
                printf("\t\t             3:单个插入    \n");
                printf("\t\t             4:查找      \n");
                printf("\t\t             5:删除      \n");
                printf("\t\t             0:退出      \n");
                printf("\n");
                printf("\t\t请选择:");

                choice = getchar();
                system("cls");

                switch (choice)
                {
                case '1':
                        //调用实现函数
                        init(DLList);
                        break;
                case '2':
                        //调用实现函数
                        display(DLList);
                        break;
                case '3':
                        //位置wz,需插入的数key

                        break;
                case '4':
                        //请输入需要查找的数key
                {
                        int c = 0;
                        printf("请插入需要查找的数字: ");
                        scanf_s("%d", &c);
                        search(DLList, c);
                        break;
                }
                //调用实现函数
                        break;
                case '5':
                        //请输入需要删除的数
                //调用实现函数
                        break;
                case '0':
                        exit(0);
                }
        }
        return 0;
}

//公用的等待函数
void wait()
{
        printf("\n\n请按任意键继续\n");
        getchar();
        getchar();
}

void init(Node *DLList)
{
        int length;
        Node *p, *q;
        while (1)
        {
                printf("输入元素个数(0- 10000 ):\n");
                scanf_s("%d", &length);
                if (length >= 0 && length <= 10000)
                        break;
                printf("\n");
        }

        int i;
        while (1)
        {
                printf("输入随机数种子(0-32767):\n");
                scanf_s("%d", &i);
                if (i >= 0 && i <= 32767)
                        break;
                printf("\n");
        }

        //从线性表中删除并释放原有的结点,使其成为空表
        p = DLList;
        while (p->next != NULL)
        {
                q = p->next;
                p->next = q->next;
                free(q);
        }

        srand(i);//指定随机数种子,相同的种子将产生相同的数据序列
        rand();

        //向线性表插入length个新结点
        for (int j = 1; j <= length; j++)
        {
                p = new Node;
                p->next = DLList->next;
                DLList->next = p;
                p->data = rand() % 10000;
        }
}

void display(Node *DLList)
{
        Node *p;
        int count = 0;
        p = DLList;
        p = p->next;            //头结点未初始化,值自动为0,需要跳过头结点

        while (p)
        {
                printf("%d ", p->data);
                p = p->next;
                count++;
        }

        printf("\n");
        printf("元素个数:%d", count);

        wait();
}


//4.屏幕提示后,在以DLList1为头指针的线性表中搜索这个元素key,并给出相应的位置或不存在
void search(Node *DLList1, int key)
{
        Node *p;
        int i = 0;
        int flag = 1;

        p = DLList;

        while (p != NULL)
        {
                p = p->next;
                i++;
                if (p != NULL && p->data == key)
                {
                        flag = 0;
                        break;
                }
        }

        if (flag)
        {
                printf("元素不存在!");
                wait();
                return;
        }
        else {
                printf("元素所在位置为:%d", i);
                wait();
        }

}

孟婆汤 发表于 2020-9-17 19:54:12

vs2017 调试通过

Christopher. 发表于 2020-9-17 20:09:19

孟婆汤 发表于 2020-9-17 19:54
vs2017 调试通过

对,调试可以通过,但是输一个链表里不存在的,无法正常运行出结果

sunrise085 发表于 2020-9-17 22:07:44

Christopher. 发表于 2020-9-17 20:09
对,调试可以通过,但是输一个链表里不存在的,无法正常运行出结果

你把search那个函数的while循环条件改为 while(p->next) 就可以了

风过无痕1989 发表于 2020-9-17 23:19:26

喝多了,不便回复,你们聊

Christopher. 发表于 2020-9-17 23:52:40

sunrise085 发表于 2020-9-17 22:07
你把search那个函数的while循环条件改为 while(p->next) 就可以了

对的,我后来改出来了

孟婆汤 发表于 2020-9-18 15:09:52

Christopher. 发表于 2020-9-17 23:52
对的,我后来改出来了

没问题啊,我调试的就是不存在的一个值
页: [1]
查看完整版本: 各位大佬想问一下,我这个元素不存在的时候为什么没办法正常运行