妈的,定义听了四五遍滚瓜烂熟,代码是一次没敲出啦……众所周知,脑子越乱,注释越多
并且,黑马我真的哭死,退一万步讲,是我能解决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;
}