鱼C论坛

 找回密码
 立即注册
查看: 4116|回复: 3

一个关于链表的问题

[复制链接]
发表于 2013-2-15 22:57:55 | 显示全部楼层 |阅读模式

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

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

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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 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);
        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-6-8 16:40:18 | 显示全部楼层
for之前有个menu(),for里面也有menu(),当然会有两次啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-6-20 21:11:01 | 显示全部楼层
学习学习!!!!!!!!!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-21 23:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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