单链表的基本操作

  代码中的笔记是根据《浙江大学》的数据结构mooc课程整理而成

#include <bits/stdc++.h>
using namespace std;
typedef int ElementType;
//1.顺序表的定义
typedef struct LNode* List;  //List是一个指针类型
struct LNode
{
    ElementType Data;
    List Next;
};
struct Lnode L; //新建一个链表L
List PtrL;  //表头

//主要操作:1.求表长
int Length(List PtrL)
{
    List p=PtrL;     //p指向表的第一个结点
    int j = 0;
    while (p)     //当p不为空的时候
    {
        p = p->Next;
        j++;
    }
    return j;
}

//主要操作 :2.查找
//(1)按序号查找:FindKth;
List FindKth(int K, List PtrL)
{
    List p = PtrL;
    int i = 1;
    while (p != NULL && i < K)
    {
        p = p->Next;
        i++;
    }
    if (i == K)
    {
        return p;
    }
    else return NULL;
}
//(2)按值查找:Find
List Find(ElementType X, List PtrL)
{
    List p = PtrL;
    while (p != NULL && p->Data != X)
    {
        p = p->Next;
    }
    return p;
}
 
//以上两种查找方式平均时间性能为O(n);

//3.插入:将一个值为X的新结点插入到i位置处(在第i-1个结点后面)
//(1)先构造一个新结点,用s指向;
// (2)再找到链表的第i-1个结点,用p指向;
//(3)然后修改指针,插入结点(p后面插入的新结点是s)
// (4)注意要先修改s的指向,再修改p的指向
List Insert(ElementType X, int i, List PtrL)
{
    List p, s;
    if (i == 1)             //新结点插入在表头
    {
        s = (List)malloc(sizeof(struct LNode));  //申请、填装结点
        s->Data = X;
        s->Next = PtrL;
        return s;
    }
    p = FindKth(i - 1, PtrL);
    if (p == NULL)
    {
        cout << "参数i错误";
        return NULL;              //return null;很重要!
    }
    else
    {
        s = (List)malloc(sizeof(struct LNode));
        s->Data = X;
        s->Next = p->Next;
        p->Next = s;
        return PtrL;
    }
}

//4.删除:删除链表的第i个位置上的结点
// 主要:要将那个删除的结点的空间释放掉!用free函数
// 找到结点后要用一个指针指向他,这是他的表示方法!
//(1)找到链表的第i-1个结点,用p指向(那么s,即第i个结点,就是p的下一个)
// (2)用指针s指向要被删除的结点
// (3)将指针p的指向改成指针s的指向
// (4)最后释放s所指结点的空间
List Delete(int i, List PtrL)
{
    List p, s;
    if (i == 1)               //要删除的是表头的第一个结点
    {
        s = PtrL;
        if (PtrL == NULL)       //要判断一下表是不是一个空表
        {
            return NULL;
        }
        else
        {
            PtrL = PtrL->Next;
            free(s);
            return PtrL;
        }
    }
    p = FindKth(i - 1, PtrL);
    if (p == NULL)
    {
        cout << "第" << i-1 << "个结点不存在啊";
    }
    else if (p->Next = NULL)
    {
        cout<< "第" << i << "个结点不存在啊";
    }
    else
    {
        s = p->Next;
        p->Next = s->Next;
        free(s);
        return PtrL;
    }
}
//Ok,以上就是今天敲的链表的基本操作

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值