數據結構-雙向鏈表4

測試框架

#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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章