各位大佬帮忙看一下这个吧,我输出的第一个为啥是0
#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;
}
}
/2.在屏幕上依次显示以DLList1为头指针的线性表中的全部元素和元素个数
//格式应便于观察
void display(Node *DLList)
{
Node *p;
p=DLList;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
wait();
} 本帖最后由 xieglt 于 2020-9-17 17:09 编辑
因为
DLList=&Head;
head 没有初始化,head是全局变量,被系统初始化为0了
又输出从head开始输出,所以第一个输出永远是0
另外,感觉删除链表和建立链表的代码逻辑似乎不是很清晰建议这样写
//清空链表
p = DLList->next;
//链表非空时循环
while(p != NULL)
{
//保存next节点
q = p->next;
//释放当前节点
free(p);
//当前节点 = next 节点
p = q;
}
//建立链表,你的写法,新节点不是在链表尾部,而是在第二个位置。
p = DLList;
for (int j=1;j<=length;j++)
{
q=new Node;
q->next=NULL;
q->data=rand() % 10000;
p->next = q;
p = q;
}
xieglt 发表于 2020-9-17 16:58
因为
DLList=&Head;
head 没有初始化,head是全局变量,被系统初始化为0了
那我是不是在p=DLList后面加一个p=p->next就行了 Christopher. 发表于 2020-9-17 17:31
那我是不是在p=DLList后面加一个p=p->next就行了
是的 xieglt 发表于 2020-9-17 17:53
是的
好的,谢谢啦
页:
[1]