c语言链式存储实现

之前写了一个关于线性表的顺序存储,大家都知道,在链表操作中,为了方便的删除,增加元素而无须大量地移动元素,通常来说,链表都是链式存储,今天我就写一个这个关于链表的链式存储的一些相关操作。包括创建链表,头插和尾插法创建链表,求链表的长度,插入元素和删除元素,还有就是下查找固定位置的链表并返回其元素的值。
#include<stdio.h>
#include<malloc.h>

#define ERROR 0
#define OK 1
typedef int ElemType;
typedef int Status;
/*******
结点定义
*/
typedef struct Node
{
    ElemType data;
    struct Node *next;
} Node,*pNode;
/********
创建带头结点的空链表
*/
pNode CreateList()
{
    pNode L;
    L=(pNode)malloc(sizeof(Node));
    L->next=NULL;
    return L;
}
/************
头插法
*/
void headInsertList(pNode L,int e)
{
    pNode p=(pNode)malloc(sizeof(Node));
    p->data=e;
    p->next=L->next;
    L->next=p;
}
/**********
链表的输出
*/
void printList(pNode L)
{
    pNode p=L->next;
    while(p)
    {
        printf("%d  ",p->data);
        p=p->next;
    }
    printf("\n");
}
/************
链表元素的个数
*/
int lengthList(pNode L)
{
    int length=0;
    pNode p=L->next;
    while(p)
    {
        ++length;
        p=p->next;
    }
    return length;
}
/********
链表的尾插法
*/
void tailInsertList(pNode L,ElemType e)
{
    pNode p=L->next;
    pNode q=(pNode)malloc(sizeof(Node));
    q->data=e;
    while(p->next)
    {
        p=p->next;
    }
    q->next=NULL;
    p->next=q;
}
/*******
在链表的第i个位置插入元素e
*/
Status InsertList(pNode L,int pos,ElemType e)
{
    pNode p=L;
    pNode s;//待插入结点
    int j=1;
    while(p && j<pos)
    {
        p=p->next;
        ++j;
    }
    if(!p || j>pos)
        return ERROR;
    s=(pNode)malloc(sizeof(Node));
    s->data=e;
    s->next=p->next;
    p->next=s;
    return OK;
}
/**********
删除链表第i个位置的元素并返回该元素
*/
Status deleteList(pNode L,int pos,ElemType *e)
{
    pNode p=L;
    pNode q;
    int j=1;
    while(p->next && j<pos)
    {
        p=p->next;
        ++j;
    }
    if(!(p->next) || j>pos)
        return ERROR;
    q=p->next;
    *e=q->data;
    p->next=q->next;
    free(q);
    return OK;
}
/**********
获得第 i 个位置的元素
*/
Status GetElem(pNode L,int i,ElemType *e)
{
    pNode p;
    int j=1;
    p=L->next;//p指向第一个元素

    while(p && j<i)
    {
        p=p->next;
        ++j;
    }
    if(!p || j>i)
    {
        return ERROR;
    }
    *e=p->data;
    return OK;
}
int main()
{
 /*       pNode L;
        int i=1;
        int m;//获得某个位置元素的值
        int length;//保存链表长度
        int n;//保存删除后结点的值
        L=CreateList();
        headInsertList(L,i);
        tailInsertList(L,2);
        headInsertList(L,3);
    //    length=lengthList(L);

        printList(L);
        InsertList(L,4,4);
        printList(L);
        deleteList(L,4,&n);
        printf("%d\n",n);
        printList(L);
        GetElem(L,2,&m);
        printf("%d\n",m);

    //    printf("%d\n",length);*/
    int i;
    pNode L;
    printf("创建链表请输入1:\n增加链表元素请输入2:\n删除元素请输入3:\n查找元素请输入4\n输出链表请按5\n输出链表长度请输入6:\n结束请输入0:\n");
    while(1)
    {
        scanf("%d",&i);
        switch(i)
        {
        case 0:
            return 0;
            break;
        case 1:
        {

            int n,i;
            ElemType e;
            printf("请输入创建链表元素的个数:\n");
            scanf("%d",&n);
            if(n<=0)
            {
                return -1;
            }

            L=CreateList();
            for(i=0; i<n; i++)
            {
                printf("请输入第%d个要插入的数字:",(i+1));
                scanf("%d",&e);
                headInsertList(L,e);
            }
        }
        break;
        case 2:
        {


            int pos;
            ElemType e;
            printf("请输入要插入的位置:\n");
            scanf("%d",&pos);
            printf("请输入要插入的元素:\n");
            scanf("%d",&e);
            InsertList(L,pos,e);
        }
        break;
        case 3:
        {
            int pos;
            ElemType e;
            printf("请输入要删除元素的位置:\n");
            scanf("%d",&pos);
            deleteList(L,pos,&e);
        }
            break;
        case 4:
        {
            int  pos;
            int r;//接收状态返回值
            ElemType e;
            printf("请输入要查找元素的位置:\n");
            scanf("%d",&pos);
            r=GetElem(L,pos,&e);
            printf("%d\n",e);
        }
            break;
        case 5:
            printList(L);
            break;
        case 6:
            printf("%d\n",lengthList(L));
            break;
        default:
            printf("输入数据有误,请重新输入!\n");
            break;
        }
    }

    return 0;
<p>}
</p><p><span style="font-family: monospace; white-space: pre; background-color: rgb(240, 240, 240);">上面的代码已亲自测试过,如有哪不妥的地方,请大神指出。共同学习,一起进步。</span>
</p>
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
图书管理系统是一个用于管理图书馆图书的软件系统。链式存储是一种数据结构,可以用于实现图书管理系统的存储和管理功能。 在C语言中,可以使用结构体和指针来实现链式存储。首先,我们可以定义一个图书的结构体,包含图书的编号、名称、作者等属性。然后,可以定义一个链表节点的结构体,包含一个指向图书结构体的指针和一个指向下一个节点的指针。 通过使用这样的数据结构,我们可以创建一个图书的链表。每个节点代表一个图书,通过节点的指针,可以连接起所有的图书形成一个链表。 通过链表,可以方便地实现图书管理系统的基本功能,比如添加图书、删除图书、查找图书等。当需要添加图书时,可以创建一个新的节点,将图书信息填入节点中,并将节点插入到链表中适当的位置。当需要删除图书时,可以通过遍历链表找到要删除的节点,并将其从链表中移除。当需要查找图书时,可以从链表的头节点开始遍历,逐一比对图书的各个属性,直到找到满足条件的图书。 链式存储在图书管理系统中具有很多优点。首先,链表的长度可以动态增长或缩减,不需要事先确定图书的数量。其次,链表的插入和删除操作非常高效,只需要改变指针的指向即可,不需要像数组那样移动大量的元素。此外,链表结构灵活,可以方便地实现其他高级功能,比如图书的排序和倒序展示等。 总之,使用C语言实现链式存储的图书管理系统可以通过使用链表的方式来存储和管理图书信息,以达到高效、灵活和易于扩展的目的。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值