測試框架
#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;
}