测试框架
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> #include"DlinkList.h" using namespace std; struct Teacher { DlinkListNode node; int age; char name[64]; }; void main() { int i = 0, len = 0; Dlinklist* list = NULL; list = List_Create(); if (list == NULL) { return; } Teacher t1, t2, t3, t4, t5; t1.age = 20; strcpy(t1.name, "wang1"); t2.age = 30; strcpy(t2.name, "wang2"); t3.age = 40; strcpy(t3.name, "wang3"); t4.age = 50; strcpy(t4.name, "wang4"); t5.age = 60; strcpy(t5.name, "wang5"); len = List_Length(list); List_Inster(list, (DlinkListNode*)&t1, List_Length(list));//尾插法 List_Inster(list, (DlinkListNode*)&t2, List_Length(list)); List_Inster(list, (DlinkListNode*)&t3, List_Length(list)); List_Inster(list, (DlinkListNode*)&t4, List_Length(list)); List_Inster(list, (DlinkListNode*)&t5, List_Length(list)); //遍历 for (i = 0; i < List_Length(list); i++)//证明是否是循环链表只要把长度乘以2,打印两次 { Teacher* tmp = (Teacher*)List_Get(list, i); if (tmp == NULL) { return; } printf("teacher->age :%d\n", tmp->age); printf("teacher->name :%s\n", tmp->name); } //List_Delete(list, 0);//删除节点0 for ( i = 0; i <List_Length(list); i++) { Teacher* t = (Teacher*)Dlink_Next(list); printf("teacher->age :%d\n", t->age); printf("teacher->name :%s\n", t->name); } Dlink_Reset(list); Dlink_Next(list); /*Teacher* t1 = (Teacher*)Dlink_Current(list); printf("%d\n",t1.age);*/ //删除链表 //while (List_Length(list)>0) //{ // Teacher* tmp = (Teacher*)List_Delete(list, 0); // if (tmp == NULL) // { // return; // } // printf("teacher->age :%d\n", tmp->age); //} List_Destory(list); system("pause"); }
头文件
#pragma once #ifdef _MYLIST_H_ #define _MYLIST_H_ #endif // _MYSEQLIST_H_ typedef void Dlinklist; typedef struct DlinkListNode { struct DlinkListNode* next; struct DlinkListNode* pre; }; /*创建列表*/ Dlinklist * List_Create(); /*释放列表*/ void List_Destory(Dlinklist* list); /*清空列表 回到初始状态*/ void List_Clear(Dlinklist* list); /*获取链表的长度*/ int List_Length(Dlinklist* list); /*获取指定位置的链表的元素数据*/ DlinkListNode* List_Get(Dlinklist* list, int pos); /*插入元素数据*/ int List_Inster(Dlinklist* list, DlinkListNode* node, int pos); /*元素数据删除*/ DlinkListNode* List_Delete(Dlinklist* list, int pos); //add DlinkListNode* Dlink_DeleteNode(Dlinklist* list, DlinkListNode* node); //重置游标,重新指向链表的头部 DlinkListNode* Dlink_Reset(Dlinklist* list); //获取当前游标 DlinkListNode* Dlink_Current(Dlinklist* list); //把当前的位置返回,并使游标指向下一个位置 DlinkListNode* Dlink_Next(Dlinklist* list); DlinkListNode* Dlink_Pre(Dlinklist* list);
头文件实现
#include"DlinkList.h" #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct TLinkList { DlinkListNode header; DlinkListNode* slider; int lenght; }; /*创建列表*/ Dlinklist * List_Create() { TLinkList* ret = NULL; ret = (TLinkList*)malloc(sizeof(TLinkList)); memset(ret, 0, sizeof(TLinkList)); ret->lenght = 0; ret->header.next = NULL; ret->slider = NULL; return ret; } /*释放列表*/ void List_Destory(Dlinklist* list) { if (list == NULL) { free(list); list = NULL; } return; } /*清空列表 回到初始状态*/ void List_Clear(Dlinklist* list) { TLinkList *tlist = NULL; if (list == NULL) { return; } tlist = (TLinkList*)list; tlist->lenght = 0; tlist->header.next = NULL; tlist->slider = NULL; return; } /*获取链表的长度*/ int List_Length(Dlinklist* list) { TLinkList* tlist = NULL; if (list == NULL) { return 0; } tlist = (TLinkList*)list; return tlist->lenght; } /*获取指定位置的链表的元素数据*/ DlinkListNode* List_Get(Dlinklist* list, int pos) { int i = 0; if (list == NULL || pos<0) { return NULL; } DlinkListNode* current = NULL; TLinkList* tlist = NULL; tlist = (TLinkList*)list; current = &(tlist->header); //让辅助指针指向链表的头部 for (i = 0; i < pos && (current->next != NULL); i++) { current = current->next; } return current->next; } /*插入元素数据*/ int List_Inster(Dlinklist* list, DlinkListNode* node, int pos) { if (list == NULL || pos<0 || node == NULL) { return 0; } int i = 0, ret = 0; TLinkList* tlist = NULL; tlist = (TLinkList*)list; DlinkListNode* current = NULL; current = &(tlist->header); DlinkListNode* next = NULL;//需要增加next指针 for (i = 0; i < pos && (current->next != NULL); i++) { current = current->next; } next = current->next; //1-2 current->next = node; node->next =next; //3-4 if (next!=NULL)//当链表插入第一个元素,需要特殊处理 { next->pre = node; } node->pre = current; if (tlist->lenght==0) { tlist->slider = node;//当链表插入第一个元素处理游标 } //若在0位置插入,需要特殊处理 新来结点next前pre指向null if (current==(DlinkListNode*)tlist) { node->pre = NULL; } tlist->lenght++; return 0; } /*元素数据删除*/ DlinkListNode* List_Delete(Dlinklist* list, int pos) { int i = 0; if (list == NULL || pos<0) { return 0; } TLinkList* tlist = NULL; DlinkListNode* current = NULL; tlist = (TLinkList*)list; current = &(tlist->header); DlinkListNode* next = NULL; DlinkListNode* ret = NULL; for (i = 0; i <pos && (current->next != NULL); i++) { current = current->next; } ret = current->next; next = ret->next; //步骤1 current->next = next; //步骤二 if (next != NULL)//特殊处理 { next->pre = current; if (current==(DlinkListNode*)tlist)//若是地0个位置 { next->pre = NULL; } } if (tlist->slider==ret) { tlist->slider = next; } next->pre = current; tlist->lenght--; return ret; } DlinkListNode* Dlink_DeleteNode(Dlinklist* list, DlinkListNode* node) { TLinkList* tlist = (TLinkList*)list; DlinkListNode* ret = NULL; int i = 0; if (tlist==NULL) { DlinkListNode* current = (DlinkListNode*)tlist; for ( i = 0; i < tlist->lenght; i++) { if (current->next==node) { ret = current->next; break; } current = current->next; } if (ret != NULL) { List_Delete(tlist,i); } } return ret; } DlinkListNode* Dlink_Reset(Dlinklist* list) { TLinkList* tlist = (TLinkList*)list; DlinkListNode* ret = NULL; if (tlist != NULL) { tlist->slider = tlist->header.next; ret = tlist->slider; } return ret; } DlinkListNode* Dlink_Current(Dlinklist* list) { TLinkList* tlist = (TLinkList*)list; DlinkListNode* ret = NULL; if (tlist != NULL) { ret = tlist->slider; } return ret; } DlinkListNode* Dlink_Next(Dlinklist* list) { TLinkList* tlist = (TLinkList*)list; DlinkListNode* ret = NULL; if ((tlist!=NULL)&&(tlist->slider!=NULL)) { ret = tlist->slider; tlist->slider = ret->next; } return ret; } DlinkListNode* Dlink_Pre(Dlinklist* list) { TLinkList* tlist = (TLinkList*)list; DlinkListNode* ret = NULL; if ((tlist != NULL) && (tlist->slider != NULL)) { ret = tlist->slider; tlist->slider = ret->pre; } return ret; }