单链表 基本操作

目录

初始化

求表长

按序号查找结点

按值查找结点

插入结点(后插)

插入结点(前插)

删除结点(直接删除)

删除结点(间接删除)

头插法建立单链表

尾插法建立单链表

打印单链表

 总代码

测试样例 

初始化
//单链表
typedef int ElemType;
typedef struct LNode{       //这时这个LNode 不能省略,因为在结构体中有结构体指针
    ElemType data;         //数据域
    struct LNode *next;   // 指针域
}LNode,*LinkList;

//单链表初始化
bool InitList(LinkList &L)
{
    L = (LNode*)malloc(sizeof(LNode));
    L->next=NULL;
    return true;
}
求表长
//求表长
int LengthList(LinkList L)
{
    int len=0;
    LNode *p = L->next;
    while(p!=NULL)
    {
        p=p->next;
        len++;
    }
    return len;
}
按序号查找结点
//按序号查找结点
LNode *GetElem(LinkList L,int i)  //头结点代表第 0 个结点
{
    int j=0;
    LNode *p = L;
    while(p!=NULL && j<i)
    {
        p=p->next;
        j++;
    }
    return p;
}
按值查找结点
//按值查找表结点
LNode *LocateElem(LinkList L,ElemType e)
{
    LNode *p=L->next;                    //因为头结点中没有值,所以不用找,直接从L—>next 开始遍历
    while(p!=NULL && p->data != e)
    {
        p=p->next;
    }
    return p;
}
插入结点(后插)
// 链表中插入结点 ,这是后插操作
bool ListInsert1(LinkList &L,int i,ElemType e)
{
    LNode *p=L;
    int j=0;
    while(p!=NULL && j<i-1)
    {
        p=p->next;
        j++;
    }
    if(p==NULL)                   //判断i的合法性
    {
        return false;
    }
    LNode *s = (LNode*)malloc(sizeof(LNode));
    s->data = e;
    s->next = p->next;
    p->next = s;
    return true;
}
插入结点(前插)
// 链表中插入结点 ,这是前插操作
bool ListInsert2(LinkList &L,int i,ElemType e)
{
    LNode *p=L;
    int j=0;
    while(p!=NULL && j<i)
    {
        p=p->next;
        j++;
    }
    if(p==NULL)                   //判断i的合法性
    {
        return false;
    }
    LNode *s = (LNode*)malloc(sizeof(LNode));
    s->data = e;
    s->next = p->next;
    p->next = s;
    int temp = p->data;
    p->data =  s->data;
    s->data = temp;
    return true;
}
删除结点(直接删除)
//链表中删除结点
//修改前驱结点的指针域,使其指向要删除元素的后继结点,再把要删元素所占用的空间free掉
bool ListDelete1(LinkList &L,int i,ElemType e)
{
    LNode *p = L;
    int j=0;
    while(p!=NULL && j<i-1)
    {
        p=p->next;
        j++;
    }
    if(p == NULL || p->next == NULL )      //p->next的意思是 最后一个位置的后面一个位置没有东西的怎么删
    {
        return false;
    }
    LNode *q = p->next;
    e=q->data;
    p->next = q->next;
    free(q);
    return true;
}
删除结点(间接删除)

要删结点和其后继结点的数据域交换,而后修改指针的值,最后free后继结点

//链表中删除结点
//可以将要删除结点的后继结点赋值给该结点,而后将后继结点free掉就可以
bool ListDelete2(LinkList &L,int i,ElemType e)
{
    LNode *p = L;
    int j=0;
    while(p!=NULL && j<i)
    {
        p=p->next;
        j++;
    }
    if(p == NULL)
    {
        return false;
    }
    LNode *q = p->next;
    e=p->data;
    p->data = q->data;
    p->next = q->next;
    free(q);
    return true;
}
头插法建立单链表
//头插法新建单链表
LinkList List_HeadInsert(LinkList &L)
{
    LNode *s;
    int x;
    L = (LNode*) malloc(sizeof(LNode));
    L->next = NULL;
    scanf("%d",&x);
    while(x!=9999)
    {
        s=(LNode*) malloc(sizeof (LNode));
        s->data = x;
        s->next = L->next;
        L->next = s;
        scanf("%d",&x);
    }
    return L;
}
尾插法建立单链表

需要一个尾指针不断指向当前位置(即尾结点)

//尾插法新建单链表   必须增加一个尾指针,记录上一个插入节点的位置
LinkList List_TailInsert(LinkList &L)
{
    LNode *s;
    int x;
    L= (LNode*) malloc(sizeof(LNode));
    LNode *r = L;
    L->next = NULL;
    scanf("%d",&x);
    while(x!=9999)
    {
        s=(LNode*) malloc(sizeof(LNode));
        s->data = x;
        r->next =s;
        r=s;
        scanf("%d",&x);
    }
    r->next = NULL;
    return L;
}
打印单链表
//打印单链表
void print(LinkList L)
{
    LNode *s = L;
    while(s->next != NULL)
    {
        s =s->next;
        printf("%d ",s->data);
    }
    printf("\n");
}
 总代码
