【複習】手寫數據結構之企業鏈表

企業鏈表思路:企業鏈表 爲 單向鏈表的改進,主要通過在數據結構頂端定義結點 每個結點相連 ,這樣就可以把數據“串”起來;

代碼如下,易錯主要在結構體類型轉換成結點類型這裏; 還有自定義的函數指針;

#include "stdio.h"
#include "stdlib.h"

typedef struct LINKNODE
{
	 struct LINKNODE* next;
}LinkNode;



typedef struct LINKLIST
{
	LinkNode* head;
	int size;
}LinkList;


struct student
{
	LinkNode* node;
	char name[64];
	int age;
	int score;
};

typedef void(*PRINTNODE)(LinkNode*);

////初始化鏈表;
LinkList*  init_list(LinkList* list)
{
	list = (LinkList*) malloc(sizeof(LinkList));
	list->size = 0;
	//list->head->next = NULL;  //head 現在還沒有地址,next 會出錯 ;
	return list;
}

void insert_list(LinkList* list, int pos, LinkNode* data)
{	
	
	LinkNode * finalNode = list->head;
	if (list == NULL)
		return;
	if (data == NULL)
		return;
	if (pos<0 || pos > list->size)
		return;

	if (pos == 0)
	{
		list->head = data;
		list->head->next = NULL;
		list->size++;
	}
	else
	{
		finalNode = list->head;

		for (int i = 1; i < pos; i++)
		{
			finalNode = finalNode->next;
			if (finalNode == NULL)
				return;
		}
		//現在 final在 pos的前一個位置;
		finalNode->next = data;
		finalNode->next->next = NULL;
		list->size++;
	} 
}


//指定位置刪除數據;
void remove_list(LinkList* list, int pos)
{


	if (pos == 0)
	{
		LinkNode* node = list->head;
		list->head = list->head->next;
		free(node);
		node = NULL;
		list->size--;
	}
	else
	{
		LinkNode* tempNode = list->head;
		for (int i = 1; i < pos; i++)
		{
			tempNode = tempNode->next;
			if (tempNode == NULL)
				return;
		}
		//現在tempNOde指向pos前一個位置;


			tempNode->next = NULL;
			list->size--;

			//ListNode 是 struct student開啓的 這裏不用釋放了;
	}
}


void print_list(LinkList* list, PRINTNODE print)
{
	LinkNode* tempNode = list->head; 
	if (list == NULL)
		return;

	while (tempNode != NULL)
	{
		//printf("11111111111\n");
		//printf("%d ", *(int*)tempNode->data); //先轉換爲int指針 在用* 提取地址裏的值;
		print(tempNode);

		tempNode = tempNode->next;
	}

	printf("總共有%d人\n", list->size);

}

void myPrint(LinkNode* node)
{
	struct student* st = (struct student*)node;

	printf("我叫%s,今年%d歲了,考了%2d分\n", st->name, st->age, st->score);

}

void destory_list(LinkList* list)
{
	if (list != NULL)
	{
		free(list);
		list = NULL;
	}
}

int main()
{
	LinkList* list = NULL;
	list = init_list(list); //初始化鏈表;

	struct student student1 = { NULL,"zhang3", 23, 100 };
	struct student student2 = { NULL, "lisi", 21, 90 };
	struct student student3 = { NULL, "wangwu", 43, 50 };
	struct student student4 = { NULL, "111", 43, 50 };

	printf("--------------------測試指定位置插入數據----------------------\n");
	insert_list(list, 0, (LinkNode*)&student1);
	insert_list(list, 1, (LinkNode*)&student2);
	insert_list(list, 2, (LinkNode*)&student3);
	insert_list(list, 3, (LinkNode*)&student4);

	print_list(list,myPrint );

	printf("--------------------測試指定位置刪除數據----------------------\n");

	remove_list(list, 3);
	print_list(list, myPrint);

	destory_list(list); //釋放鏈表;

	system("pause");
	return 0 ;
}

運行截圖; 

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