鱼C论坛

 找回密码
 立即注册
查看: 688|回复: 1

[已解决]大佬们我想问一下,这个程序查找的时候,输入一个不存在的元素就无法正常运行了

[复制链接]
发表于 2020-9-17 20:47:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#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 21:48:11
因为search函数中的while循环条件有问题
你先看循环体的内容,当循环到最后一个元素的时候,进入循环体,p=p->next,因为p后面已经没有元素了,这时p已经指向NULL了,那么下面的if语句中使用p->data肯定就出问题了。
所以循环的条件应该是while(p->next),当p->next为空的时候就不需要再循环了,因为此时p为最后一个节点,而且上一次循环已经查验过p->data了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-9-17 21:48:11 | 显示全部楼层    本楼为最佳答案   
因为search函数中的while循环条件有问题
你先看循环体的内容,当循环到最后一个元素的时候,进入循环体,p=p->next,因为p后面已经没有元素了,这时p已经指向NULL了,那么下面的if语句中使用p->data肯定就出问题了。
所以循环的条件应该是while(p->next),当p->next为空的时候就不需要再循环了,因为此时p为最后一个节点,而且上一次循环已经查验过p->data了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-13 03:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表