双向循环链表:
1双向对应有一个指向前一个节点的prev和一个指向和一个节点的node,和一个数据域data,
2循环就是连起来跟一个园一样,就是最后一个节点指向头节点,头节点的前一个prev指向尾节点

代码实战
1创建结构体,基本程序框架
//头文件
#include<stdio.h>
#include<stdlib.h>
//宏
#define DataType int
//全局变量
//结构体
typedef struct node
{
DataType data;
struct node* prev;
struct node* next;
}node,*Node;
//函数
int main()
{
return 0;
}
2实现链表初始化函数,增加函数,打印/遍历函数
初始化函数
Node Init(Node phead) {
phead = malloc(sizeof(node));
if (phead == NULL)
{
printf("malloc file\n");
return -1;
}
phead->next = phead;
phead->prev= phead;
return phead;
}
尾插函数
int add(Node phead, int num)
{
//创建节点
Node newnode = NULL;
newnode = malloc(sizeof(node));
newnode->data = num;
newnode->next = NULL;
newnode->prev = NULL;
//找到尾
Node cur = NULL;
for (cur = phead; cur->next != phead; cur = cur->next);
cur->next = newnode;
newnode->prev = cur;
phead->prev = newnode;
newnode->next = phead;
return 0;
}
遍历函数
int show(Node phead)
{
if (phead == NULL)
{
printf("NULL\n");
return 0;
}
Node cur = NULL;
for (cur = phead->next; cur != phead; cur = cur->next)
{
printf("%d->", cur->data);
}
printf("NULL\n");
return 0;
}
效果演示
int main()
{
Node phead = NULL;
phead = Init(phead);
add(phead, 1);
add(phead, 2);
add(phead, 3);
add(phead, 4);
show(phead);
return 0;
}
3修改与删除
修改函数
int change(Node phead, int num1, int num2)
{
if (phead == NULL)
{
printf("phead is null\n");
return -1;
}
Node cur = NULL;
for (cur = phead->next; cur != phead; cur = cur->next)
{
if (cur->data == num1)
{
cur->data = num2;
return 0;
}
}
printf("no find %d\n", num1);
return 0;
}
删除函数
void delete(Node phead, int num)
{
if (phead == NULL)
{
printf("phead is NULL\n");
return 0;
}
Node cur1 = NULL;
Node cur2 = NULL;
for (cur1 = phead, cur2 = phead->next; cur2 != phead; cur1 = cur2, cur2 = cur2->next)
{
if (cur2->data == num)
{
cur1->next = cur2->next;
cur2->next->prev = cur1;
free(cur2);
return 0;
}
}
printf("no find num\n");
}
效果
int main()
{
Node phead = NULL;
phead = Init(phead);
add(phead, 1);
add(phead, 2);
add(phead, 3);
add(phead, 4);
show(phead);
delete(phead, 1);
delete (phead, 2);
change(phead, 3, 5);
show(phead);
change(phead, 6, 5);
delete(phead, 3);
delete (phead, 4);
show(phead);
return 0;
}
最终代码
//头文件
#include<stdio.h>
#include<stdlib.h>
//宏
#define DataType int
//全局变量
//结构体
typedef struct node
{
DataType data;
struct node* prev;
struct node* next;
}node,*Node;
//函数
Node Init(Node phead) {
phead = malloc(sizeof(node));
if (phead == NULL)
{
printf("malloc file\n");
return -1;
}
phead->next = phead;
phead->prev= phead;
return phead;
}
int add(Node phead, int num)
{
//创建节点
Node newnode = NULL;
newnode = malloc(sizeof(node));
newnode->data = num;
newnode->next = NULL;
newnode->prev = NULL;
//找到尾
Node cur = NULL;
for (cur = phead; cur->next != phead; cur = cur->next);
cur->next = newnode;
newnode->prev = cur;
phead->prev = newnode;
newnode->next = phead;
return 0;
}
int show(Node phead)
{
if (phead == NULL)
{
printf("NULL\n");
return 0;
}
Node cur = NULL;
for (cur = phead->next; cur != phead; cur = cur->next)
{
printf("%d->", cur->data);
}
printf("NULL\n");
return 0;
}
int change(Node phead, int num1, int num2)
{
if (phead == NULL)
{
printf("phead is null\n");
return -1;
}
Node cur = NULL;
for (cur = phead->next; cur != phead; cur = cur->next)
{
if (cur->data == num1)
{
cur->data = num2;
return 0;
}
}
printf("no find %d\n", num1);
return 0;
}
void delete(Node phead, int num)
{
if (phead == NULL)
{
printf("phead is NULL\n");
return 0;
}
Node cur1 = NULL;
Node cur2 = NULL;
for (cur1 = phead, cur2 = phead->next; cur2 != phead; cur1 = cur2, cur2 = cur2->next)
{
if (cur2->data == num)
{
cur1->next = cur2->next;
cur2->next->prev = cur1;
free(cur2);
return 0;
}
}
printf("no find num\n");
}
int main()
{
Node phead = NULL;
phead = Init(phead);
add(phead, 1);
add(phead, 2);
add(phead, 3);
add(phead, 4);
show(phead);
delete(phead, 1);
delete (phead, 2);
change(phead, 3, 5);
show(phead);
change(phead, 6, 5);
delete(phead, 3);
delete (phead, 4);
show(phead);
return 0;
}

9884

被折叠的 条评论
为什么被折叠?