#include <stdio.h>
#include <stdlib.h>

//单链表
typedef int ElemType;
typedef struct LNode{       //这时这个LNode 不能省略,因为在结构体中有结构体指针
    ElemType data;         //数据域
    struct LNode *next;   // 指针域
}LNode,*LinkList;

//单链表初始化
bool InitList(LinkList &L)
{
    L = (LNode*)malloc(sizeof(LNode));
    L->next=NULL;
    return true;
}

//求表长
int LengthList(LinkList L)
{
    int len=0;
    LNode *p = L->next;
    while(p!=NULL)
    {
        p=p->next;
        len++;
    }
    return len;
}

//按序号查找结点
LNode *GetElem(LinkList L,int i)  //头结点代表第 0 个结点
{
    int j=0;
    LNode *p = L;
    while(p!=NULL && j<i)
    {
        p=p->next;
        j++;
    }
    return p;
}

//按值查找表结点
LNode *LocateElem(LinkList L,ElemType e)
{
    LNode *p=L->next;                    //因为tnd 头结点中没有值,所以不用找,直接从L—>next 开始遍历
    while(p!=NULL && p->data != e)
    {
        p=p->next;
    }
    return p;
}

// 链表中插入结点 ,这是后插操作
bool ListInsert1(LinkList &L,int i,ElemType e)
{
    LNode *p=L;
    int j=0;
    while(p!=NULL && j<i-1)
    {
        p=p->next;
        j++;
    }
    if(p==NULL)                   //判断i的合法性
    {
        return false;
    }
    LNode *s = (LNode*)malloc(sizeof(LNode));
    s->data = e;
    s->next = p->next;
    p->next = s;
    return true;
}
// 链表中插入结点 ,这是前插操作
bool ListInsert2(LinkList &L,int i,ElemType e)
{
    LNode *p=L;
    int j=0;
    while(p!=NULL && j<i)
    {
        p=p->next;
        j++;
    }
    if(p==NULL)                   //判断i的合法性
    {
        return false;
    }
    LNode *s = (LNode*)malloc(sizeof(LNode));
    s->data = e;
    s->next = p->next;
    p->next = s;
    int temp = p->data;
    p->data =  s->data;
    s->data = temp;
    return true;
}

//链表中删除结点
//修改前驱结点的指针域,使其指向要删除元素的后继结点,再把要删元素所占用的空间free掉
bool ListDelete1(LinkList &L,int i,ElemType e)
{
    LNode *p = L;
    int j=0;
    while(p!=NULL && j<i-1)
    {
        p=p->next;
        j++;
    }
    if(p == NULL || p->next == NULL )      //p->next的意思是 最后一个位置的后面一个位置没有东西的怎么删
    {
        return false;
    }
    LNode *q = p->next;
    e=q->data;
    p->next = q->next;
    free(q);
    return true;
}
//链表中删除结点
//可以将要删除结点的后继结点赋值给该结点,而后将后继结点free掉就可以
bool ListDelete2(LinkList &L,int i,ElemType e)
{
    LNode *p = L;
    int j=0;
    while(p!=NULL && j<i)
    {
        p=p->next;
        j++;
    }
    if(p == NULL)
    {
        return false;
    }
    LNode *q = p->next;
    e=p->data;
    p->data = q->data;
    p->next = q->next;
    free(q);
    return true;
}

//头插法新建单链表
LinkList List_HeadInsert(LinkList &L)
{
    LNode *s;
    int x;
    L = (LNode*) malloc(sizeof(LNode));
    L->next = NULL;
    scanf("%d",&x);
    while(x!=9999)
    {
        s=(LNode*) malloc(sizeof (LNode));
        s->data = x;
        s->next = L->next;
        L->next = s;
        scanf("%d",&x);
    }
    return L;
}

//尾插法新建单链表   必须增加一个尾指针,记录上一个插入节点的位置
LinkList List_TailInsert(LinkList &L)
{
    LNode *s;
    int x;
    L= (LNode*) malloc(sizeof(LNode));
    LNode *r = L;
    L->next = NULL;
    scanf("%d",&x);
    while(x!=9999)
    {
        s=(LNode*) malloc(sizeof(LNode));
        s->data = x;
        r->next =s;
        r=s;
        scanf("%d",&x);
    }
    r->next = NULL;
    return L;
}

//打印单链表
void print(LinkList L)
{
    LNode *s = L;
    while(s->next != NULL)
    {
        s =s->next;
        printf("%d ",s->data);
    }
    printf("\n");
}
int main() {
    LinkList L;
    List_TailInsert(L);
    print(L);
    ListInsert1(L,3,8);
    print(L);
    return 0;
}

//7 8 2 5 6 9999
测试样例 

9999 表示结束

注:本文仅个人笔记,欢迎讨论交流

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值