数据结构---双向链表

在单向链表的基础上的扩展

(1)初始化

复制代码
typedef struct Node
{
    int data;
    struct Node *pre;//指向前一个结点
    struct Node *next;//指向后一个结点
}Node,*DoubleLinkList;
//初始化,产出一个头结点
DoubleLinkList InitList(){
    //分配内存
    Node *head = (Node*)malloc(sizeof(Node));
    if(head == NULL)
    {
        printf("内存申请失败\n");
        return head;
    }
    head->pre = NULL;
    head->next = NULL;
    //没有对data赋值,不代表data没有数据
    return head;
}

(2)添加数据

1,头插法

复制代码
//头插法
DoubleLinkList headInsert(DoubleLinkList l,int k){
    //1.新结点
    Node *s = (Node*)malloc(sizeof(Node));
    //判断
    if(s == NULL)
    {
        printf("内存申请失败\n");
        return l;
    }
    //2.初始化新结点
    s->data = k;
    s->next = l->next;
    s->pre = l;
    //添加
    if(l->next != NULL)
    {
        l->next->pre = s;
    }
    l->next = s; 

    return l;
}

2,尾插法

复制代码
//尾插法
DoubleLinkList tailInsert(DoubleLinkList l,int k){
    //1.新结点
    Node *s = (Node*)malloc(sizeof(Node));
    //判断
    if(s == NULL)
    {
        printf("内存申请失败\n");
        return l;
    }
    //2.初始化新结点
    s->data = k;
    s->next = NULL;
    //查找并添加
    Node *temp = l;
    while(temp->next!=NULL)
    {
        temp = temp->next;
    }
    s->pre = temp;
    temp->next = s;

    return l;

}

3,中间插入

复制代码
//中间插入
DoubleLinkList middleInsert(DoubleLinkList l,int x,int k){
    //新结点
    Node *s = (Node*)malloc(sizeof(Node));
    s->data = k;

    Node*p = Find(l,x);
    if(p == NULL)
    {
        printf("查无此数据\n");
        return l;
    }
    s->next = p->next;
    if(p->next!=NULL)
    {
        p->next->pre = s;
    }
    p->next = s;
    s->pre = p;
    
    return l;

}

(3)查找

复制代码
//查找
Node *Find(DoubleLinkList l,int x){
    Node *temp = l->next;
    while(temp!=NULL&&temp->data!=x)
    {
        temp = temp->next;
    }
    return temp;
}

(4)删除

复制代码
//删除
DoubleLinkList delete(DoubleLinkList l,int x){
    Node *temp = Find(l,x);
    if(temp == NULL)
    {
        printf("查无此数据\n");
        return l;
    }
    temp->pre->next = temp->next;
    if(temp->next != NULL)
    {
        temp->next->pre = temp->pre;
    }
    free(temp);
    temp = NULL;
    return l;
}

(5)修改

复制代码
//修改
DoubleLinkList changeList(DoubleLinkList l,int x,int k){
    Node* temp = Find(l,x);
    if(temp == NULL)
    {
        printf("查无此数据\n");
        return l;
    }
    temp->data = k;
    return l;
}

(6)输出

复制代码
//输出
void printff(DoubleLinkList l){
    Node *temp = l->next;
    if(temp == NULL)
    {
        printf("空链表,数据为空\n");
    }
    while(temp!=NULL)
    {
        printf("%d ",temp->data);
        temp = temp->next;
    }
}
相关推荐
mmmmath_34 小时前
LeetCode.199.二叉树的右视图
数据结构·leetcode
Shaoshing9 小时前
前缀和与差分
java·数据结构·算法·前缀和·差分
mmmmath_39 小时前
LeetCode.429.N叉树的层序遍历
数据结构·leetcode
suhan11 小时前
【数据结构】三、栈和队列:6.链队列、双端队列、队列的应用(树的层次遍历、广度优先BFS、先来先服务FCFS)
数据结构·后端·算法
suhan11 小时前
【数据结构】三、栈和队列:5.顺序队列(循环队列)(初始化,判空判满,入队,出队,实例)
数据结构·后端·算法
suhan11 小时前
【数据结构】三、栈和队列:3.链栈(链栈栈的初始化,判空,进栈,出栈,读取栈顶,链栈实例)
数据结构·后端·算法
suhan11 小时前
【数据结构】三、栈和队列:4.栈的应用(括号匹配,四则运算表达式求值,进制转换,递归)
数据结构·后端·算法
suhan11 小时前
【数据结构】三、栈和队列:2.顺序栈&共享栈(顺序栈的初始化,判空,进栈,出栈,读取栈顶,顺序栈实例)
数据结构·后端·算法
SelectDB11 小时前
部署形态与存算分离速查:形态对照、配置项清单与关键命令片段
大数据·数据结构·数据库
0+11112 小时前
算法 --哈希表
数据结构·算法·散列表