大佬们我想问一下,这个程序查找的时候,输入一个不存在的元素就无法正常运行了
#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();
}
} 因为search函数中的while循环条件有问题
你先看循环体的内容,当循环到最后一个元素的时候,进入循环体,p=p->next,因为p后面已经没有元素了,这时p已经指向NULL了,那么下面的if语句中使用p->data肯定就出问题了。
所以循环的条件应该是while(p->next),当p->next为空的时候就不需要再循环了,因为此时p为最后一个节点,而且上一次循环已经查验过p->data了。
页:
[1]