第一章 线性结构-双向链表

哔哩哔哩数据结构讲解地址:https://space.bilibili.com/356198029

本代码视频讲解地址:https://www.bilibili.com/video/av62218948

复制代码
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
    int data; //数据
    struct node *front;//指向上一个结点
    struct node *next;//指向下一个结点
} Node;
Node* init()
{
    Node *first = (Node*)malloc(sizeof(Node));
    first->data = -1;
    //第一个结点的前地址 指向最后一个元素 看到后面你就明白了为什么这么做
    first->front = first; //第一个元素的头指向最后一个元素 也可以为空 都行
    first->next = NULL;
    return first;
}
void Add(Node* List,int data)
{
    Node* temp_List = List;
    while(temp_List->next)
        temp_List = temp_List->next;
    Node* new_Node = (Node*)malloc(sizeof(Node)); //申请内存
    new_Node->data = data;
    new_Node->front = temp_List;//指向上一个结点
    new_Node->next = NULL;//下一个结点为空
    temp_List->next = new_Node;//上一个结点的next 为新结点的地址
    List->front = new_Node;//将头结点的最后一个元素地址更新
}
void Show(Node* List)
{
    Node* temp_List = List;
    printf("List = [");
    while(temp_List->next)
    {
        temp_List = temp_List->next;
        printf("%d, ",temp_List->data);
    }
    printf("]\n");
}
void ReverseShow(Node* List)
{
    Node* temp_List = List->front;//让temp指针指向最后一个元素
    printf("ReverseList = [");
    while(temp_List->front != List->front)
    {
        printf("%d, ",temp_List->data);
        temp_List = temp_List->front;
    }
    printf("]\n");
}
void Delete(Node* List,int del_data)
{
    Node* temp_List = List;
    while(temp_List->data != del_data&&temp_List->next)
        temp_List = temp_List->next;
    if(temp_List->data == del_data){
        //改变temp 前后的指针
        temp_List->front->next = temp_List->next;
        temp_List->next->front = temp_List->front;
        free(temp_List);
    }
    else printf("未查找到\n");

}
void Insert(Node* List,int index,int data)
{
    Node* temp_List = List;
    while(index--&&temp_List->next)
        temp_List = temp_List->next;
    Node* new_Node = (Node*)malloc(sizeof(Node));//新结点
    //一堆指针指来指去(重要考点!!!!!)
    new_Node->data = data;
    new_Node->next = temp_List->next;
    new_Node->front = temp_List;
    temp_List->next = new_Node;
    new_Node->next->front = new_Node;

}
void Select(Node* List,int index);//自己完成查找
void Alter(Node* List,int data,int index);//自己完成修改
int main()
{
    Node* List_First;
    List_First = init();
    printf("%d\n",List_First->data);//检测初始化是否成功

    Add(List_First,5);
    Add(List_First,4);
    Add(List_First,6);
    Add(List_First,8);
    Add(List_First,9);
    Add(List_First,1);
    Add(List_First,2);
    Show(List_First);
    ReverseShow(List_First);
    Delete(List_First,6);
    printf("--------删除后-----------\n");
    Show(List_First);
    ReverseShow(List_First);

    Insert(List_First,2,100);
    Insert(List_First,4,888);
    printf("--------插入后-----------\n");
    Show(List_First);
    ReverseShow(List_First);
    return 0;
}
复制代码

 

posted @   小尾学长  阅读(173)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· 因为Apifox不支持离线,我果断选择了Apipost!
点击右上角即可分享
微信分享提示