数据结构——双链表

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


目录

定义

双向链表的构建

初始化双链表

获得双链表节点函数

双链表尾插建表

打印双链表

查找双链表节点

双链表删除节点

双链表插入节点

双链表销毁


定义

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

双向链表的构建

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);
 }


相关文章
|
5天前
|
存储 C语言
【数据结构】c语言链表的创建插入、删除、查询、元素翻倍
【数据结构】c语言链表的创建插入、删除、查询、元素翻倍
【数据结构】c语言链表的创建插入、删除、查询、元素翻倍
|
1月前
【数据结构OJ题】环形链表
力扣题目——环形链表
26 3
【数据结构OJ题】环形链表
|
11天前
【数据结构】双向带头(哨兵位)循环链表 —详细讲解(赋源码)
【数据结构】双向带头(哨兵位)循环链表 —详细讲解(赋源码)
21 4
|
1月前
【数据结构OJ题】复制带随机指针的链表
力扣题目——复制带随机指针的链表
37 1
【数据结构OJ题】复制带随机指针的链表
|
1月前
【数据结构OJ题】环形链表II
力扣题目——环形链表II
14 1
【数据结构OJ题】环形链表II
|
1月前
【数据结构OJ题】相交链表
力扣题目——相交链表
18 1
【数据结构OJ题】相交链表
|
1月前
【数据结构OJ题】合并两个有序链表
力扣题目——合并两个有序链表
31 8
【数据结构OJ题】合并两个有序链表
|
1月前
【数据结构OJ题】链表中倒数第k个结点
牛客题目——链表中倒数第k个结点
24 1
【数据结构OJ题】链表中倒数第k个结点
|
1天前
|
存储 算法
【初阶数据结构篇】顺序表和链表算法题
此题可以先找到中间节点,然后把后半部分逆置,最近前后两部分一一比对,如果节点的值全部相同,则即为回文。
|
1天前
|
存储 测试技术
【初阶数据结构篇】双向链表的实现(赋源码)
因为头结点的存在,plist指针始终指向头结点,不会改变。