數據結構——線性表 鏈式存儲(2)

點擊打開鏈接此處是線性表的順序存儲 代碼案例,但是順序存儲插入和刪除操作需要移動大量元素,當線性表長度較大時難以確定。故選擇用鏈式存儲,代碼測試如下所示:

測試框架:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"linklist.h"
using namespace std;

struct Teacher
{
	LinkListNode node;
	int age;
	char name[64];
};
void main()
{
	int i = 0, len = 0;
	Linklist* 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,(LinkListNode*)&t1,0);
	List_Inster(list, (LinkListNode*)&t2, 0);
	List_Inster(list, (LinkListNode*)&t3, 0);
	List_Inster(list, (LinkListNode*)&t4, 0);
	List_Inster(list, (LinkListNode*)&t5, 0);
	//遍歷
	for ( i = 0; i < List_Length(list); i++)
	{
		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);

	}
	//刪除鏈表
	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 Linklist;
typedef struct LinkListNode
{
	struct LinkListNode* next;
};
/*創建列表*/
Linklist * List_Create();
/*釋放列表*/
void List_Destory(Linklist* list);
/*清空列表 回到初始狀態*/
void List_Clear(Linklist* list);
/*獲取鏈表的長度*/
int List_Length(Linklist* list);
/*獲取指定位置的鏈表的元素數據*/
LinkListNode* List_Get(Linklist* list, int pos);
/*插入元素數據*/
int List_Inster(Linklist* list, LinkListNode* node, int pos);
/*元素數據刪除*/
LinkListNode* List_Delete(Linklist* list, int pos);

頭文件的實現:

#include"linklist.h"
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct TLinkList
{
     LinkListNode header;
	int lenght;
};
/*創建列表*/
Linklist * List_Create()
{
	TLinkList* ret = NULL;
	ret = (TLinkList*)malloc(sizeof(TLinkList));
	memset(ret,0,sizeof(TLinkList));
	ret->lenght = 0;
	ret->header.next = NULL;
	return ret;
}
/*釋放列表*/
void List_Destory(Linklist* list)
{
	if (list==NULL)
	{
		free(list);
		list = NULL;
	}
	return ;
}
/*清空列表 回到初始狀態*/
void List_Clear(Linklist* list)
{
	TLinkList *tlist = NULL;
	if (list==NULL)
	{
		return;
	}
	tlist = (TLinkList*)list;
	tlist->lenght = 0;
	tlist->header.next = NULL;
	return ;
}
/*獲取鏈表的長度*/
int List_Length(Linklist* list)
{
	TLinkList* tlist = NULL;
	if (list == NULL)
	{
		return 0;
	}
	tlist = (TLinkList*)list;

	return tlist->lenght;
}
/*獲取指定位置的鏈表的元素數據*/
LinkListNode* List_Get(Linklist* list, int pos)
{
	int i = 0;
	if (list==NULL||pos<0)
	{
		return NULL;
	}
	LinkListNode* 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(Linklist* list, LinkListNode* node, int pos)
{
	if (list == NULL || pos<0||node==NULL)
	{
		return 0;
	}
	int i = 0, ret = 0;
	TLinkList* tlist = NULL;
	tlist = (TLinkList*)list;
	LinkListNode* current = NULL;
	current = &(tlist->header);
	for ( i = 0; i < pos&&(current->next!=NULL); i++)
	{
		current = current->next;
	}
	node->next = current->next;
	current->next = node;
	tlist->lenght++;
	return 0;
}
/*元素數據刪除*/
LinkListNode* List_Delete(Linklist* list, int pos)
{
	int i = 0;
	if (list == NULL || pos<0 )
	{
		return 0;
	}
	TLinkList* tlist = NULL;
	LinkListNode* current = NULL;
	tlist = (TLinkList*)list;
	current = &(tlist->header);
	LinkListNode* ret = NULL;
	for ( i = 0; i <pos&&(current->next!=NULL); i++)
	{
		current = current->next;
	}
	ret = current->next;
	current->next = ret->next;
	tlist->lenght--;
	return ret;
}

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