<数据结构>创建一个单链表

本文介绍了如何使用C++创建并操作单链表,包括初始化、插入、删除、输出元素、计算长度、按值排序、逆置以及合并两个有序单链表。此外,还设计了用户交互的菜单界面,允许用户选择不同的链表操作。所有操作中的数据元素抽象为ElemType类型,可以是多种数据类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

单链表基本操作的实现

内容:构建线性表的链式存储结构,采用动态分配方式实现单链表的初始化,数据的插入,删除,输出单链表内中各元素,求单链表的长度,实现单链表中数据结点的按值排序,实现单链表的逆置,合并两个有序的单链表(有序的a表和有序的b表合并之后的结果保存在a表中)等操作。
同时:
(1)要有能根据用户的输入来选择不同运算的菜单界面。
(2)单链表中数据元素的类型统一抽象表示为ElemType类型,具体类型不限,可以是整型、实型、字符型、或者是自己构造的一种结构体类型。

代码如下:

#include <iostream>
#define ElemType int
using namespace std;

//带头结点的单链表类,头结点存放单链表长度 
class Single_List {
   
private:
    ElemType data;
    Single_List* next;
public:

    Single_List() {
   };

    //单链表的创建函数,尾插法 
    Single_List* Create(int len) {
   
        Single_List* prev, * head, * tail;
        head = new Single_List;
        head->data = len;
        head->next = NULL;
        prev = head;
        if (len == 0) {
   
            goto end;
        }
        cout << "请输入各个结点的数值:" << endl;
        while (len--) {
   
            int data;
            tail = new Single_List;
            cin >> data;
            this->attach(prev, tail, data);
            prev = tail;
        }
    end:    return head;
    }

    void attach(Single_List* prev, Single_List* tail, int data) {
   
        tail->next = NULL;
        tail->data = data;
        prev->next = tail;
    }

    int getLength(Single_List* list) {
   
        return list->data;
    }

    //判断单链表是否为空的函数 
    bool Isempty(Single_List* list) {
   
        return list->data == 0;
    }

    //单链表的打印函数
    void Print(Single_List* list) {
   
        if (list->Isempty(list)) {
   
            cout << "单链表为空" << endl;
            return;
        }
        int len = list->data;
        Single_List* ptrl = list->next;
        for (int i = 0; i < len; i++) {
   
            cout << ptrl->data << " ";
            ptrl = ptrl->next;
        }
    }

    //在第index个结点后面插入数值为data的结点的函数 
    Single_List* Insert(Single_List* list, int index, int data) {
   
        Single_List* prev = list;
        Single_List* insert;
        insert = new Single_List;
        int len = list->getLength(list);
        //链表为空时,无论index为多少,只能插在第一个位置 
        if (this->Isempty(list)) {
   
            this->attach(prev, insert, data);
            list->data++;
            return list;
        }
        //如果插入的位置大于等于链表长度直接插到末尾, 
        index = (list->data <= index) ? list->data : index;
        for (int i = 0; i < index; i++) {
   
            prev = prev->next;
        }
        insert->data = data;
        insert->next = prev->next;
        prev->next = insert;
        list->data++;
        return list;
    }

    //寻找第k个结点的函数,只适用链表不为空的情况 
    Single_List* Findkth(Single_List* list, int
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值