数据结构——双链表

简介: 数据结构——双链表


目录

定义

双向链表的构建

初始化双链表

获得双链表节点函数

双链表尾插建表

打印双链表

查找双链表节点

双链表删除节点

双链表插入节点

双链表销毁


定义

单链表的每个结点中,在设置一个指向其前驱结点的指针域,最后一个结点又指向头结点,头节点的前驱指针指向最后一个结点,从而构成一个回路。

双向链表的构建

typedef int LTDataType;
typedef struct ListNode
{
  LTDataType data;
  struct ListNode *next;
  struct ListNode *prev;
}LtNode;

初始化双链表

//初始化双链表
 LtNode*ListInit()
{
   LtNode* phead = (LtNode*)malloc(sizeof(LtNode));
   phead->next = phead;
   phead->prev = phead;
   return phead;
}

获得双链表节点函数

//获得双链表节点函数
 LtNode* BuyListNode(LTDataType x)
 {
   LtNode* newnode = (LtNode*)malloc(sizeof(LtNode));
   newnode->data = x;
   newnode->next = NULL;
   newnode->prev = NULL;
   return newnode;
 }

双链表尾插建表

void ListPushBack(LtNode* phead)
 {
   assert(phead);
   LTDataType x;
   while (1)
   {
     scanf("%d", &x);
     if (x == -1)
       break;
     ListNode* newnode = BuyListNode(x);
     phead->prev->next = newnode;
     newnode->prev = phead->prev;
     newnode->next = phead;
     phead->prev = newnode;
   }
 }

打印双链表

void ListPrint(LtNode* phead)
 {
   assert(phead);
   LtNode* p = phead->next;
   while (p!= phead)
   {
     printf("%d  ", p->data);
     p = p->next;
   }
 }

查找双链表节点

LtNode* FindNode(LtNode*phead,int x)
 {
   LtNode* p = phead->next;
   while (x>1 && p != phead)
   {
     p = p->next;
     x--;
   }
   if (p == phead)//查找节点不存在
   {
     return NULL;
   }
   else
     return p;
 }

双链表删除节点

void ListDel(LtNode*phead)
 {
   printf("您要删除第几个数据:");
   int k;
   scanf("%d",&k);
   if (k == 1)
   {
     LtNode* p = phead->next;
     p->prev->next = p->next;
     p->next->prev = p->prev;
     free(p);
     return;
   }
   LtNode* p = FindNode(phead,k);
   p->prev->next = p->next;
   p->next->prev = p->prev;
   free(p);
 }

双链表插入节点

void ListInsert(LtNode*phead)
 {
   printf("您要在第几个数据前插入:");
   int k;
   scanf("%d", &k);
   printf("请输入你要插入的数据:");
   int data;
   scanf("%d", &data);
   LtNode* newnode = BuyListNode(data);
   if (k == 1)
   {
     LtNode* p = phead->next;
     p->prev->next = newnode;
     newnode->prev = p->prev;
     newnode->next = p;
     p->prev = newnode;
     return;
   }
   LtNode* p = FindNode(phead, k);
   p->prev->next = newnode;
   newnode->prev = p->prev;
   newnode->next = p;
   p->prev = newnode;
 }

双链表销毁

void ListDistory(LtNode*phead)
 {
   LtNode* p = phead->next;
   LtNode* q = NULL;
   while (q!=phead)
   {
     q = p->next;
     free(p);
     p = q;
   }
   free(phead);
 }


相关文章
|
21天前
|
存储 缓存 算法
数据结构-链表(一)
链表(Linked List)是一种常见的数据结构,用于存储和组织数据。与数组不同,链表的元素(节点)在内存中不必连续存储,而是通过指针链接在一起。 链表由多个节点组成,每个节点包含两部分:数据(存储实际的元素值)和指针(指向下一个节点的引用)。链表的第一个节点称为头节点,最后一个节点称为尾节点,尾节点的指针通常指向空值(null)。
31 1
|
23天前
|
存储 C++
数据结构第六弹---带头双向循环链表
数据结构第六弹---带头双向循环链表
|
1月前
|
存储
【单链表】数据结构单链表的实现
【单链表】数据结构单链表的实现
|
1月前
|
C++
从0开始回顾数据结构---链表与堆
#include <iostream> #include <algorithm> #include <string.h> using namespace std; const int N = 100010; int h[N], ph[N], hp[N], cnt; void heap_swap(int a, int b) { swap(ph[hp[a]],ph[hp[b]]); swap(hp[a], hp[b]); swap(h[a], h[b]); } void down(int u) { int t = u; if (u * 2 <= cnt &&
|
1月前
|
存储
【数据结构】双向带头循环链表的实现
【数据结构】双向带头循环链表的实现
|
1月前
【数据结构】单链表之--无头单向非循环链表
【数据结构】单链表之--无头单向非循环链表
|
1月前
|
存储 缓存 算法
数据结构从入门到精通——链表
链表是一种常见的数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。链表的一个显著特点是,它不需要在内存中连续存储,因此可以高效地插入和删除节点。这种灵活性使得链表在许多应用中成为理想的选择,尤其是在需要动态调整数据结构大小的场景中。
72 0
|
1月前
|
存储
数据结构——lesson4带头双向循环链表实现
数据结构——lesson4带头双向循环链表实现
|
1月前
数据结构——链表OJ题
数据结构——链表OJ题
|
1月前
|
算法
【数据结构与算法】题解 | #反转链表#
【数据结构与算法】题解 | #反转链表#

热门文章

最新文章