#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.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;
}
linklist.h
#pragma once
#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 delval);
//遍历
void Foreach_LinkList(struct LinkNode *header);
//销毁
void Destroy_LinkList(struct LinkNode *header);
//清空
void Clear_LinkList(struct LinkNode *header);
//反转
void Reverse_LinkList(struct LinkNode *header);
#ifdef __cplusplus
}
#endif
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
linklist.c
#define _CRT_SECURE_NO_WARNINGS
#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 (1)
{
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;
}
//在值为oldval的后面插入一个新的数据newval
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 (pCurrent == NULL)
{
//先创建新节点
struct LinkNode *newnode = malloc(sizeof(struct LinkNode));
newnode->data = newval;
newnode->next = NULL;
//新节点插入链表中
pPrev->next = newnode;
}
else{
//先创建新节点
struct LinkNode *newnode = malloc(sizeof(struct LinkNode));
newnode->data = newval;
newnode->next = NULL;
//新节点插入链表中
newnode->next = pCurrent;
pPrev->next = newnode;
}
}
//链表反转
void Reverse_LinkList(struct LinkNode *header)
{
if (NULL == header)
{
return;
}
//两个辅助指针变量
struct LinkNode *prev = NULL;
struct LinkNode *pcur = header->next;
struct LinkNode *pnext = NULL;
while (pcur != NULL)
{
pnext = pcur->next;
pcur->next= prev;
prev = pcur;
pcur = pnext;
}
header->next = prev;
}
//删除值为val的结点
void RemoveByValue_LinkList(struct LinkNode *header, int delval)
{
if (NULL == header)
{
return;
}
//两个辅助指针变量
struct LinkNode *pPrev = header;
struct LinkNode *pCurrent = pPrev->next;
while (pCurrent!=NULL)
{
if (pCurrent->data == delval)
{
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\n", pcurrent->data);
pcurrent = pcurrent->next;
}
}
//销毁
void Destroy_LinkList(struct LinkNode *header)
{
if (NULL == header)
{
return;
}
//辅助指针变量
struct LinkNode *pCurrent = header;
struct LinkNode *pNext = NULL;
while (pCurrent!=NULL)
{
//先保存下一个节点地址
pNext = pCurrent->next;
free(pCurrent);
pCurrent = pNext;
}
}
//清空
void Clear_LinkList(struct LinkNode *header)
{
if (NULL == header)
{
return;
}
//辅助指针变量
struct LinkNode *pCurrent = header->next;
//先保存当前结点的下一个结点地址
struct LinkNode *pNext = NULL;
while (pCurrent!=NULL)
{
pNext = pCurrent->next;
//释放当前结点内存
free(pCurrent);
//pcurrent 指向下一个节点
pCurrent = pNext;
}
header->next = NULL;
}
test.c
#define _CRT_SECURE_NO_WARNINGS
#include "linklist.h"
void test()
{
struct LinkNode *header = Init_LinkList();
Foreach_LinkList(header);
InsertByValue_LinkList(header,22,18);
printf("插入数据后=============================\n");
Foreach_LinkList(header);
Clear_LinkList(header);
printf("清空后=============================\n");
Foreach_LinkList(header);
InsertByValue_LinkList(header, 22, 19);
InsertByValue_LinkList(header, 22, 20);
InsertByValue_LinkList(header, 22, 21);
InsertByValue_LinkList(header, 22, 22);
InsertByValue_LinkList(header, 22, 23);
printf("重新插入后=============================\n");
Foreach_LinkList(header);
Reverse_LinkList(header);
printf("反转链表后=============================\n");
Foreach_LinkList(header);
RemoveByValue_LinkList(header, 20);
printf("删除后=============================\n");
Foreach_LinkList(header);
Destroy_LinkList(header);
printf("销毁后=============================\n");
//Foreach_LinkList(header);
}
int main()
{
test();
system("pause");
return EXIT_SUCCESS;
}