欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C初级_双向链表

程序员文章站 2024-03-06 21:08:08
...

1.双向链表

(单链表-每个节点保留下一个节点的位置,最后一个节点为NULL)
双链表-每个节点保留上一个和上一个节点的位置,因此双链表的任意位置均可访问到所有节点

2.说明

双链表的头head能找到下一个节点A,节点A不能访问头head
对于链表中指针指向问题的说明:
1.在定义结构体B时,在结构体内部定义了一个指向上一位置A的指针;也定义了指向下一位置的指针C
(在代码中,一般将head->next=C;head=B;head->pre=A)
2.在进行插入操作时,有结构体指针p,该结构体指针内部也同样定义了上一位置指针A1,下一位置指针B1
3.要基于1 2 两点的认识进行插入 删除操作的理解

3.代码实例

#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
 int data;
 struct node* pre;//上一个节点
 struct node* next;//下一个节点
}NODE;
//插入一个新节点
void insertData(NODE*head, int data)
{
 NODE*p = (NODE*)malloc(sizeof(NODE));
 p->data = data; 
#if 0//头插方式插入一个数据
 p->pre = head;
 p->next = head->next;
 p->pre->next = p;
 p->next->pre = p;
#else//尾插方式插入一个数据
 p->next = head;
 p->pre = head->pre;
 p->next->pre = p;
 p->pre -> next = p; 
#endif
}
//打印函数
void print(NODE* head)
{
 NODE*p = head->next;//从第二个节点开始
 while (p!=head)
 {
  printf("%d->", p->data);
  p = p->next;
 }
 printf("NULL\n");
}
//删除一个数据
void deleData(NODE* head,int data)
{
 NODE*p =head->next;
 while(p != head)
 {
  if (p->data == data)
  {
   p->pre->next = p->next;
   p->next->pre = p->pre;
   free(p);
   return;
  }
  p = p->next;
 }
}
//删除全部数据
void deleAll(NODE* head)
{
 NODE*p, *q;
 p = head->next;//从第二个数据开始删除
 while (p != head)
 {
  q = p;
  p = p->next;
  free(q);
 }
 free(head);
}
int main()
{
 //初始化一个双向链
 NODE *head = (NODE*)malloc(sizeof(NODE));
 head->pre = head;
 head->next = head;
 int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
 printf("以下输出用于展示双向链表的数据插入情况:\n");
 for (int i = 0; i < 10; ++i)
 {
  insertData(head, arr[i]);
 }
 print(head);
 printf("\n\n以下函数用于说明删除数字4之后的链表情况:\n");
 deleData(head, 4);
 print(head);
 getchar();
 return 0;
}
相关标签: 双向链