2021-09-24

#include <stdlib.h>
#include <stdio.h>


#define  OK        1
#define  FALSE     0
#define  ERROR    -1
#define  OVERFLOW -2

typedef  int Status;
typedef  int ElemType;

typedef struct LNode                 //链表结点定义
{
    //请你补充
    ElemType data;
    struct LNode *next;
}LNode, *LinkList;

//功能:初始化单链表,即生成只有表头的单链表,成功返回OK,否则返回ERROR
Status InitLinkList_L(LinkList &L)
{
    //请你补充
    L= new Lnode;
    L->next=NULL;
    return OK;
}

//功能:查询链表L的第i个位置上是否存在元素,存在返回OK,否则返回ERROR,找到的数据存放到变量e中
Status GetElem_L(LinkList L, int i, ElemType &e)
{
    //请你补充
    p=L->next;j=1;
    while(p&&j<i)
    {
        p=p->next;
        ++j;
    }
    if(!p||j>i) return ERROR;
    e=p->data;
    return OK;
}


//功能:向链表L的第i个位置插入一个数据e,插入成功返回OK,否则返回ERROR
Status ListInsert_L(LinkList &L, int i, ElemType e)
{
    //请你补充
    p=L;j=0;
    while(p && (j<n-1))
    {
        p=p->next;
        ++j;
    }
    if(!p||(j>i-1))
        return ERROR;
    s=new LNode;
    s->data=e;
    s->next=p->next;
    p->next=s;
    return OK;

}

//功能:将链表L的第i个位置删除,删除的值保存到e,删除成功返回OK,否则返回ERROR
Status ListDelete_L(LinkList &L, int i, ElemType &e)
{
    //请你补充
    p=L;j=0;
    while((p->next)&&(j<i-1))
    {
        p=p->next;++j;
    }    
    if(!(p->next)||(j>i-1))
        return ERROR;
    q=p->next;
    p->next=q->next;
    delete q;
    return OK;
}

//功能:求链表L的长度,返回链表L的长度
int ListLength_L(LinkList L)
{
    //请你补充
    int count=0;
    Linklist*p=L->next;
    while(p){
        p=p->next;
        ++count;
    }
    return count;
}

//功能:依次输出链表L的每个数据
void OutputList_L(LinkList L)
{
    //请你补充,并请调用ListLength_L输出链表长度
    
}

//功能:依次清除链表L的每个数据,并释放相应的空间,清除成功,返回OK,否则ERROR
Status ClearLis_L(LinkList &L)
{
    //请你补充
    
    return OK;
}

//功能:向单链表中输入n个数据,成功返回OK,否则返回ERROR
Status InputData_L(LinkList &L, int n)
{
    int i;
    LinkList tail, p;
    L = (LinkList) malloc (sizeof (LNode));
    if(!L)
        return ERROR;
    L->Next = NULL;
    tail = NULL;
    for(i = 1; i <= n; i++)
    {
        p = (LinkList) malloc (sizeof (LNode));
        if(!p)
            return ERROR;
        printf("\n第%d个数据为:", i);
        scanf("%d", &p->Data);    // 输入元素值
        p->Next = NULL;
        if(i == 1)
            L->Next = p;
        else
            tail->Next = p;
        tail = p;
    }

    return OK;
}

void ShowMenu()           //主菜单
{  
    printf("\n");
    printf("\n****************单链表(头插法)数据操作****************\n\n");
    printf("\t\t1  链表数据输出\n\n");
    printf("\t\t2  链表数据插入\n\n");
    printf("\t\t3  链表数据删除\n\n");
    printf("\t\t4  链表数据查询\n\n");
    printf("\t\t5  链表数据清空\n\n");
    printf("\t\t6  链表数据输入\n\n");
    printf("\t\t0  退出系统\n\n");
    printf("****************单链表(头插法)数据操作****************\n");
    printf("\n");
}

//功能:菜单2的操作处理,实现:在单链表的第i个位置插入数据e的操作
void SubMenu2(LinkList &L)
{
    int      i;
    ElemType e;
    printf("插入位置:");
    scanf("%d", &i);
    printf("插入的数据:");
    scanf("%d", &e);
    if(ListInsert_L(L, i, e) == OK)
        printf("在单链表L的第 %d 位置成功插入数据 %d .\n", i, e);
    else
        printf("插入位置:%d 错误!\n", i);
}

//功能:菜单3的操作处理,实现:在单链表的第i个位置删除数据e的操作
void SubMenu3(LinkList &L)
{
    //ListDelete_L
    int      i;
    ElemType e;
    printf("删除位置:");
    scanf("%d", &i);
    if(ListDelete_L(L, i, e) == OK)
        printf("在单链表L的第 %d 位置成功删除数据 %d .\n", i, e);
    else
        printf("删除位置:%d 错误!\n", i);
}

//菜单3的操作处理,实现:查询单链表的第i个位置数据的操作
void SubMenu4(LinkList L)
{
    int      i;
    ElemType e;
    printf("查询位置:");
    scanf("%d", &i);
    if(GetElem_L(L, i, e) == OK)
        printf("单链表L的第 %d 个位置的数据:%d\n", i, e);
    else
        printf("单链表L的第 %d 个位置的数据不存在!\n", i);
}

//功能:菜单6的功能,实现:输入数据到链表中去
void SubMenu6(LinkList &L)
{
    int n;
    printf("数据个数:");
    scanf("%d", &n);
    if(InputData_L(L, n) == ERROR)
        exit(0);
}

void main()
{
    int choice = 0;                //用户功能选择
    LinkList L;
    InitLinkList_L(L);             //初始化单链表
    while(1)
    {
        system("CLS");
        ShowMenu();
        printf("Please choose(请选择): ");
        scanf("%d",&choice);
        switch(choice)
        {
            case 1:
                {
                    OutputList_L(L);                          //调用输出函数对链表的数据进行输出
                    fflush(stdin);
                    system("pause");
                    break;
                }
            case 2:
                {
                    SubMenu2(L);                             //调用菜单2功能,实现数据的插入操作
                    fflush(stdin);
                    system("pause");
                    break;
                }
            case 3:
                {
                    SubMenu3(L);
                    fflush(stdin);
                    system("pause");
                    break;
                }
            case 4:
                {
                    SubMenu4(L);
                    getchar(); getchar(); system("CLS");
                    break;
                }
            case 5:
                {
                    ClearLis_L(L);
                    fflush(stdin);
                    system("pause");
                    break;
                }
            case 6:
                {
                    printf("输入新数据会先清除旧数据!\n");
                    ClearLis_L(L);
                    SubMenu6(L);
                    fflush(stdin);
                    system("pause");
                    break;
                }
            case 0:
                {
                    system("CLS");
                    printf("谢谢使用!\n");
                    exit(0);
                }
            default:
                {
                    printf("功能选择错误,只能选择0-6!\n");
                    fflush(stdin);
                    system("pause");
                }
        }
    }
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值