链表知识讲解

一.单链表

(1)链表定义

将 指向int型变量的指针 定义为 zhengshuzhizhen:

typedef <数据类型> <别名》
typedef int *zhengshuzhizhen

用代码定义一个单链表:

用指针p来接收malloc函数的返回值,让p它指向这个结点的起始地址

struct LNode {              //LNode为结点,定义单链表结点类型 
    ElemType data;         //每个结点存放一个数据元素
    struct LNode  *next;   //指针指向下一个节点
};

//增加一个新的节点:在内存中申请一个结点所需空间,并用指针p指向这个结点
struct LNode *p = (struct LNode *)malloc(sizeof(struct LNode));  //malloc分配内存

简化写法

typedef struct LNode LNode;
LNode *p = (LNode*) malloc(size of(LNode));

定义的结构体其实就是定义一个节点,只需要找到这个表的第一个节点就能访问整个表,所以LinkList代表的就是第一个节点的指针。

typedef struct LNode *LinkList;   //LinList为指向struct LNode的指针
LNode *L;   //声明一个指向单链表第一个结点的指针
或
LinList L; //声明一个指向单链表第一个结点的指针

简化为:
tyepedef struct LNode{
    ElemType data;         //数据域:每个节点存放一个数据元素
    struct LNode *next;   //指针域:指针指向下一个节点
}LNode,*LinkList;         

基本单链表返回值函数:LNode *强调的是返回的是一个结点p;LinkList强调的是在一个单链表里寻找i。

LNode *GetElem(LinkList L,int i){
    int j = 1;
    LNode *p = L -> next;
    if(i==0)
        return L;
    if(i<1)
        return NULL;
    while(p!=NULL && j < i){
        p = p->next;
        j++;
    }
    return p;
}

不带头结点的单链表:

//初始化一个空的单链表
bool InitList(LinkList &L)
{
    L = NULL;    //空表,暂时还没有任何结点(防止脏数据)
    return true;
}

void test(){
    LinkList L;   //声明一个指向单链表的指针
    InitList(L);  //初始化
}

//判断单链表是否为空
bool Empty(LinkList L){
    if(L == NULL)
        return true;
    else
        return false;
}

//另一种写法
bool Empty(LinkList L)
{
    return (L==NULL);   
}

带头结点的单链表:头指针L,头结点不存储数据

//初始化一个单链表(带头结点)
bool InitList(LinkList &L){
    L  = (LNode *)malloc(sizeof(LNode));   //分配一个头结点
    if(L==NULL)        //内存不足,分配失败
        return false;    
    L->next = NULL;         //头结点之后暂时还没有节点
        return true;
}

//判断单链表是否为空(带头结点)
bool Empty(LinkList L)
{
    if(L->next == NULL)
        return true;
    else
        return false;
}

总结:

带头结点:虚拟出来的,为了写代码方便,因此头指针L指向的该头结点不存储数据;

不带头结点:指针L指向的下一个数据就是存储数据的节点;

(2)链表插入和删除

在第i个位置插入元素e(带头结点):

如果i=1,则满足p不为NULL,因为p指向头结点不为空。

如果①和②对调,则会出现e指向e。

bool ListInsert(LinkList &L, int i, ElemType e)
{
    if(i<0) 
        return false;
    LNode *p;   //指针p指向当前扫描到的结点
    int j = 0;  //当前p指向的第几个结点
    p = L;      //L指向头结点,头结点是第0个结点(不存数据)
    while(p!=NULL && j<i-1)   //循环找到第i-1个结点
    {
        p=p->next;
        j++;
    }

    if(p==NULL)
        return false;

    LNode *s = (LNode *)malloc(sizeof(LNode));
    s->data = e;
    s->next = p->next;  //①
    p->next = s;        //②
    return true;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值