目录
初始化链表
插入
删除
遍历
销毁
清空
初始化链表
代码:
struct LinkNode* Init_LinkList() {
struct LinkNode* head = (struct LinkNode*)malloc(sizeof(struct LinkNode));
head->data = -1;
head->next = NULL;
// 尾部指针
struct LinkNode* pRear = head;
int val = -1;
while (true) {
printf("输入插入的数据:\n");
scanf("%d", &val);
if (val == -1) {
break;
}
// 先创建新节点
struct LinkNode* newnode = (struct LinkNode*)malloc(sizeof(struct LinkNode));
newnode->data = val;
newnode->next = NULL;
// 新节点插入到链表
pRear->next = newnode;
// 更新尾部指针指向
pRear = newnode;
}
return head;
}
插入
在值为oldval的位置插入一个新的数据
代码:
void InsertByValue_LinkList(struct LinkNode* head, int oldval, int newval) {
if (head == NULL) {
return;
}
// 两个辅助指针变量
struct LinkNode* pPrev = head;
struct LinkNode* pCurrent = pPrev->next;
while (pCurrent != NULL) {
if (pCurrent->data == oldval) {
break;
}
pPrev = pCurrent;
pCurrent = pCurrent->next;
}
// 先创建新节点
struct LinkNode* newnode = (struct LinkNode*)malloc(sizeof(struct LinkNode));
newnode->data = newval;
newnode->next = NULL;
// 新节点插入到链表中
newnode->next = pCurrent;
pPrev->next = newnode;
}
删除
删除值为val的节点
代码:
void RemoveByValue_LinkList(struct LinkNode* head, int delValue) {
if (head == NULL) {
return;
}
// 两个辅助指针变量
struct LinkNode* pPrev = head;
struct LinkNode* pCurrent = pPrev->next;
while (pCurrent != NULL) {
if (pCurrent->data == delValue) {
break;
}
// 移动两个辅助指针
pPrev = pCurrent;
pCurrent = pCurrent->next;
}
if (pCurrent == NULL) {
return;
}
// 重新建立待删除节点的前驱和后继节点的关系
pPrev->next = pCurrent->next;
// 释放删除节点内存
free(pCurrent);
pCurrent = NULL;
}
遍历
void Foreach_LinkList(struct LinkNode* head) {
if (head == NULL) {
return NULL;
}
// 辅助指针变量
struct LinkNode* pCurrent = head->next;
while (pCurrent != NULL)
{
printf("%d ", pCurrent->data);
pCurrent = pCurrent->next;
}
}
销毁
void Destroy_LinkList(struct LinkNode* head) {
if (NULL == head) {
return;
}
// 辅助指针变量
struct LinkNode* pCurrent = head;
while (pCurrent != NULL) {
// 先保存下当前节点的下一个节点地址
struct LinkNode* pNext = pCurrent->next;
// 释放当前节点内存
printf("%d节点被销毁!", pCurrent->data);
free(pCurrent);
// 指针向后移动
pCurrent = pNext;
}
}
清空
void Clear_LinkList(struct LinkNode* head) {
if (head == NULL) {
return;
}
// 辅助指针变量
struct LinkNode* pCurrent = head->next;
while (pCurrent != NULL) {
// 先保存下当前节点的下一个节点地址
struct LinkNode* pNext = pCurrent->next;
// 释放当前节点内存
free(pCurrent);
// pCurrent指向下一个节点
pCurrent = pNext;
}
head->next = NULL;
}