20240517,链表……总是敲不对~再看第二遍~

妈的,定义听了四五遍滚瓜烂熟,代码是一次没敲出啦……众所周知,脑子越乱,注释越多
并且,黑马我真的哭死,退一万步讲,是我能解决BUG的网课

#define _CRT_STRUCT_NO_WARNING
记住这行代码,因为他,我今天终于敲出来,能跑的链表了

静态链表
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

//链表结点定义
struct LinkNode {
    int data;//数据域
    struct LinkNode* next;//指针域
};

void test01() {
    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() {
    test01();
    return 0;
}
动态链表
LinkList.h
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#ifdef __cplusplus
extern "C"{
#endif

	struct LinkNode {
		int data;
		struct LinkNode* next;
	};

	//初始化链表--拿到第一个结点?
	struct LinkNode* Init_LinkList();
	//在值为OLDVAL的后面插入一个新的数据NEVAL
	void InterByValue_LinkList(struct LinkNode *header,int oldval,int newval);
	//删除结点
	void RemoveByValue_LinkList(struct LinkNode* header, int delval);
	//遍历
	void Foreach_LinkList(struct LinkNode* header);
	//销毁链表
	void Destroy_LinkList(struct LinkNode* header);
	//清空
	void Clean_LinkList(struct LinkNode* header);

#ifdef __cplusplus
}
#endif
 LinkList.c
#include"LinkList.h"

//初始化链表--拿到第一个结点?
struct LinkNode* Init_LinkList() {
	//创建头结点
	struct LinkNode* header = malloc(sizeof(struct LinkNode));//header是指针类型
	header->data=-1;
	header->next = NULL;
	//尾部指针__指向头结点
	struct LinkNode* pRear = header;
	int val = -1;
	printf("input insert value:\n");
	while (true) {
		//printf("input insert value:\n");
		scanf_s("%d", &val);
		if (val == -1) {
			break;
		}
		//创建新节点
		struct LinkNode* newnode = malloc(sizeof(struct LinkNode));
		//同C++的NEW,申请一块空间,返回指向空间的指针?a=(int*)malloc(sizeof(int))?
		newnode->data = val;
		newnode->next = NULL;
		//插入链表中
		pRear->next = newnode;//尾部指针指向头节点,即HEADER.NEXT=NEWNODE
		//更新尾部指针指向
		pRear = newnode;//尾部指针指向新结点
	}
	return header;
}

//在值为OLDVAL的后面插入一个新的数据NEVAL
void InterByValue_LinkList(struct LinkNode* header, int oldval, int newval) {
	if (header == NULL) {
		printf("linklist is null");
		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
	if (pCurrent == NULL) {//不存在值为VAL的结点
		return;
	}//不要这句话,就是如果找不到,默认插到尾部
#endif
	//创建新结点
	struct LinkNode* newnode = malloc(sizeof(struct LinkNode));
	newnode->data = newval;
	newnode->next = pCurrent;
	pPrev->next = newnode;
}

//删除结点
void RemoveByValue_LinkList(struct LinkNode* header, int delval) {
	if (header == NULL) {
		return;
	}
	struct LinkNode *pPrev = header;
	struct LinkNode* pCurrent = pPrev->next;
	while (pCurrent != NULL) {
		if (pCurrent->data == delval) {
			break;          //找到,退出循环
		}
		pPrev = pCurrent;
		pCurrent = pCurrent->next;
	}
	if (pCurrent == NULL) {
		printf("no find\n");
		return;
	}
	//重新建立结点关系
	pPrev->next = pCurrent->next;
	free(pCurrent);
	pCurrent = NULL;
}

//遍历
void Foreach_LinkList(struct LinkNode* header) {
	if (NULL == header) {
		//printf("linklist is null");//?清空链表不会输出
		return;//空链表
	}
	//辅助指针变量
	struct LinkNode* pCurrent = header->next;
	while (pCurrent != NULL) {
		printf("%d ", pCurrent->data);
		pCurrent = pCurrent->next;
	}
	printf("\n");
}

//销毁链表
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 Clean_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;
}
a.c 
#define _CRT_STRUCT_NO_WARNING//骂人了要呜呜呜
#include"LinkList.h"
void test() {
	//初始化链表,拿到头结点
	struct LinkNode* header = Init_LinkList();
	Foreach_LinkList(header);
	InterByValue_LinkList(header, 300, 666);
	printf("inter 666 after:\n");
	Foreach_LinkList(header);
	Clean_LinkList(header);
	Foreach_LinkList(header);
	InterByValue_LinkList(header, 100, 111111);
	InterByValue_LinkList(header, 100, 222222);
	InterByValue_LinkList(header, 100, 333333);
	Foreach_LinkList(header);
	RemoveByValue_LinkList(header,111111);
	Foreach_LinkList(header);
	Destroy_LinkList(header);
}
int main() {
	test();
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值