数据结构---双向循环链表
双向循环链表:
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;
}