单链表及其基本操作

单链表的基本操作

数据结构在代码优化以及设计过程的地位不可忽视,数据结构里包含很多内容,后续会一 一附上。此骗博客主要谈单链表,主要从其定义及创建,再完成一个简单的归并练习进行描述:

单链表的定义

在链表存储中,每个节点不仅包含所存元素的信息,还包含元素之间逻辑关系的信息。这么说有点抽象,我们可以这么理解:单链表中前驱结点包含后继结点的地址信息,这样就可以通过前驱结点中的地址信息来寻找后继结点的位置。

#

1.定义代码。

typedef struct LNode{
    int data;
    struct LNode *next;
}LNode;

2.尾插法

具体过程


void CreateListR(LNode *&L,int a[],int n){
    LNode *s,*r;
    L = (LNode *)malloc(sizeof(LNode));//申请头节点 
    L->next = NULL;
    r = L;// r始终指向终端节点,此时头节点就是终端节点
    int i;
    for(i = 0; i < n; ++i){
        s = (LNode *)malloc(sizeof(LNode));
        s->data = a[i];
        //开始插入
        s->next = r->next;
        r->next = s;

        r = r->next;//插入完毕,r后移 
    } 
    r->next = NULL;

} 

3.头插法

具体过程


void CreateListF(LNode *&L,int a[],int n){
    LNode *s;
    L = (LNode *)malloc(sizeof(LNode));
    L->next = NULL; 
    int i;
    for(i = 0;i < n; ++i){
        s = (LNode *)malloc(sizeof(LNode));
        s->data = a[i];
        //开始插入
        s->next = L->next;
        L->next = s; 
    }
} 

练习

题目:A和B是两个带头结点的单链表,其中元素递增有序。设计算法,将A和B归并成一个按元素值递增的有序链表C,C由A与B中的结点组成。
【分析】A、B中元素递增有序,要使归并后的C依然递增有序。可以从A,B中挑出最小的元素插入C的尾部。当A,B中所有的元素都插入C时,C一定递增有序。我们只需要

  1. 找出A,B中最小的元素
  2. 从A,B的开始结点中选取一个较小的插入C的尾部
  3. 由于A与B中元素长度可能不一致,我们只需要将剩下的元素(依然递增)插入C的尾部即可
void merge(LNode *A,LNode *B,LNode *&C){
    //1.记录两个链表的最小值 
    LNode *p = A->next;
    LNode *q = B->next;
    LNode *s;
    C = A;//头节点
    C->next = NULL;
    free(B);
    while(p!=NULL && q!=NULL){
        if(p->data <= q->data){
            s = p;
            //头插法 
            p = p->next;
            s->next = C->next;
            C->next = s;
        }else{
            s = q;
            q = q->next;
            s->next = C->next;
            C->next = s;
        } 
    } 

    while(p != NULL){
        s = p;
        p = p->next;
        s->next = C->next;
        C->next = s;
    }
    while(q != NULL){
        s = q;
        q = q->next;
        s->next = C->next;
        C->next = s; 
    }
}

代码运行截图
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值