c++单链表操作

/*
 * SingleList.cpp
 *
 *  Created on: Feb 24, 2017
 */

#include <cassert>
#include <iostream>

using namespace std;

struct SingleListNode {
    int val;
    SingleListNode *next;
    SingleListNode(int x) :
            val(x), next(nullptr) {
    }
    SingleListNode(int x, SingleListNode* pn) {
        val = x;
        next = pn;
    }
};

class SingleList {
private:
    SingleListNode *m_head;
    int m_length;
public:
    SingleList() {
        m_head = nullptr;
        m_length = 0;
    }
    ~SingleList() {
        while (m_head) {
            SingleListNode *p = m_head->next;
            delete m_head;
            m_head = p;
        }
    }
    //插入
    void insert(int index, const int Ele) {
        assert(index > 0 && index < m_length + 2);
        if (index == 1) {
            m_head = new SingleListNode(Ele, m_head);
        } else {
            SingleListNode *p = m_head;
            while (index > 2) {
                p = p->next;
                index--;
            }
            p->next = new SingleListNode(Ele, p->next);
        }
        m_length++;
    }

    //删除操作:
    //-1:error 0:correct
    int erase(int index) {
        if (index < 1 || index > m_length) {
            return -1;
        }
        SingleListNode *p = m_head;
        if (index == 1) {
            m_head = m_head->next;
            delete p;
        } else {
            while (index > 2) {
                index--;
                p = p->next;
            }
            SingleListNode* tmp = p->next;
            p->next = p->next->next;
            delete tmp;
        }
        m_length--;
        return 0;
    }
    int getlength() {
        return m_length;
    }

    void print() {
        SingleListNode* p = m_head;
        while (p) {
            cout << p->val << "->";
            p = p->next;
        }
        cout << endl;
    }

    //插入排序
    void insertSort() {
        SingleListNode* fake = new SingleListNode(-1, m_head); //建一个假的节点
        if (m_head->next == nullptr) return;
        SingleListNode* cur = m_head->next;
        SingleListNode* cur_next = cur->next;
        SingleListNode* cur_pre = m_head;
        while (cur) {
            SingleListNode *p = fake;
            while (p->next != cur) {
                if (cur->val < p->next->val) {
                    SingleListNode* tmp = p->next;
                    p->next = cur;
                    cur->next = tmp;
                    cur_pre->next = cur_next;
                    cur = cur_next;
                    if (cur)
                        cur_next = cur->next;
                    break;
                } else {
                    p = p->next;
                }
            }
            if (p->next == cur) {
                cur_pre = cur;
                cur = cur_next;
                if (cur)
                    cur_next = cur->next;
            }
        }
        m_head = fake->next;
    }

    //归并排序
    void mergeSort() {
        m_head = mergeSort(m_head);
    }

    //链表翻转
    void reverse() {
        if (!m_head || !m_head->next)
            return;
        SingleListNode* cur = m_head->next;
        SingleListNode* cur_next;
        m_head->next = nullptr;
        while (cur) {
            cur_next = cur->next;
            cur->next = m_head;
            m_head = cur;
            cur = cur_next;
        }
    }
private:
    SingleListNode* mergeSort(SingleListNode* head) {
        if (head == nullptr || head->next == nullptr)
            return head; //less 2 nodes
        SingleListNode* slow = head;
        SingleListNode* fast = head;
        SingleListNode* pre = head;
        while (fast && fast->next) {
            pre = slow;
            slow = slow->next;
            fast = fast->next->next;
        }
        pre->next = nullptr;
        cout << slow->val << endl;
        return merge(mergeSort(head), mergeSort(slow));
    }

    SingleListNode* merge(SingleListNode* l1, SingleListNode* l2) {
        SingleListNode* dummy = new SingleListNode(-1);
        SingleListNode* cur = dummy;
        while (l1 && l2) {
            if (l1->val < l2->val) {
                cur->next = l1;
                l1 = l1->next;
            } else {
                cur->next = l2;
                l2 = l2->next;
            }
            cur = cur->next;
        }
        if (l1)
            cur->next = l1;
        if (l2)
            cur->next = l2;
        return dummy->next;
    }

};

void insertSort(int a[], int n) {
    int temp;
    for (int i = 1; i < n; i++) {
        temp = a[i];
        int j = i - 1;
        while (j > -1 && temp < a[j]) {
            a[j + 1] = a[j];
            j--;
        }
        a[j + 1] = temp;
    }
}

