数据结构--单链表的基本操作(期末复习)

本文介绍了单链表的基本操作,包括初始化、销毁、判断空、计算长度、输出、查找元素位置、访问元素、插入和删除元素。还详细展示了头插法和尾插法的实现,以及链表的九大操作的C语言代码实现。

每一种数据类型都有一些基本的操作运算,今天规范一下单链表的基本运算

【链表操作集】--增删改查

typedef struct ListNode{ ......}LNode        //定义链表结构体
InitList(LNode*&L)                           //初始化链表
DestroyList(LNode*& L)                       //销毁链表
EmptyList(LNode* L)                         //判断链表是否为空
LengthList(LNode* L)                        //求链表的长度
DispList(LNode* L)                          //输出链表
LocateElem(LNode* L, ElemType e)            //查询元素位置
GetElem(LNode* L, int i, ElemType &e)      //访问指定位置的元素
InserList(LNode*& L, int i, ElemType e)    //插入元素
DeleteList(LNode*& L, int i, ElemType& e)  //删除元素

一、定义结构体

typedef char ElemType;

//定义单链表结构体 
typedef struct LNode {
    ElemType data;
    struct LNode* next;
}LinkNode;

二、链表的头插法与尾插法

//头插法插入元素----逆序 
void CreateListF(LinkNode*& L, ElemType a[], int n)
{
    LinkNode* s;
    L = new LinkNode;
    L->next = NULL;
    for (int i = 0; i < n; i++)
    {
        s = new LinkNode;
        s->data = a[i];
        s->next = L->next;
        L->next = s;
    }
}

头插法是指在链表头插入新元素,所以实际的逻辑顺序跟物理顺序是相反的

//尾插法插入元素----正序
void CreateListR(LinkNode*& L, ElemType a[], int n)
{
    LinkNode* s, * r;
    L = new LinkNode;
    r = L;
    for (int i = 0; i < n; i++)
    {
        s = new LinkNode;
        s->data = a[i];
        r->next = s;
        r = s;
    }
    r->next = NULL;
}

三、链表的九大操作

// 1.初始化链表
void InitList(LinkNode*& L)
{
    L = new LinkNode;  //or L = (LinkNode *) malloc (sizeof(LNode)) new比较慢;
    L->next = NULL;
}

// 2.销毁链表
void DestroyList(LinkNode*& L)
{
    LinkNode* pre = L, * p = L->next;
    while (p != NULL)
    {
        free(pre);
        pre = p;
        p = p->next;
    }
    free(pre);
}

// 3.判断链表是否为空
bool EmptyList(LinkNode* L)
{
    return NULL == L->next;
}

// 4.求链表的长度
int LengthList(LinkNode* L)
{
    int cnt = 0;
    LinkNode* p = L;
    while (p->next != NULL)
    {
        cnt++;
        p = p->next;
    }
    return cnt;
}

// 5.输出链表
void DispList(LinkNode* L)
{
    LinkNode* p = L->next;
    while (p!= NULL)
    {
        printf("%c ", p->data);
        p = p->next;
    }
    printf("\n");

}

//6.查找链表元素位置 
int LocateElem(LinkNode* L, ElemType e)
{

    int i = 1;
    LinkNode* p = L->next;
    while (p!= NULL && p->data != e)  //由于&运算存在短路现象,这两个条件千万不能调换 
    {
        p = p->next;
        i++;
    }
    if (p == NULL) return 0;    //p==NULL 说明遍历完了也找不到 
     return i;
}

//7.查找链表第i位元素并返回是什么元素 
bool GetElem(LinkNode* L, int i, ElemType & e)
{
    int j = 0;
    LinkNode* p = L;
    if (i <= 0) return false; //越界 
    while (j < i && p != NULL)
    {
        j++;
        p=p->next;
    }
    if (p == NULL)  //没有第i个节点
        return false;
    e = p->data;
    return true;
}

//8.在第i位插入数据元素e----(单链表:必须找到它的前驱节点 ) 
bool InserList(LinkNode*& L, int i, ElemType e)
{
    int j = 0;
    LinkNode* p = L, * s;
    if (i <= 0) return false;
    while (j < i - 1 && p != NULL)        //找到前驱节点 
    {
        j++;
        p = p->next;
    }
    if (p == NULL) return false;
    else {                        //头插法 
        s = new LinkNode;
        s->data = e;
        s->next = p->next;
        p->next = s;
        return true;
    }
}

// 9.删除链表第i元素,并返回是什么元素---(找到前驱节点,直接改变指针的指向)
bool DeleteList(LinkNode*& L, int i, ElemType& e)
{
    int j = 0;
    LinkNode* p = L, * q;
    if (i <= 0)return false;
    while (j < i - 1 && p != NULL)
    {
        j++;
        p = p->next;
    }
    if (p == NULL) return false;
    else {
        q = p->next;
        if (q == NULL)return false;   //没有第i个节点 
        e = q->data;
        p->next = q->next;
        free(q);
        return true;
    }
}

图解日后完善!!!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值