刘金伟 发表于 2013-2-15 22:57:55

一个关于链表的问题

本帖最后由 刘金伟 于 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++)
    {

刘金伟 发表于 2013-2-15 23:01:12

      接上面~~
      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);
      }
}

vividege 发表于 2013-6-8 16:40:18

for之前有个menu(),for里面也有menu(),当然会有两次啦

Skyline 发表于 2013-6-20 21:11:01

学习学习!!!!!!!!!!!
页: [1]
查看完整版本: 一个关于链表的问题