第四章 ALDS1_3_C:Doubly Linked List 链表

来源:互联网 发布:java性能监控系统 编辑:程序博客网 时间:2024/06/05 08:31

知识点

链表

  • 链表类型
    • 单向链表: 数据本体和指向后一元素的指针next
    • 双向链表: 数据本体、指向前一元素的指针prev和指向后一元素的指针next
    • 循环链表: 在单向链表或者双向链表的前提下加上循环利用数组的机制的链表
  • STL的list类(双向链表)的成员函数
    • size():返回表的元素数
    • begin():返回指向表开头的迭代器
    • end():返回表末尾的迭代器
    • push_front(x):在表的开头添加元素x
    • push_back(x):在表的末尾添加元素x
    • pop_front():删除表头的元素
    • pop_back():删除表尾的元素
    • insert(p,x):在表的位置p插入元素x
    • erase(p):删除表中位置p的元素
    • clear():删除表中的所有元素

问题链接

ALDS1_3_C:Doubly Linked List

问题内容

模拟链表的插入删除功能,输出链表的元素

思路

模拟链表的插入删除功能

代码

实现双向链表功能

#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>using namespace std;const int maxx = 100000 + 10;struct Node {    int key;    Node *prev, *next;};Node *nil;// 链表初始化void init() {    nil = (Node *)malloc(sizeof(Node));    //C++ nil = new Node();    nil->next = nil;    nil->prev = nil;}// 从链表搜索出值为key的结点 O(n)Node* listSearch(int key) {    // 从链表头结点开始访问    Node *cur = nil->next;    while (cur != nil && cur->key != key) {        cur = cur->next;    }    return cur;}// 打印链表void printList() {    Node *cur = nil->next;    int flag = 0;    while (cur != nil) {        if (flag++ > 0)            printf(" ");        printf("%d", cur->key);        cur = cur->next;    }    printf("\n");}// 删除结点tvoid deleteNode(Node *t) {    // t为头结点不做处理    if (t == nil)        return;    t->prev->next = t->next;    t->next->prev = t->prev;    free(t);    //C++ delete(t);}// 删除头结点void deleteFirst() {    deleteNode(nil->next);}// 删除尾结点void deleteLast() {    deleteNode(nil->prev);}// 删除指定的key O(n)void deleteKey(int key) {    deleteNode(listSearch(key));}// 在链表头部添加元素keyvoid insert(int key) {    Node *x = (Node *)malloc(sizeof(Node));    //C++ Node *x = new Node();    x->key = key;    x->next = nil->next;    nil->next->prev = x;    nil->next = x;    x->prev = nil;}int main() {    int n, key, size = 0;    char op[20];    scanf("%d", &n);    getchar();    // 初始化链表    init();    for (int i = 0; i < n; i++) {        scanf("%s %d", op, &key);        if (op[0] == 'i') {            insert(key);            size++;        }        else {            if (strlen(op) > 6) {                if (op[6] == 'F') {//删除头结点                    deleteFirst();                }                else {//删除尾结点                    deleteLast();                }            }            else { //删除结点                deleteKey(key);            }            size--;        }    }    printList();    return 0;}

利用STL的list类

#include<iostream>#include<cstdio>#include<cstring>#include<list>using namespace std;int main() {    int n, key;    char op[20];    list<int> List;    scanf("%d", &n);    getchar();    for (int i = 0; i < n; i++) {        scanf("%s %d", op, &key);        if (op[0] == 'i') {            List.push_front(key);        }        else {            if (strlen(op) > 6) {                if (op[6] == 'F') {//删除头结点                    List.pop_front();                }                else {//删除尾结点                    List.pop_back();                }            }            else { //删除结点                for (list<int>::iterator it = List.begin(); it != List.end(); it++) {                    if (*it == key) {                        List.erase(it);                        break;                    }                }            }        }    }    int flag = 0;    for (list<int>::iterator it = List.begin(); it != List.end(); it++) {        if (flag != 0)            printf(" ");        flag++;        printf("%d", (*it));    }    printf("\n");    return 0;}
原创粉丝点击