单链表基本操作总结

单链表插入

/***************************************************
思路:
    1>声明一个指向头结点的指针P
    2>遍历列表使P指向第i-1个结点
    3>当p为空或j>i,则不存在。
    4>生成空结点赋值并插入
*****************************************************/

Status LinkInsert(LinkInsert *L, int i, Elemtype e)
{
    LinkInsert p, s;
    p = *L; //1>声明一个指向头结点的指针P
    int j = 0;
    while (p && j < i - 1) //2>遍历列表使P指向 **第i-1个** 结点
    {
        p = p->next;
        ++j;
    }
    if (!p || j > i) //3>当p为空或j>i,则不存在。
        return False;
    s = (Linklist)malloc(sizeof(Node)); //4>生成空结点赋值并插入
    s->data = e;
    s->next = p->next; //**p -> next即为第i个结点**
    p->next = s;

    return True;
}

单链表读取

/*************************************************
思路:
    1>声明一个指向第一个结点的指针P
    2>遍历列表使P指向第i个结点
    3>当p为空或j>i,则不存在
    4>返回结点的数据
************************************************/

#include <stdio.h>
typedef int Elemtype;
typedef int Status;
typedef struct NODE
{
    Elemtype data;
    struct NODE *next;
} Node;
typedef Node *Linklist;

Status GetElem(Linklist L, int i, Elemtype *e)
{
    Linklist p;
    p = L->next; //1>声明一个指向第一个结点的指针P
    int j = 1;
    while (p && j < i) //2>遍历列表使P指向**第i个**元素
    {
        p = p->next;
        j++;
    }
    if (!p || j > i) //3>当p为空或j>i,则不存在
        return False;
    *e = p->data; //4>返回结点的数据
    return True;
}

单链表删除

/***************************************
思路:
    (1)声明一个指向头结点的指针P    
    (2)遍历列表使P指向第i-1个结点
    (3)当p为空或j>i,则不存在
    4>取出删除的结点给q,断开结点
    5>结点数据返回并释放q
****************************************/
Status ListDelect(Linklist *L, int i, Elemtype *e)
{
    Linklist p, q;
    p = *L; //(1)声明一个指向头结点的指针P
    int j = 0;
    while (p && j < i) //(2)遍历列表使P指向第i-1个结点
    {
        p = p->next;
        ++j;
    }
    if (!p || j > i) //(3)当p为空或j>i,则不存在
        return False;
    q = p->next; //4>取出删除的结点给q,断开结点
    p->next = q->next;
    *e = q->data; //5>结点数据返回并释放q
    free(q);
    return True;
}

前插法创建单链表

/****************************************
 * <前插法创建单链表>
思路:
    1>创建只含头结点的空链表
    2>创建指针P
    3>循环:生成新节点,赋值插入
*****************************************/

void CreatListHead(Linklist *L,int n)
{
    *L = (Linklist)malloc(sizeof(Node));
    (*L)->next = NULL; //1>创建只含头结点的空链表
    Linklist p;        //2>创建指针P
    srand(time(0));
    for (int i = 0; i < n; ++i) //3>循环:生成新节点,赋值插入
    {
        p = (Linklist)malloc(sizeof(Node));
        p->data = rand() % 100 + 1;
        p->next = (*L)->next; //(*L)->next==NULL;为什么不直接写NULL?
        (*L)->next = p;
    }
}

后插法创建单链表

/*********************************************
思路:
    1>创建带头结点空链表
    2>创建指针p,r,并初始化尾指针r
    3>循环:生成新结点赋值并插入,尾指针再次初始化
*********************************************/

void CreatListTail(Linklist *L, int n)
{
    *L = (linklist)malloc(sizeof(Node));
    (*L)->next = NULL; //1>创建带头结点空链表
    Linklist p, r;
    r = *L; // 2>创建指针p,r,并初始化为指针r
    srand(time(0));
    for (int i = 0; i < n; ++i) //3>循环:生成新结点赋值并插入,尾指针再次初始化
    {
        p = (Linklist)malloc(sizeof(Node));
        p->data = rand() % 100 + 1;
        r->next = p;
        r = p;
    }
}

单链表整表删除

/********************************************
思路:
    1>声明前后指针p,q
    2>第一个结点赋给p
    3>循环:下一个结点给q;
            free(P);
            将p赋给q;
*********************************************/

Status ClearList(Linklist *L)
{
    Linklist p, q;   //1>声明前后指针p,q
    p = (*L)->next; //2>第一个结点赋给p
        while (p)
    {
        q = p->next; //下一个结点给q;
        free(p);     //free(P);
        p = q;       //将p赋给q;
    }
    (*L)->next = NULL;
    return True;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Code_Pianist

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值