双向链表c语言实现 doublelinklist.h 和 doublelinklist.c
来源:互联网 发布:tensorflow 路径规划 编辑:程序博客网 时间:2024/06/06 15:47
doublelinklist.h 文件
#ifndef _DOUBLE_LINK_LIST_H_#define _DOUBLE_LINK_LIST_H_#include <stdio.h>#include <stdlib.h>#include <string.h>//链表就是一个一个的表通过关系节点连接的//双向链表//链表操作精髓在于操作关系节点,引入辅助指针pcurrent,pnext.从表头开始遍历各关系节点。typedef void List;typedef void ListNode;#ifndef bool#define bool int#define true 1#define false 0#endif//定义双向链表的关系小节点typedef struct _tag_DoubleLinkListConnectedNode{ struct _tag_DoubleLinkListConnectedNode* next; struct _tag_DoubleLinkListConnectedNode* pre;}DoubleLinkListConnectedNode;typedef struct _tag_DoubleLinkList{ DoubleLinkListConnectedNode head; DoubleLinkListConnectedNode* slider; int length;}DoubleLinkList;List* DoubleLinkList_Create();bool DoubleLinkList_Destory(List* list );bool DoubleLinkList_Clear(List* list);int DoubleLinkList_GetLength(List* list);bool DoubleLinkList_InsertOneNode(List* list,ListNode* listnode,int pos);ListNode* DoubleLinkList_GetOneNode(List* list, int pos);ListNode* DoubleLinkList_DeleteOneNode(List* list ,int pos);bool DoubleLinkList_DeleteAllNode(List* list);ListNode* DoubleLinkList_DeleteOneNodeByNodePointer(List* list,ListNode* listnode);ListNode* DoubleLinkList_ResetSlider(List* list);ListNode* DoubleLinkList_GetCurrentSlider(List* list);ListNode* DoubleLinkList_SliderMoveToNext(List* list);#endif
doublelinklist.c 文件
#include <stdio.h>#include <stdlib.h>#include <string.h>#include "doublelinklist.h"//链表就是一个一个的表通过关系节点连接的//链表操作精髓在于操作关系节点,引入辅助指针pcurrent,pnext.从表头开始遍历各关系节点。List* DoubleLinkList_Create(){ List* ret = NULL; DoubleLinkList* temp_doublelinklist = NULL; temp_doublelinklist = (DoubleLinkList*)malloc(sizeof(DoubleLinkList)); if (temp_doublelinklist == NULL) { return NULL; } temp_doublelinklist->head.next = NULL; temp_doublelinklist->head.pre = NULL; temp_doublelinklist->slider = NULL; temp_doublelinklist->length = 0; ret = (List*)temp_doublelinklist; return ret;}bool DoubleLinkList_Destory(List* list ){ DoubleLinkList* temp_doublelinklist = NULL; if (list == NULL) { return false; } temp_doublelinklist = (DoubleLinkList*)list; free(temp_doublelinklist); temp_doublelinklist = NULL; return true;}bool DoubleLinkList_Clear(List* list){ DoubleLinkList* temp_doublelinklist = NULL; if (list == NULL) { return false; } temp_doublelinklist = (DoubleLinkList*)list; temp_doublelinklist->head.next = NULL; temp_doublelinklist->head.pre = NULL; temp_doublelinklist->slider = NULL; temp_doublelinklist->length = 0; return true;}int DoubleLinkList_GetLength(List* list){ int ret = 0; DoubleLinkList* temp_doublelinklist = NULL; if (list == NULL) { return -1; } temp_doublelinklist = (DoubleLinkList*)list; ret = temp_doublelinklist->length; return ret;}bool DoubleLinkList_InsertOneNode(List* list,ListNode* listnode,int pos){ DoubleLinkList* temp_doublelinklist = NULL; DoubleLinkListConnectedNode* temp_doublelinklistconnectednode_insert = NULL; DoubleLinkListConnectedNode* pcurrent = NULL; //辅助指针 DoubleLinkListConnectedNode* pnext = NULL; //辅助指针的下一节点 int i = 0; if (list == NULL || listnode == NULL || pos < 0) { return false; } temp_doublelinklist = (DoubleLinkList*)list; temp_doublelinklistconnectednode_insert = (DoubleLinkListConnectedNode*)listnode; //辅助指针指向链表头部即首地址 pcurrent = (DoubleLinkListConnectedNode*)temp_doublelinklist; //辅助指针跳到pos-1处 for (i = 0; (i < pos && pcurrent->next != NULL); i++) { pcurrent = pcurrent->next; } //pcurrent 为要 插入节点 的前一节点,pnext为要 插入节点 的后一节点 //pcurrent pnext 三者的顺序关系 listnode插入前 //pcurrent listnode pnext listnode插入后 //得到pnext pnext = pcurrent->next; //开始插入新节点 //正向连 pcurrent->next = temp_doublelinklistconnectednode_insert; temp_doublelinklistconnectednode_insert->next = pnext; //反向连时 判断pnext是否为空,就是表头后面插入第一个节点时要处理 if (pnext != NULL) { pnext->pre = temp_doublelinklistconnectednode_insert; } temp_doublelinklistconnectednode_insert->pre = pcurrent; //第一次插入时,游标指向第一个插入的节点 if (temp_doublelinklist->length == 0) { temp_doublelinklist->slider = temp_doublelinklistconnectednode_insert; } //第一次插入的节点即0号位置的节点pre为null,插入的节点指向null if (pcurrent == (DoubleLinkListConnectedNode*)temp_doublelinklist) { temp_doublelinklistconnectednode_insert->pre = NULL; } temp_doublelinklist->length++; return true;}ListNode* DoubleLinkList_GetOneNode(List* list, int pos){ ListNode* ret = NULL; DoubleLinkList* temp_doublelinklist = NULL; DoubleLinkListConnectedNode* temp_doublelinklistconnectednode = NULL; DoubleLinkListConnectedNode* pcurrent = NULL; //辅助指针 int i = 0; if (list == NULL || pos < 0) { return NULL; } temp_doublelinklist = (DoubleLinkList*)list; if (temp_doublelinklist->length <= 0 || pos >= temp_doublelinklist->length) { return NULL; } //辅助指针指向链表头部即首地址 pcurrent = (DoubleLinkListConnectedNode*)temp_doublelinklist; //辅助指针跳到pos-1处 for (i = 0; (i < pos && pcurrent->next != NULL); i++) { pcurrent = pcurrent->next; } temp_doublelinklistconnectednode = pcurrent->next; ret = (ListNode*)temp_doublelinklistconnectednode; return ret;}ListNode* DoubleLinkList_DeleteOneNode(List* list ,int pos){ ListNode* ret = NULL; DoubleLinkList* temp_doublelinklist = NULL; DoubleLinkListConnectedNode* temp_doublelinklistconnectednode_delete = NULL; DoubleLinkListConnectedNode* pcurrent = NULL; //辅助指针 DoubleLinkListConnectedNode* pnext = NULL; //辅助指针的下一节点 int i = 0; if (list == NULL || pos < 0) { return false; } temp_doublelinklist = (DoubleLinkList*)list; if (temp_doublelinklist->length <= 0 || pos >= temp_doublelinklist->length) { return NULL; } //辅助指针指向链表头部即首地址 pcurrent = (DoubleLinkListConnectedNode*)temp_doublelinklist; //辅助指针跳到pos-1处 for (i = 0; (i < pos && pcurrent->next != NULL); i++) { pcurrent = pcurrent->next; } //得到pcurrent 和 pnext temp_doublelinklistconnectednode_delete = pcurrent->next; pnext = temp_doublelinklistconnectednode_delete->next; //连线连接 pcurrent->next = pnext; //判断链表中是否只有一个业务节点 //如果只有一个pcurrent即头部直接指向空就处理完毕,上一句就可以搞定了 //pnext不为空,不止一个业务节点 if (pnext != NULL) { pnext->pre = pcurrent; //0号位置的节点删除后,补上来的节点特殊处理 if (pcurrent == (DoubleLinkListConnectedNode*)temp_doublelinklist) { pnext->pre = NULL; } } //删除游标指向的节点,游标指向下一个节点 if (temp_doublelinklist->slider == temp_doublelinklistconnectednode_delete) { temp_doublelinklist->slider = pnext; } temp_doublelinklist->length--; ret = (ListNode*)temp_doublelinklistconnectednode_delete; return ret;}bool DoubleLinkList_DeleteAllNode(List* list){ DoubleLinkList* temp_doublelinklist = NULL; if (list == NULL) { return false; } temp_doublelinklist = (DoubleLinkList*)list; while(temp_doublelinklist->length > 0) { DoubleLinkList_DeleteOneNode((List*)temp_doublelinklist,0); } return true;}ListNode* DoubleLinkList_DeleteOneNodeByNodePointer(List* list,ListNode* listnode){ DoubleLinkList* temp_doublelinklist = NULL; DoubleLinkListConnectedNode* temp_doublelinklistconnected_delete = NULL; DoubleLinkListConnectedNode* pcurrent = NULL; DoubleLinkListConnectedNode* temp_doublelinklistconnectednode_ret = NULL; ListNode* ret = NULL; int i = 0; if (list == NULL || listnode == NULL) { return NULL; } temp_doublelinklist = (DoubleLinkList*)list; temp_doublelinklistconnected_delete = (DoubleLinkListConnectedNode*)listnode; if (temp_doublelinklist->length <= 0) { return NULL; } //得到辅助指针pos-1 pcurrent = (DoubleLinkListConnectedNode*)temp_doublelinklist; //找同地址节点时 for (i = 0; i < temp_doublelinklist->length; i ++ ) { //链表头不存业务节点,此处就可以先指向0位置的业务节点后再判断 pcurrent = pcurrent->next; if (pcurrent == temp_doublelinklistconnected_delete) { temp_doublelinklistconnectednode_ret = temp_doublelinklistconnected_delete; break; } } if (temp_doublelinklistconnectednode_ret == NULL) { return NULL; } DoubleLinkList_DeleteOneNode((List*)temp_doublelinklist,i); ret = (ListNode*)temp_doublelinklistconnectednode_ret; return ret;}//重置游标ListNode* DoubleLinkList_ResetSlider(List* list){ DoubleLinkList* temp_doublelinklist = NULL; DoubleLinkListConnectedNode* temp_doublelinklistconnected_node = NULL; ListNode* ret = NULL; if (list == NULL) { return NULL; } temp_doublelinklist = (DoubleLinkList*)list; temp_doublelinklist->slider = temp_doublelinklist->head.next; temp_doublelinklistconnected_node = temp_doublelinklist->slider; ret = (ListNode* )temp_doublelinklistconnected_node; return ret;}//返回当前游标,ListNode* DoubleLinkList_GetCurrentSlider(List* list){ DoubleLinkList* temp_doublelinklist = NULL; DoubleLinkListConnectedNode* temp_doublelinklistconnected_node = NULL; ListNode* ret = NULL; if (list == NULL) { return NULL; } temp_doublelinklist = (DoubleLinkList*)list; temp_doublelinklistconnected_node = temp_doublelinklist->slider; ret = (ListNode*)temp_doublelinklistconnected_node; return ret;}//游标下移,并返回游标下移之前的节点ListNode* DoubleLinkList_SliderMoveToNext(List* list){ DoubleLinkList* temp_doublelinklist = NULL; DoubleLinkListConnectedNode* temp_doublelinklistconnected_node = NULL; ListNode* ret = NULL; if (list == NULL) { return NULL; } temp_doublelinklist = (DoubleLinkList*)list; temp_doublelinklistconnected_node = temp_doublelinklist->slider; temp_doublelinklist->slider = temp_doublelinklistconnected_node->next; ret = (ListNode*)temp_doublelinklistconnected_node; return ret;}/**************************以下是测试代码*************************//*typedef struct _tag_Teacher{ DoubleLinkListConnectedNode node; int age ; char name[];}Teacher;void main(){ List* list = NULL; Teacher t1,t2,t3,t4,t5; int kk = 0; Teacher* teacher = NULL; t1.age = 21;t2.age = 22;t3.age = 23;t4.age = 24;t5.age = 25; list = DoubleLinkList_Create(); if (list == NULL) { printf("创建list失败"); } //尾插法 DoubleLinkList_InsertOneNode(list,(ListNode*)&t1,DoubleLinkList_GetLength(list)); DoubleLinkList_InsertOneNode(list,(ListNode*)&t2,DoubleLinkList_GetLength(list)); DoubleLinkList_InsertOneNode(list,(ListNode*)&t3,DoubleLinkList_GetLength(list)); DoubleLinkList_InsertOneNode(list,(ListNode*)&t4,DoubleLinkList_GetLength(list)); DoubleLinkList_InsertOneNode(list,(ListNode*)&t5,DoubleLinkList_GetLength(list)); // for (kk = 0; kk < DoubleLinkList_GetLength(list); kk ++) { teacher = (Teacher* )DoubleLinkList_GetOneNode(list,kk); printf("老师%d的年龄是%d",kk,teacher->age); printf("\n"); } printf("链表长度%d \n",DoubleLinkList_GetLength(list)); DoubleLinkList_DeleteOneNodeByNodePointer(list,(ListNode*)&t5); //DoubleLinkList_DeleteOneNode(list,0); printf("链表长度%d \n",DoubleLinkList_GetLength(list)); for (kk = 0; kk < DoubleLinkList_GetLength(list); kk ++) { teacher = (Teacher* )DoubleLinkList_GetOneNode(list,kk); printf("老师%d的年龄是%d",kk,teacher->age); printf("\n"); } printf("链表长度%d \n",DoubleLinkList_GetLength(list)); DoubleLinkList_DeleteAllNode(list); printf("链表长度%d \n",DoubleLinkList_GetLength(list)); DoubleLinkList_Destory(list); system("pause");}*/
可能会调用其它头文件或源文件,如果调用,请翻看我的其它博客,对其头文件或源文件的实现。
good luck !
阅读全文
0 0
- 双向链表c语言实现 doublelinklist.h 和 doublelinklist.c
- 双向链表代码实现-C语言
- 双向链表C语言实现
- C语言实现双向链表[上]
- C语言实现双向链表
- c语言双向链表的实现
- C语言实现双向循环链表
- C语言实现双向链表
- 双向链表的C语言实现
- C语言实现双向循环链表
- 【C语言】双向链表的实现
- C语言实现双向循环链表
- C语言实现双向循环链表
- C语言实现双向链表
- c语言:双向链表的实现
- C语言双向循环链表实现
- C语言实现双向循环链表
- c语言实现增删双向链表
- switch语句解决ATN取款机问题
- 南阳OJ 852题 蛇形填数(二)
- Codeforces Gym 101158 E. Infallibly Crack Perplexing Cryptarithm (模拟 + 语法分析)
- 《深入理解java虚拟机》学习笔记(1)——走进java
- Codeforces Gym 101158 A. Rearranging a Sequence
- 双向链表c语言实现 doublelinklist.h 和 doublelinklist.c
- c++ 析构函数调用时机
- 表单的使用(新手入门基础学习)
- Codeforces Gym 101158 B. Quality of Check Digits (模拟)
- python中的二维列表(实例)
- 【codeforces 749A】Bachgold Problem
- 单片机实验六
- C++动态规划之采药(openjudge)
- Codeforces Gym 101158 C. Distribution Center