从0开始学算法--数据结构(2.5链表)

时间:2019-10-21
本文章向大家介绍从0开始学算法--数据结构(2.5链表),主要包括从0开始学算法--数据结构(2.5链表)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

链表是一种特殊的存储结构,数组使用一段连续的空间存储数据,所以访问比较方便(如,访问第3个元素直接查找下表尾2的元素就好),但使删除元素就会特别麻烦(比如删除第一个元素就会导致剩下的元素全部前移一位,时间复杂度尾n)。

链表是将一系列散点连成一条线存储数据,删除某点的时候直接删除当前点,将此点前一个点连接到后一个点即可。

双端队列实现:

节点类型

struct node{
    int key;
    node *prev,*next;
};

初始化

node *nil;

void init(){
    nil=(node *)malloc(sizeof(node));
    nil->next=nil;
    nil->prev=nil;
}

插入元素

void insert(int key){
    node *x=(node *)malloc(sizeof(node));
    x->key=key;
    
    x->next=nil->next;
    nil->next->prev=x;
    nil->next=x;
    x->prev=nil;
}

搜索元素

node* listsearch(int key){
    node *cur=nil->next;
    while(cur!=nil&&cur->key!=key){
        cur=cur->next;
    }
    return cur;
}

删除元素

void deletenode(node *t){
    if(t==nil)return;
    t->prev->next=t->next;
    t->next->prev=t->prev;
    free(t);
}

void deletefirst(){
    deletenode(nil->next);
}

void deletelast(){
    deletenode(nil->prev);
}

void deletekey(int key){
    deletenode(listsearch(key));
}

例;模拟链表操作

输入:

7

insert 5

insert 2

insert 3

insert 1

delete 3

insert 6

delete 5

输出:

6 1 2

注释:命令部超过2000000,删除次数部超过20,命令过程中元素不超过106

代码:

#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<fstream>
#include<cstring>
#include<bitset>
#include<cstdio>
#include<time.h>
#include<deque>
#include<queue>
#include<stack>
#include<cmath>
#include<map>
#include<set>

using namespace std;

struct node{
    int key;
    node *prev,*next;
};

node *nil;

void init(){
    nil=(node *)malloc(sizeof(node));
    nil->next=nil;
    nil->prev=nil;
}

void printflist(){
    node *cur=nil->next;
    int isf=0;
    while(1){
        if(cur==nil)break;
        if(isf++>0)printf(" ");
        printf("%d",cur->key);
        cur=cur->next;
    }
    printf("\n");
}

void insert(int key){
    node *x=(node *)malloc(sizeof(node));
    x->key=key;

    x->next=nil->next;
    nil->next->prev=x;
    nil->next=x;
    x->prev=nil;
}

node* listsearch(int key){
    node *cur=nil->next;
    while(cur!=nil&&cur->key!=key){
        cur=cur->next;
    }
    return cur;
}

void deletenode(node *t){
    if(t==nil)return;
    t->prev->next=t->next;
    t->next->prev=t->prev;
    free(t);
}

void deletefirst(){
    deletenode(nil->next);
}

void deletelast(){
    deletenode(nil->prev);
}

void deletekey(int key){
    deletenode(listsearch(key));
}

int main(){
    int key,n,i;
    int size=0;
    char com[20];
    int np=0,nd=0;
    scanf("%d",&n);
    init();
    for(i=0;i<n;i++){
        scanf("%s%d",com,&key);
        if(com[0]=='i'){
            insert(key);
            np++;
            size++;
        }else if(com[0]=='d'){
            if(strlen(com)>6){
                if(com[6]=='F')deletefirst();
                else if(com[6]=='L')deletelast();
            }else{
                deletekey(key);
                nd++;
            }
            size--;
        }
    }
    printflist();
    return 0;
}

原文地址:https://www.cnblogs.com/wz-archer/p/11712482.html