数据结构与算法(3)单链表的使用

线性表的链式存储结构

  • 线性表的链式存储结构使用任意的存储单元存储线性表的数据元素, 为了连接相邻的元素,数据元素在存储自己的数据信息的同时还需要存储一个指向下一个元素的指针。这两个部分可以区分为数据域指针域,两者组成结点

  • 链式存储结构中有单链表,双链表, 和循环链表。主要区别在于指针域的设计上,这篇博客主要讲单链表的使用

单链表

  • 指针域为一个指向后继元素的指针

这里写图片描述

单链表的链表结构的定义

typedef char Elemtype;

typedef struct LNode{
    Elemtype data;
    struct LNode *next;
}LNode, *LinkList;

单链表的基本运算

  • 初始化单链表
/*
初始化链表
*/
Status InitList(LinkList *L)
{
    *L = (LinkList)malloc(sizeof(LNode));
    if (!*L)
        return ERROR;
    (*L)->next = NULL;

    return OK;
}
  • 销毁单链表
/*
销毁链表
*/
Status DestoryList(LinkList *L)
{
    LinkList temp;
    while (*L){
        temp = (*L)->next;
        free(*L);
        *L = temp;
    }
    return OK;
}
  • 清空单链表
/*
清空链表
*/
Status ClearList(LinkList L)
{
    DestoryList(&(L->next));//将头结点之后的结点全部销毁
    L->next = NULL;

    return OK;
}
  • 在单链表中进行插值操作
/*
在链表中插入值
*/
Status InsertList(LinkList L, int i, Elemtype e)
{
    LinkList new_node = (LinkList)malloc(sizeof(LNode));
    if (!new_node)
        return ERROR;
    new_node->data = e;

    LinkList p = L;
    int j = 0;
    while (p != NULL && j < i - 1){//将p的位置确定到第i-1个,在其后面插入新值
        p = p->next;
        j++;
    }

    if (p == NULL || j > i - 1)
        return ERROR;

    new_node->next = p->next;
    p->next = new_node;

    return OK;
}
  • 单链表中的删除元素操作
/*
删除链表中的值
*/
Status DeleteList(LinkList L, int i, Elemtype *e)
{
    int j = 0;
    LinkList p = L;
    while (p->next != NULL && j < i - 1){
        p = p->next;
        ++j;
    }

    if (p->next == NULL || j > i - 1)
        return ERROR;

    p->next = p->next->next;
    return OK;
}
  • 打印链表中的值
/*
查找链表中的值
*/
Status GetElem(LinkList L, int i, Elemtype *e)
{
    int j = 0;
    LinkList p = L;
    while (p != NULL && j < i){
        p = p->next;
        ++j;
    }

    if (p == NULL || j > i)
        return ERROR;

    *e = p->data;
    return OK;
}
  • 查找链表中的值
/*
查找链表中的值
*/
Status GetElem(LinkList L, int i, Elemtype *e)
{
    int j = 0;
    LinkList p = L;
    while (p != NULL && j < i){
        p = p->next;
        ++j;
    }

    if (p == NULL || j > i)
        return ERROR;

    *e = p->data;
    return OK;
}
  • 查找值的前驱元素
/*
得到链表中值的前驱元素
*/
Elemtype GetPreElem(LinkList L, Elemtype e)
{
    LinkList p = L->next;
    LinkList temp;
    while (p->next != NULL){
        temp = p;
        p = p->next;
        if (p->data == e){
            return temp->data;
        }
    }

    return ERROR;
}
  • 查找值的后继元素
/*
得到链表中值的后继元素
*/
Elemtype GetNextElem(LinkList L, Elemtype e)
{
    LinkList p = L->next;

    while (p->next != NULL){
        if (p->data == e){
            return p->next->data;
        }
        p = p->next;
    }

    return ERROR;
}

  • 测试的代码
int main()
{
    LinkList L;
    Elemtype e;

    printf("初始化链表\n");
    InitList(&L);
    printf("在链表中插入值:\n");
    InsertList(L, 1, 'a');
    InsertList(L, 2, 'b');
    InsertList(L, 3, 'c');
    InsertList(L, 4, 'd');
    InsertList(L, 5, 'e');
    InsertList(L, 6, 'f');
    InsertList(L, 7, 'g');
    printf("打印链表中的数据元素\n");
    DispList(L);
    printf("删除链表中的数据元素\n");
    DeleteList(L, 2, &e);
    DispList(L);
    DeleteList(L, 4, &e);
    DispList(L);
    GetElem(L, 3, &e);
    printf("第3个元素的值是 %c\n", e);

    printf("c的前驱元素是 %c\n", GetPreElem(L, 'c'));
    printf("a 的后继元素为%c\n", GetNextElem(L, 'a'));

    printf("销毁链表\n");
    DestoryList(&L);

    system("pause");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值