c語言——靜態鏈表和動態鏈表

c語言——靜態鏈表

鏈表結點類型定義
如何遍歷鏈表

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

//鏈表結點類型定義
struct LinkNode
{
	int data;
	struct LinkNode *next;
};


void test()
{
	
	struct LinkNode node1 = { 10, NULL };
	struct LinkNode node2 = { 20, NULL };
	struct LinkNode node3 = { 30, NULL };
	struct LinkNode node4 = { 40, NULL };
	struct LinkNode node5 = { 50, NULL };
	struct LinkNode node6 = { 60, NULL };

	node1.next = &node2;
	node2.next = &node3;
	node3.next = &node4;
	node4.next = &node5;
	node5.next = &node6;

	//如何遍歷鏈表?

	//先定義一個輔助指針變量
	struct LinkNode *pCurrent = &node1;
	while (pCurrent != NULL)
	{
		printf("%d ",pCurrent->data);

		//指針移動到下一個元素的首地址
		pCurrent = pCurrent->next;
	}

}

int main(){

	test();

	system("pause");
	return EXIT_SUCCESS;
}

運行

10 20 30 40 50 60

c語言——動態鏈表

頭文件 LinkList.h

#define _CRT_SECURE_NO_WARNINGS

#pragma once

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

#ifdef __cplusplus
extern "C"{
#endif


	//定義節點數據類型
	struct LinkNode
	{
		int data;
		struct LinkNode *next;
	};

	//初始化鏈表
	struct LinkNode *Init_LinkList();
	//在值爲oldval的位置插入新的數據newval
	void InsertByValue_LinkList(struct LinkNode *header,int oldval,int newval);
	//刪除值爲val的結點
	void RemoveByValue_LinkList(struct LinkNode *header,int delValue);
	//遍歷
	void Foreach_LinkList(struct LinkNode *header);
	//銷燬
	void Destroy_LinkList(struct LinkNode *header);
	//清空
	void Clear_LinkList(struct LinkNode *header);


#ifdef __cplusplus
}
#endif

主文件 LinkList.c

#include"LinkList.h"


//初始化鏈表
struct LinkNode *Init_LinkList()
{

	//創建頭結點
	struct LinkNode *header = malloc(sizeof(struct LinkNode));
	header->data = - 1;
	header->next = NULL;

	//尾部指針
	struct LinkNode *pRear = header;

	int val = -1;
	while (true)
	{

		printf("輸入插入的數據:\n");
		scanf("%d",&val);
		if (val == -1)
		{
			break;
		}

		//先創建新節點
		struct LinkNode *newnode = malloc(sizeof(struct LinkNode));
		newnode->data = val;
		newnode->next = NULL;

		//新節點插入到鏈表中
		pRear->next = newnode;

		//更新尾部指針指向
		pRear = newnode;


	}

	return header;
}

void InsertByValue_LinkList(struct LinkNode *header, int oldval, int newval)
{
	if (NULL == header)
	{
		return;
	}


	//兩個輔助指針變量
	struct LinkNode *pPrev = header;
	struct LinkNode *pCurrent = pPrev->next;

	while (pCurrent != NULL)
	{

		if (pCurrent->data == oldval)
		{
			break; 
		}

		pPrev = pCurrent;
		pCurrent = pCurrent->next;
	}

#if 0
	//如果pCurrent爲NULL  說明鏈表中不存在值爲oldval的結點
	if (pCurrent == NULL)
	{
		return;
	}
#endif


	//先創建新結點
	struct LinkNode *newnode = malloc(sizeof(struct LinkNode));
	newnode->data = newval;
	newnode->next = NULL;

	//新節點插入到鏈表中
	newnode->next = pCurrent;
	pPrev->next = newnode;



}
//刪除值爲val的結點
void RemoveByValue_LinkList(struct LinkNode *header, int delValue)
{

	if (NULL == header)
	{
		return;
	}

	//兩個輔助指針變量
	struct LinkNode *pPrev = header;
	struct LinkNode *pCurrent = pPrev->next;

	while (pCurrent != NULL)
	{

		if (pCurrent->data == delValue)
		{
			break;
		}

		//移動兩個輔助指針
		pPrev = pCurrent;
		pCurrent = pCurrent->next;
	}

	if (NULL == pCurrent)
	{
		return;
	}

	//重新建立待刪除節點的前驅和後繼結點關係
	pPrev->next = pCurrent->next;
	//釋放刪除節點內存
	free(pCurrent);
	pCurrent = NULL;

}
//遍歷
void Foreach_LinkList(struct LinkNode *header)
{
	if (NULL == header)
	{
		return;
	}

	//輔助指針變量
	struct LinkNode *pCurrent = header->next;

	while (pCurrent != NULL)
	{
		printf("%d ",pCurrent->data);
		pCurrent = pCurrent->next;
	}

}
//銷燬
void Destroy_LinkList(struct LinkNode *header)
{
	if (NULL == header)
	{
		return;
	}

	//輔助指針變量
	struct LinkNode *pCurrent = header;

	while (pCurrent != NULL)
	{
		//先保存下當前結點的下一個節點地址
		struct LinkNode *pNext = pCurrent->next;

		//釋放當前結點內存
		printf("%d節點被銷燬!\n", pCurrent->data);
		free(pCurrent);

		//指針向後移動
		pCurrent = pNext;

	}

}
//清空
void Clear_LinkList(struct LinkNode *header)
{
	if (NULL == header)
	{
		return;
	}


	//輔助指針變量
	struct LinkNode *pCurrent = header->next;

	while (pCurrent != NULL)
	{

		//先保存下當前結點的下一個節點地址
		struct LinkNode *pNext = pCurrent->next;

		//釋放當前結點內存
		free(pCurrent);

		//pCurrent指向下一個節點
		pCurrent = pNext;

	}

	header->next = NULL;

}

測試鏈表 TestLinkList.c

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include"LinkList.h"

void test()
{
	//初始化鏈表 100 200 666 300 400 500 600
	struct LinkNode *header =  Init_LinkList();
	//打印鏈表
	Foreach_LinkList(header);
	//插入數據
	InsertByValue_LinkList(header, 200, 666);
	//打印鏈表
	printf("\n-------------------\n");
	Foreach_LinkList(header);

	//清空鏈表
	Clear_LinkList(header);
	//打印鏈表

	InsertByValue_LinkList(header, 1000, 111);
	InsertByValue_LinkList(header, 1000, 211);
	InsertByValue_LinkList(header, 1000, 311);
	InsertByValue_LinkList(header, 1000, 411);

	printf("\n-------------------\n");
	Foreach_LinkList(header);


	RemoveByValue_LinkList(header,311);
	printf("\n-------------------\n");
	Foreach_LinkList(header);

	RemoveByValue_LinkList(header, 211);
	printf("\n-------------------\n");
	Foreach_LinkList(header);

	//銷燬鏈表
	Destroy_LinkList(header);

}

int main(){

	test();

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