数据结构C++单链表的头插法和尾插法

近期学习了数据结构的单链表的头插法和尾插法与大家进行交流,希望在考研的路上能够照亮你我,大家一起加油共勉。

首先我的编译软件是CLion,如果你用的跟我的编译软件一样,在用C++编译程序的时候可能会报错,错误为:warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失。要想解决这个问题就需要在CMakeLists.txt中加入

add_compile_options("$<$<C_COMPILER_ID:MSVC>:/utf-8>")
add_compile_options("$<$<CXX_COMPILER_ID:MSVC>:/utf-8>")这两行代码且必须在
add_executable(linklist2weicahfa main.cpp)这行代码之上。这样就解决了这个编译问题。

现在我们的编译工具已经进入了最佳状态下面我们开始正题:

首先实现数据结构C++的单链表头插法

(以下编程方式完全贴近考研408数据结构大题)

 首先我们先定义一个单链表,其中typedef int Element是为了在以后需要更改数据类型的时候方便更改,相当于就是将int 重命名为了Element.

定义一个链表的结构体分为两个部分,一个是数据域,一个是指针域。其中数据域是用来存放我们实现头插法和尾插法的数据,指针域则是用来便利我们寻找下一个节点的数据。因为单链表在数据结构的存储中,它的存储位置在物理上并不要求相互紧邻,可以是分散放置,所以就需要*next指针方便我们寻找到下一个数据节点。

定义好了我们所以要的结构体之后下面我们需要在主函数中进行创建一个LinkList L 指针链表(考研中大部分考题都是需要有一个头指针指向头结点,所以我们就按照考研的要求来进行编写代码)

首先头插法我们需要创建一个函数(下划线命名法)void  Llist_head_insert(LinkList &L)这里的返回值void,形式参数为LinkList &L,注意因为C++中的&叫做引用不叫取地址,考研面试会提问。

这个时候需要大家进行画图,考研的时候也需要说明自己编写代码时的思路。

这个时候代码写到这里我们就已经成功的创建了一个头插法的循环便利代码,下卖弄我开始逐句解释:

L=(LinkList)malloc(sizeof(LNode));这个代码的存在的意义就是头指针指向头结
L->next=NULL;这个代码的存在的意义就是头结点的下一个指针指向空NULL的意思就是空
Element x;这个代码的存在的意义就是定义一个整形变量,有人会问整形变量不是int吗,你怎么用的Element,这里我在说明一下,这里也是考研的重点其中typedef int Element是为了在以后需要更改数据类型的时候方便更改,相当于就是将int 重命名为了Element.(请考研的各位同学务必记住)
scanf("%d",&x);这句代码就是为了键盘输入数据;
LNode *s;//这个指针的作用是指向申请的新的节点,一定要对不画图的读者说明,申请的这个指针是为了指向新的节点。
while(x!=99){//(x!=99)是循环结束条件
    s=(LinkList)malloc(sizeof(LNode));//S指针指向申请的新节点
    s->data=x;//将输入的x的值赋给s的data域
    s->next=L->next;//让新申请的空间节点的next指针指向要插入节点的头结点
    L->next=s;//头结点的尾部指针指向新插入的节点
    scanf("%d",&x);//继续读取输入的值
}

下一步在主函数中写下代码;

写一个打印单链表的函数

以上就是我们单链表头结点插入的全部代码以及思路。

下面开始单链表尾插法:

其实只需要一些改动即可,首先我们一定要明白尾插法就是将数据一个一个的按找输入次序插入单链表,所以我们要考虑时间复杂度最少的插入办法,这个时候我们将定义一个LNode *r指针始终指向链表的尾部,这样我们就可以用最少的时间复杂度来进行运行我们的程序。

void list_tail_insert(LinkList &L){
    L=(LinkList)malloc(sizeof(LNode));//头指针指向头结点
    Element x;
    scanf("%d",&x);
    LNode *s,*r=L;//r的指针指向头结点的尾部
    while(x!=8){
        s=(LinkList)malloc(sizeof(LNode));
        s->data=x;
        r->next=s;//新节点给尾部节点next指针
        r=s;
        scanf("%d",&x);
    }
    r->next=NULL;//让插入最后一个数据之后r指针指向空。
}

其他的代码与单链表头插法的代码一样,请大家多多联系,终究会学懂弄通,考研加油。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值