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;
}
下一篇: ASP.NET Cache的一些总结分享