【2】线性表的存储--链表

线性表的存储–链表

1、数据结构

//链表结点
typedef struct LINKNODE{
	void* data;  //指向任何类型的数据
	struct LINKNODE* next;
}LinkNode;

//链表结构体
typedef struct LINKLIST{
	LinkNode* head;
	int size;
	//需要容量吗?没有容量的概念
}LinkList;

2、由于data可以指向任何数据类型,因此打印函数需要使用者自己构造并且传入。

(1)声明打印函数指针

//打印函数指针
typedef void(*PRINTLINKNODE)(void*);

(2)假设数据类型为下(用户自定)

//自定义数据类型
typedef struct PERSON{
	char name[64];
	int age;
	int score;
}Person;

(2)构造打印函数(用户自定)

//打印函数
void MyPrint(void* data){
	Person* p = (Person*)data;
	printf("Name:%s Age:%d Score:%d\n",p->name,p->age,p->score);
}

(3)传入打印函数

//打印链表结点
void Print_LinkList(LinkList* list, PRINTLINKNODE print){
	if (list == NULL){
		return;
	}
	//辅助指针变量
	LinkNode* pCurrent = list->head->next;
	while (pCurrent != NULL){
		print(pCurrent->data);
		pCurrent = pCurrent->next;
	}

}

(4)示例

int mian(){
	......
	//打印
	printf("---------------\n");
	Print_LinkList(list, MyPrint);
	return 0;
	}

3、初始化链表

//初始化链表
LinkList* Init_LinkList(){

	LinkList* list = (LinkList*)malloc(sizeof(LinkList));
	list->size = 0;

	//头结点 是不保存数据信息
	list->head = (LinkNode*)malloc(sizeof(LinkNode));
	list->head->data = NULL;
	list->head->next = NULL;

	return list;
}

4、指定位置插入

//指定位置插入
void Insert_LinkList(LinkList* list, int pos, void* data){

	if (list == NULL){
		return;
	}
	if (data == NULL){
		return;
	}

	//友好的处理,pos越界 
	if (pos < 0 || pos > list->size){
		pos = list->size;
	}

	//创建新的结点
	LinkNode* newnode = (LinkNode*)malloc(sizeof(LinkNode));
	newnode->data = data;
	newnode->next = NULL;

	//找结点
	//辅助指针变量
	LinkNode* pCurrent = list->head;
	for (int i = 0; i < pos;i++){
		pCurrent = pCurrent->next;
	}

	//新结点入链表
	newnode->next = pCurrent->next;
	pCurrent->next = newnode;

	list->size++;

}

5、删除指定位置的值

void RemoveByPos_LinkList(LinkList* list, int pos){
	if (list == NULL){
		return;
	}

	if (pos < 0 || pos >= list->size){
		return;
	}

	//查找删除结点的前一个结点
	LinkNode* pCurrent = list->head;
	for (int i = 0; i < pos;i ++){
		pCurrent = pCurrent->next;
	}

	//缓存删除的结点
	LinkNode* pDel = pCurrent->next;
	pCurrent->next = pDel->next;
	//释放删除结点的内存
	free(pDel);

	list->size--;
}

6、获得链表长度

//获得链表的长度
int Size_LinkList(LinkList* list){
	return list->size;
}

7、查找

//查找
int Find_LinkList(LinkList* list, void* data){
	if (list == NULL){
		return -1;
	}

	if (data == NULL){
		return -1;
	}

	//遍历查找
	LinkNode* pCurrent = list->head->next;
	int i = 0;
	while (pCurrent != NULL){
		if (pCurrent->data == data){
			break;
		}
		i++;
		pCurrent = pCurrent->next;
	}

	return i;
}

8、返回第一个位置的值

void* Front_LinkList(LinkList* list){
	return list->head->next->data;
}

9、释放链表内存

void FreeSpace_LinkList(LinkList* list){

	if (list == NULL){
		return;
	}

	//辅助指针变量
	LinkNode* pCurrent = list->head;
	while (pCurrent != NULL){
		//缓存下一个结点
		LinkNode* pNext = pCurrent->next;
		free(pCurrent);
		pCurrent = pNext;
	}

	//释放链表内存
	list->size = 0;
	free(list);

}

你可能感兴趣的:(数据结构)