C初级_双向链表

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

猜你喜欢

转载自blog.csdn.net/weixin_41743247/article/details/89069149