秒懂双链表2

简介: 秒懂双链表2

尾插

ListNode* BuyListNode(LTDataType x)
{
  ListNode* newnode = (ListNode*)malloc(sizeof(ListNode));
  if (newnode == NULL)
  {
  return;
  }
  newnode->data = x;
  newnode->next = NULL;
  newnode->prev = NULL;
  return newnode;
}
void ListPushBack(ListNode* phead, LTDataType x)
{
  ListNode* tail = phead->prev;
  ListNode* newnode = BuyListNode(x);
  tail->next = newnode;
  newnode->prev = tail;
  newnode->next = phead;
  phead->prev = newnode;
}

e2.png


尾删


void ListPopBack(ListNode* phead)
{
  assert(phead);
  assert(phead->next != phead);
  ListNode* tail = phead->prev;
  ListNode* prev = tail->prev;
  prev->next = phead;
  phead->prev = prev;
  free(tail);
  tail = NULL;
}


e3.png

头插:


ListNode* BuyListNode(LTDataType x)
{
  ListNode* newnode = (ListNode*)malloc(sizeof(ListNode));
  if (newnode == NULL)
  {
  return;
  }
  newnode->data = x;
  newnode->next = NULL;
  newnode->prev = NULL;
  return newnode;
}
void ListPushFront(ListNode* phead, LTDataType x)
{
  assert(phead);
  ListNode* first = phead->next;
  ListNode* newnode = BuyListNode(x);
  phead->next = newnode;
  newnode->prev = phead;
  newnode->next = first;
  first->prev = newnode;
}



e4.png

头删:


void ListPopFront(ListNode* phead)
{
  assert(phead);
  assert(phead->next != phead);
  ListNode* first = phead->next;
  ListNode* second = first->next;
  phead->next = second;
  second->prev = phead;
  free(first);
  first = NULL;
}


a1.png

打印:


void ListPrint(ListNode* phead)
{
  ListNode* cur = phead->next;
  while (cur != phead)
  {
  printf("%d ", cur->data);
  cur = cur->next;
  }
  printf("\n");
}


a2.png

查找:


ListNode* ListFind(ListNode* phead, LTDataType x)
{
  assert(phead);
  ListNode* cur = phead->next;
  while (cur != phead)
  {
  if (cur->data == x)
  {
    return cur;
  }
  cur = cur->next;
  }
  return NULL;
}

cur指向第一个结点,当结点的数据域不等于x,就去看下一个结点,要是最后找到phead都没有找到,就说明没有.


在某个结点前插入一个结点:


void ListInsert(ListNode* pos, LTDataType x)
{
  assert(pos);
  ListNode* newnode = BuyListNode(x);
  ListNode* prev = pos->prev;
  prev->next = newnode;
  newnode->prev = prev;
  newnode->next = pos;
  pos->prev = newnode;
}


a3.png

删除某个结点:


void ListErase(ListNode* pos)
{
  assert(pos);
  ListNode* prev = pos->prev;
  ListNode* next = pos->next;
  prev->next = next;
  next->prev = prev;
  free(pos);
  pos = NULL;
}


a4.png

销毁链表:


void ListDestory(ListNode* phead)
{
  assert(phead);
  ListNode* cur = phead->next;
  while (cur != phead)
  {
  ListNode* next = cur->next;
  free(cur);
  cur = next;
  }
  free(phead);
  phead = NULL;
}

s1.png

相关文章
|
存储
【单链表】
【单链表】
61 0
|
19天前
|
存储
单链表专题(冲冲冲)(下)
单链表专题(冲冲冲)(下)
27 0
|
6月前
|
存储 编译器
单链表与双链表实现
单链表与双链表实现
|
5月前
|
存储
单链表的实现
单链表的实现
22 0
|
6月前
|
存储 缓存
详解单链表
详解单链表
66 0
详解单链表
|
存储
【链表】单链表的实现
【链表】单链表的实现
68 0
|
存储 编译器
【链表之单链表】
什么是链表 概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。 通俗地讲,就是一个结构体有两个成员,一个是存放数据的成员,一个是指针成员,通常的单链表是第一个节点的指针成员存着下一个节点的地址,下一个节点的指针成员又存下一个节点的地址,这样每个节点之间连接起来,就叫做链表。 本文主要讲的是链表中的一种重要的形式:单链表。
|
存储 API 索引
链表——双链表
双向链表也叫双向表,是链表的一种,它由多个结点组成,每个结点都由一个数据域和两个指针域组成,数据域用来存储数据,其中一个指针域用来指向其后继结点,另一个指针域用来指向前驱结点。链表的头结点的数据域不存储数据,指向前驱结点的指针域值为null,指向后继结点的指针域指向第一个真正存储数据的结点
150 0
链表——双链表
|
存储 API 索引
链表——单链表
单向链表是链表的一种,它由多个结点组成,每个结点都由一个数据域和一个指针域组成,数据域用来存储数据,指针域用来指向其后继结点。链表的头结点的数据域不存储数据,指针域指向第一个真正存储数据的结点。
90 0
链表——单链表