int main() {
    SingleList l = SingleList();
    l.insert(1, 2);
    l.insert(1, 3);
    l.insert(1, 1);
    l.insert(2, 0);
    l.print();
    l.mergeSort();
//    l.insertSort();
//    l.mergeSort();
//    l.reverse();
    l.print();
    return 0;
}
时间: 2024-10-05 12:06:43

c++单链表操作的相关文章

数据结构上机测试2-1:单链表操作A (顺序建表+关键字删除)

数据结构上机测试2-1:单链表操作A Time Limit: 1000MS Memory limit: 4096K 题目描述 输入n个整数,先按照数据输入的顺序建立一个带头结点的单链表,再输入一个数据m,将单链表中的值为m的结点全部删除.分别输出建立的初始单链表和完成删除后的单链表. 输入 第一行输入数据个数n: 第二行依次输入n个整数: 第三行输入欲删除数据m. 输出 第一行输出原始单链表的长度: 第二行依次输出原始单链表的数据: 第三行输出完成删除后的单链表长度: 第四行依次输出完成删除后的

单链表操作

#include<stdio.h>#include<malloc.h> typedef struct Node{ int data; struct Node *next;}LinkList; //就地反转int LinkListRerverse(LinkList *head){ LinkList *q,*p; p = head->next; head->next = NULL; while(p != NULL){ q = p->next; p->next =

单链表操作系列

#include<stdio.h> #include<stdlib.h> typedef int ElemType; //定义结点类型 typedef struct Node { ElemType data; struct Node *next; }LNode,*LinkList; //单链表的建立1,头插法建立单链表,逆序生成 LinkList LinkListCreateH() { LinkList L,p; L = (LinkList)malloc(sizeof(LNode)

数据结构之 线性表---单链表操作A (删除链表中的指定元素)

数据结构上机测试2-1:单链表操作A Time Limit: 1000MS Memory limit: 4096K 题目描述 输入n个整数,先按照数据输入的顺序建立一个带头结点的单链表,再输入一个数据m,将单链表中的值为m的结点全部删除.分别输出建立的初始单链表和完成删除后的单链表. 输入 第一行输入数据个数n: 第二行依次输入n个整数: 第三行输入欲删除数据m. 输出 第一行输出原始单链表的长度: 第二行依次输出原始单链表的数据: 第三行输出完成删除后的单链表长度: 第四行依次输出完成删除后的

10、单链表操作

单链表操作 单链表操作1 /*单链表的类型定义*/ typedef int DataType; typedef struct node { DataType data; struct node * next; }LinkNode, *LinkList; /*单链表的定位运算*/ LinkNode *Locate(LinkNode *L, int k)//????为什么此处是LinkNode *Locate()类型,表示什么意思 { LinkNode *p; int i; i= 1; p = L-

循环单链表操作(转)

循环单链表的初始化,建立,插入,查找,删除. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 //////////////////////////////////////////////// //循环单链表的初始化,建立,插入,查找,删除.// //Autho

单链表操作实例程序

#include <iostream> #include <iomanip> using namespace std; typedef struct node { int val; node *next; }node; node * create_list(); void traverse_list(node *pHead); int get_len_list(node *pHead); bool delete_list(node *pHead,int pos,int &v

单链表操作问题,主要是逆操作

工作无事,搞其它事也不太方便,写点简单代码.本来想写的高大上一些,发现用范型不是一点代码的事,还是算了. #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct list { int val; struct list *next; }Node_def; #define NODE_SIZE (sizeof(Node_def)) #undef T #define T Node_def

数据结构之---c语言实现循环单链表操作

//=========杨鑫========================// //循环单链表的实现 #include <stdio.h> #include <stdlib.h> typedef int ElemType; //定义结点类型 typedef struct Node { ElemType data; struct Node *next; }Node,*LinkedList; int count = 0; //1.单循环链表的初始化 LinkedList init_ci

单链表操作(数据结构实验一)

 实验内容 1 初始化一个带表头结点的单链表. 2 从表头不断插入结点建立一个带表头结点的单链表.设表中元素的类型为整型,元素值从键盘输入. 3 从表尾不断插入结点建立一个带表头结点的单链表.设表中元素的类型为整型,元素值从键盘输入. 4 打印一个带表头结点的单链表. 5 清空一个带表头结点的单链表. 代码:(只是把各个函数写好,并给出了调用数据,其他根据实验要求改就行了) #include<stdio.h> #include<stdlib.h> #include<mallo