IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 数据结构:双链表 -> 正文阅读

[数据结构与算法]数据结构:双链表

本题以尾插法从字符串建立字符型双链表并进行反转、插入、删除单个字符为例,讲解双链表的基本操作

#include <iostream>
#include <cassert>
#include <cstring>

using namespace std;

template<class T> struct DNode {
    T data;
    DNode *prior, *nxt;
};

template<class T> void CreateList(DNode<T> *&h, T a[], int n, bool hot) {
    DNode<T> *s,*r;
    h = new DNode<T>;
    if(hot) { // Insert at the head
        h->prior = h->nxt = NULL;
        for(int i = 0; i < n; i++) {
            s = new DNode<T>;
            s->data = a[i];
            s->nxt = h->nxt;
            if(h->nxt != NULL) h->nxt->prior = s;
            h->nxt = s;
            s->prior = h;
        }
    } else { // Insert at tail
        r = h;
        for(int i = 0; i < n; i++) {
            s = new DNode<T>;
            s->data = a[i];
            r->nxt = s;
            s->prior = r;
            r = s;
        }
        r->nxt = NULL;
    }
}

template<class T> void ListInsert(DNode<T> *&h, int pos, T ele) {
    DNode<T> *p = h, *s;
    int i = 0;
    assert(pos > 0);
    while(i < pos - 1 && p != NULL) {
        i++;
        p = p->nxt;
    }
    assert(p != NULL);
    s = new DNode<T>;
    s->data = ele;
    s->nxt = p->nxt;
    if(p->nxt != NULL) p->nxt->prior = s;
    s->prior = p;
    p->nxt = s;
}

template<class T> void ListDel(DNode<T> *&h, int pos) {
    DNode<T> *p = h, *q;
    int i = 0;
    assert(pos > 0);
    while(i < pos - 1 && p != NULL) {
        i++;
        p = p->nxt;
    }
    assert(p != NULL);
    q=p->nxt;
    assert(q != NULL);
    p->nxt = q->nxt;
    if(q->nxt != NULL) q->nxt->prior = p;
    delete q;
}

template<class T> void Reverse(DNode<T> *&h) {
    DNode<T> *p = h->nxt, *q; // p is each element which is ready to insert at the head in order to reverse
    h->nxt = NULL;
    while(p != NULL) {
        q = p->nxt;
        p->nxt = h->nxt;
        if(h->nxt != NULL) h->nxt->prior = p;
        h->nxt = p;
        p->prior = h;
        p = q;
    }
}

template<class T> ostream & operator << (ostream &os, DNode<T> *h) {
    DNode<T> *p = h->nxt;
    while(p != NULL) {
        os << p->data << ' ';
        p = p->nxt;
    }
    return os;
}

int main() {
    char str[50], ch;
    int pos1, pos2;
    DNode<char> *root;
    cout << "Position and char to insert, remove: " << endl;
    cin >> pos1 >> pos2 >> ch;
    cout << "Input a string:" << endl;
    cin >> str;
    CreateList(root, str, strlen(str), false);
    Reverse(root);
    cout << "The reversed result is: " << endl << root << endl;
    ListInsert(root, pos1, ch);
    cout << "Result 1: " << endl << root << endl;
    ListDel(root, pos2);
    cout << "Result 2: " << endl << root << endl;
    return 0;
}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-10 22:50:47  更:2022-03-10 22:52:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 13:32:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码