数据结构实验2——链表

<span style="font-size:18px;">#include <stdio.h>
#include <stdlib.h>

typedef struct LNode
{
    char data;
    struct LNode *next;
}LNode,*Linklist;
int flag=0;
void menu()
{
    printf("\t链表的基本操作实验\t\t\n");
    printf("*****************************************\n");
    printf("*请选择命令序号(0——7):\t\t*\n");
    printf("*1 创建链表;\t\t\t\t*\n");
    printf("*2 链表插入;\t\t\t\t*\n");
    printf("*3 链表删除;\t\t\t\t*\n");
    printf("*4 链表长度;\t\t\t\t*\n");
    printf("*5 链表是否为空;\t\t\t*\n");
    printf("*6 链表输出;\t\t\t\t*\n");
    printf("*7 链表销毁;\t\t\t\t*\n");
    printf("*0 程序退出;\t\t\t\t*\n");
    printf("*****************************************\n");
}
void Creatlist_0(Linklist *l)
{
    int i,n;
    Linklist p;
    char ch;
    printf("请输入单链表的长度:\n");
    scanf("%d",&n);
    *l=(Linklist)malloc(sizeof(LNode));
    (*l)->next=NULL;
    for(i=0;i<n;i++)
    {
        printf("请输入链表中元素:\n");
        p=(Linklist)malloc(sizeof(LNode));
        scanf("%c",&ch);
        if((ch=getchar())!='\n')
        {
            p->data=ch;
            p->next=(*l)->next;
            (*l)->next=p;
        }
    }
    flag=1;
}
void Creatlist_1(Linklist *l)
{
    int i,n;
    Linklist p,r;
    char ch;
    printf("请输入单链表的长度:\n");
    scanf("%d",&n);
    *l=(Linklist)malloc(sizeof(LNode));
    (*l)->next=NULL;
    r=*l;
    for(i=0;i<n;i++)
    {
        printf("请输入链表中元素:\n");
        p=(Linklist)malloc(sizeof(LNode));
        scanf("%c",&ch);
        if((ch=getchar())!='\n')
        {
            p->data=ch;
            p->next=r->next;
            r->next=p;
            r=p;
        }
    }
    flag=1;
}
int Lengthlist(Linklist l)
{
    int len=0;
    Linklist p=l->next;
    while(p)
    {
        len++;
        p=p->next;
    }
    return len;

}
void Insertlist(Linklist l,int i,char e)
{
    int j;
    Linklist p=l,r;
    if(i<1||i>Lengthlist(l)+1)
        printf("无法插入!\n");
    else
    {
        for(j=0;j<i-1;j++)
            p=p->next;
        r=(Linklist)malloc(sizeof(LNode));
        r->data=e;
        r->next=p->next;
        p->next=r;
    }
}
void Deletelist(Linklist *l,int i)
{
    int j;
    Linklist p=*l,r;
    if(i<1||i>Lengthlist(*l))
        printf("无法删除!\n");
    else
    {
        for(j=0;j<i-1;j++)
            p=p->next;
        r=p->next;
        p->next=r->next;
        free(r);
    }
}
void Emptylist(Linklist l)
{
    if(flag==0)
        printf("链表未创建,不能执行判空操作!\n");
    else if(l->next==NULL)
        printf("链表为空!\n");
    else
        printf("链表不为空!\n");
}
void Displaylist(Linklist l)
{
    if(flag==0)
        printf("链表未创建,不能执行显示操作!\n");
    else if(l->next==NULL)
        printf("链表为空!\n");
    else
    {
        Linklist p=l->next;
        while(p)
        {
            printf("%c->",p->data);
            p=p->next;
        }
        printf("NULL\n");
    }
}
void Destorylist(Linklist l)
{
    Linklist p=l,q=l->next;
    while(q)
    {
        free(p);
        p=q;
        q=q->next;
    }
    free(p);
    flag=0;
}
int main()
{
    Linklist l;
    int i,select;
    char e;
    while(1)
    {
        menu();
        printf("请输入命令号(0——7):\n");
        scanf("%d",&select);
        switch(select)
        {
            case 1:
                printf("请选择插入方法(0为头插法,1为尾插法):\n");
                while(scanf("%d",&i))
                {
                    if(i==0||i==1)
                        break;
                    else
                    {
                        printf("输入不对,请重新输入(1为头插法,2为尾插法):\n");
                        continue;
                    }
                }
                if(i==0)
                    Creatlist_0(&l);
                else
                    Creatlist_1(&l);
                break;
            case 2:
                if(flag==1)
                {
                    printf("请输入插入位置:\n");
                    scanf("%d",&i);
                    printf("请输入插入的字符:\n");
                    getchar();
                    scanf("%c",&e);
                    Insertlist(l,i,e);
                }
                else
                    printf("链表未创建,不能执行插入操作!\n");
                break;
            case 3:
                if(flag==0)
                    printf("链表未创建,不能执行删除操作!\n");
                else
                {
                    printf("请输入删除位置:\n");
                    scanf("%d",&i);
                    Deletelist(&l,i);
                }
                break;
            case 4:
                if(flag==0)
                    printf("链表未创建,不能计算长度!\n");
                else
                    printf("链表的长度为:%d\n",Lengthlist(l));
                break;
            case 5:
                Emptylist(l);
                break;
            case 6:
                Displaylist(l);
                break;
            case 7:
                if(flag==0)
                    printf("链表未创建,怎么销毁?\n");
                else
                    Destorylist(l);
                break;
            case 0:
                exit(1);break;
            default :
                printf("命令输入有误,请重新输入:\n");
                break;
        }
    }
    return 0;
}
</span>

posted on 2015-01-18 23:32  赛亚人  阅读(246)  评论(0编辑  收藏  举报