一个关于链表的问题
本帖最后由 刘金伟 于 2013-2-15 23:00 编辑运行时Menu会直接运行两次,为什么呢?求解释~~#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef struct Node
{
int data;
struct Node* next;
}Node;
typedef struct Node* LinkList;
LinkList L;
//头插法建立单链表示例
void CreateListHead(int n)
{
LinkList p;
int i;
srand(time(0)); //初始化随机数种子LinkList L;
for(i=0;i<n;i++)
{
p=(LinkList)malloc(sizeof(Node));//生成新节点
p->data=rand()%100+1;//(1~100内的随机数)
p->next=(L)->next;
(L)->next=p;
}
}
//插入数据
int InsertList(int i,int e)
{
int j=1;
LinkList p,s;
p=L;
while(p&&j<i)
{
p=p->next;
j++;
}
if(!p||j>i)
{
printf("当前位置不存在,插入失败......\n\n");
return 0;
}
else
{
s=(LinkList)malloc(sizeof(Node));
s->data=e;
s->next=p->next;
p->next=s;
printf("插入成功......\n\n");
return 1;
}
}
//删除数据
int DeleteList(int i)
{
int j=1;
LinkList p,q;
p=L;
while(p->next&&j<i)
{
p=p->next;
++j;
}
if(!(p->next)||j>i)
{
printf("当前位置不存在,删除失败......\n\n");
return 0;
}
else
{
q=p->next;
p->next=q->next;
free(q);
printf("删除成功......\n\n");
return 1;
}
}
/*计算链表长度*/
int LengthList()
{
LinkList p,q;
int j=0;
p=(L)->next;
while(p)
{
q=p->next;
j++;
p=q;
}
return j;
}
//清空链表
void ClearList()
{
LinkList p,q;
p=(L)->next;
while(p)
{
q=p->next;
free(p);
p=q;
}
(L)->next=NULL;
printf("清空链表成功......\n\n");
}
//查看当前链表
void PrintfList()
{
LinkList p,q;
p=(L)->next;
while(p)
{
q=p->next;
printf("%d ",p->data);
p=q;
}
printf("\n\n");
}
//输出菜单
void Menu()
{
printf("链表的相关操作:\n\n");
printf("1.创建链表\n2.插入数据\n3.删除数据\n4.链表长度\n5.清空链表\n0.退出\n\n");
printf("请选择功能键: ");
}
//主函数
void main()
{
int k;
char key;
L=(LinkList)malloc(sizeof(Node));//创建空链表
(L)->next=NULL;
Menu();
for(k=0;;k++)
{
接上面~~
Menu();
key=getchar();
if(key=='1')
{
int n;
printf("请输入要创建列表的长度:");
scanf("%d",&n);
printf("\nthe List: ");
CreateListHead(n);
PrintfList();
}
if(key=='2')
{
int i,e;
printf("请输入要插入的位置和数据:");
scanf("%d%d",&i,&e);
if(InsertList(i,e)==1)
{
printf("the List: ");
PrintfList();
}
}
if(key=='3')
{
int i;
printf("请输入要删除的位置:");
scanf("%d",&i);
if(DeleteList(i)==1)
{
printf("\nthe List: ");
PrintfList();
}
}
if(key=='4')
{
int a;
a=LengthList();
printf("链表长度:%d\n\n",a);
}
if(key=='5')
{
ClearList();
}
if(key=='0')
exit(0);
}
}
for之前有个menu(),for里面也有menu(),当然会有两次啦 学习学习!!!!!!!!!!!
页:
[1]