天天看點

資料結構:線性表的鍊式存儲

筆者在上一篇整理了線性表的順序存儲的代碼資料結構:線性表的順序存儲 ,本文講解線性表的鍊式存儲,編譯環境還是vs2012,大家可以直接複制過去使用。

1  main.cpp

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

typedef struct Teacher
{
	LinkListNode* node;
	int age;
	char name[64];
}Teacher;

void main()
{
	int len = 0;
	int ret = 0 ;
	int i = 0;
	LinkList* list = NULL;
	
	Teacher t1,t2,t3,t4,t5;
	t1.age = 31;
	t2.age = 32;
	t3.age = 33;
	t4.age = 34;
	t5.age = 35;
	t1.name[64] = NULL;
	t2.name[64] = NULL;
	t3.name[64] = NULL;
	t4.name[64] = NULL;
	t5.name[64] = NULL;
	list = LinkList_Create();
	if (list == NULL)
	{
		return ;
	}
	
	len =  LinkList_Length(list);

	ret =  LinkList_Insert( list,(LinkListNode*) &t1, 0);
	ret =  LinkList_Insert( list,(LinkListNode*) &t2, 0);
	ret =  LinkList_Insert( list,(LinkListNode*) &t3, 0);
	ret =  LinkList_Insert( list,(LinkListNode*) &t4, 0);
	ret =  LinkList_Insert( list,(LinkListNode*) &t5, 0);
	
	//周遊
	for (i = 0;i<LinkList_Length(list);i++)
	{
		Teacher * tmp = (Teacher * )LinkList_Get(list,i);
		if (tmp == NULL)
		{
			return ;
		}
		printf ("tmp->age:%d  ",tmp->age);
	}
	printf("\n");

	//删除連結清單

	while (LinkList_Length(list) >0)
	{
		Teacher *tmp = (Teacher*)LinkList_Delete(list,0);
		if (tmp == NULL)
		{
			return ;
		}
		printf ("删除連結清單tmp->age:%d  ",tmp->age);
	}

	LinkList_Destroy(list);
	
	printf("hello... \n");
	system("pause");
	return ;
}
           

2  linklist.h  頭檔案

#ifndef _MYLINKLIST_H_
#define  _MYLINKLIST_H_

typedef void LinkList ;

typedef struct _tag_LinkListNode
{
	struct _tag_LinkListNode* next;
}LinkListNode;

LinkList* LinkList_Create();

void LinkList_Destroy(LinkList* list);

void LinkList_Clear(LinkList* list);

int LinkList_Length(LinkList* list);

int LinkList_Insert(LinkList* list,LinkListNode* node,int pos);

LinkListNode* LinkList_Get(LinkList* list,int pos);

LinkListNode* LinkList_Delete(LinkList* list,int pos);



#endif
           

3  linklist.cpp  頭檔案中函數的使用

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

#include "linklist.h"

typedef struct _tag_LinkList
{
	LinkListNode header;
	int length;
}TLinkList;


LinkList* LinkList_Create()
{
	TLinkList *ret = NULL;
	ret = (TLinkList*)malloc(sizeof(TLinkList));
	memset(ret, 0 , sizeof(TLinkList));
	ret->length = 0;
	ret->header.next = NULL;
	return ret;
}

void LinkList_Destroy(LinkList* list)
{
	if (list != 0)
	{
		free(list);
		list =NULL;
	}
	return ;
}


void LinkList_Clear(LinkList* list)
{
	TLinkList *tlist = NULL;
	if(list == NULL)
	{
		return;
	}
	tlist = (TLinkList* )list;
	tlist->length = 0;
	tlist->header.next = NULL;

	return ;
}


int LinkList_Length(LinkList* list)
{
	TLinkList *tlist = NULL;
	if(list == NULL)
	{
		return 0;
	}
	tlist = (TLinkList* )list;
	return tlist->length;
}


int LinkList_Insert(LinkList* list,LinkListNode* node,int pos)
{
	int ret=0;
	int i=0;

	TLinkList* tlist = NULL;
	LinkListNode* current=NULL;
	
	if (list == NULL || node==NULL || pos<0)
	{
		ret = 0;
		printf("func LinkList_Insert err: % d \n",ret);
		return ret;
	}
	tlist = (TLinkList*)list;
	current=&(tlist->header);

	for (i=0;i<pos && (current->next !=NULL);i++)
	{
		current = current->next;
	}
	//核心第一步
	node->next = current->next;

	//核心第二步
	current->next = node;

	tlist->length++;
	return 0;
}


LinkListNode* LinkList_Get(LinkList* list,int pos)
{
	int ret=0;
	int i=0;

	TLinkList* tlist = NULL;
	LinkListNode* current=NULL;
	
	if (list == NULL  || pos<0)
	{
		ret = 0;
		printf("func LinkList_Get err: % d \n",ret);
		return NULL;
	}
	tlist = (TLinkList*)list;
	current=&(tlist->header);

	for (i=0;i<pos && (current->next !=NULL);i++)
	{
		current = current->next;
	}
	return current->next;
}


LinkListNode* LinkList_Delete(LinkList* list,int pos)
{
	int i=0;

	TLinkList* tlist = NULL;
	LinkListNode* current=NULL;
	LinkListNode* ret=NULL;
	
	if (list == NULL  || pos<0)
	{
		
		printf("func LinkList_Delete err \n");
		return NULL;
	}
	tlist = (TLinkList*)list;
	current=&(tlist->header);

	for (i=0;i<pos && (current->next !=NULL);i++)
	{
		current = current->next;
	}
	 
	ret = current->next;
	current->next=ret->next;
	tlist->length--;
	return ret;
}




           

參考文獻:

            傳智播客 免費公開課