数据结构-用链表创建图书管理系统

图片描述:
在这里插入图片描述在这里插入图片描述
由于采用了引用类型,所以需要用C++来运行实现
,另外还有很多可以精简的地方,欢迎讨论。

我的代码:

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

#define OK 1
#define ERROR 0

typedef int Status;
typedef int ElemType;
typedef struct LNode
{
    ElemType data;
    struct LNode *next;
}LNode,*LinkList;//LNode,LinkList都是定义指针变量,习惯前者结点变量,后者单链表

//单链表初始化及初步创建
Status InitList(LinkList &L)
{
    LNode *p;
    L=(LNode*)malloc(sizeof(LNode*));//1.生成头结点,头指针头结点建立联系
    L->next=NULL;//2.头结点指针域置空
    p=L;
    printf(" 您想创建含几个数据的单链表\n");
    int i,j;
    scanf("%d",&i);
    for(j=1;j<=i;j++)
    {
        printf("请输入数据\n");
        //p=p->next;    ???????????????
        p=(LNode*)malloc(sizeof(LNode));
        p->next=L->next;
        L->next=p;
        scanf("%d",&p->data);
    }

    return OK;

}

//单链表的插入(头插法)
Status Insert(LinkList L)
{
    int i,j=0;
    ElemType e;
    LNode *p;
    LNode *s;
    p=L;//p指向头节点
    printf("请输入您想插入的位置和值\n");
    scanf("%d %d",&i,&e);
    while(p&&j<(i-1))//同时满足为非空或在该位置的前方,j0,i1头结点开
    {
        p=p->next;
        ++j;
    }
    if(!p||j>(i-1))//p是空集(i>n+1),或i<1
        return ERROR;
    s=(LNode*)malloc(sizeof(LNode));
    s->data=e;
    s->next=p->next;
    p->next=s;
    return OK;
}

//单链表的查找
int LocateElem(LinkList L)
{

    ElemType e;
    printf("请输入您想查找的值!\n");
    scanf("%d",&e);
    LNode *p;
    p=L->next;//首元节点
    int j=1;
    while(p&&(*p).data!=e)//当空集或p的数据域是e跳出
    {
        p=p->next;
        j++;
    }
    if(!p)//p是空集
        printf("并未找到该值\n");
    else
        printf("该值的位置是%d\n",j);
    return 0;

}

//单链表的取值
Status GetElem(LinkList L)
{
    int i,j=1;
    LNode *p;
    p=L->next;//p指向首元节点
    printf("请输入你想要取值位置!\n");
    scanf("%d",&i);
    while(p&&j<i)
    {
        p=p->next;
        ++j;
    }
    if(!p||j>i)//i>单链表长度||i<=0
        return ERROR;
    printf("该位置的值是%d\n",p->data);
    return OK;

}

//单链表的删除
Status ListDelete(LinkList &L)
{
    LNode *p,*q;
    int i;
    int j=0;

    printf("请输入你想删除元素的位置\n");
    scanf("%d",&i);
    p=L;//首元节点
    while(p&&j<i-1)//是空集或
    {
        p=p->next;++j;
    }

    if(!p||i<1)
        return ERROR;
    q=p->next;
    p->next=q->next;
    free(q);
    return OK;

}


//单链表的遍历
int TravelList(LinkList L)
{
    LNode *p;

    p=L->next;
    while(p)
    {
        printf("%d   ",p->data);
        p=p->next;

    }
    printf("\n");
    return 0;
}


int main()
{

    printf("------------1 建立------------\n");
    printf("------------2 插入------------\n");
    printf("------------3 查找------------\n");
    printf("------------4 取值------------\n");
    printf("------------5 删除------------\n");
    printf("------------6 遍历------------\n");
    printf("------------0 退出------------\n");
    int m;
    printf("请输入你想要的操作\n");
    scanf("%d",&m);
    while(m!=0)
    {
        LinkList L;

        switch(m)
        {
        case 1:
            if(InitList (L))
                printf("创建成功!\n");
            else
                printf("创建失败!\n");

            break;
        case 2:
            if(Insert(L))
                printf("插入成功!\n");
            else
                printf("插入失败!\n");

            break;
        case 3:LocateElem(L);

            break;
        case 4:GetElem(L);

            break;
        case 5:
            if(ListDelete(L))
                printf("删除成功!\n");
            else
                printf("删除失败!\n");

            break;

        case 6:TravelList(L);
            break;

        }
        scanf("%d",&m);
    }

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值