linkList.h文件
#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct LinkNode
{
int num;
struct LinkNode *next;
};
//初始化链表
extern struct LinkNode* init_LinkList(void);
//遍历链表内容
extern void foreach_LinkList(struct LinkNode *pHead);
//插入数据
extern void search_LinkList(struct LinkNode *pHead, int oldVal, int newVal);
//删除数据
extern void delete_LinkList(struct LinkNode *pHead,int value);
//清空数据
extern void clear_LinkList(struct LinkNode *pHead);
//销毁链表
extern void destroy_LinkList(struct LinkNode *pHead);
//反转链表
extern void reverse_LinkList(struct LinkNode *pHead);
//链表总长度
extern int size_LinkList(struct LinkNode *pHead);
//递归逆序遍历数据
extern void print_LinkList(struct LinkNode *pHead);
linkList.c文件
#include "linkList.h"
//初始化链表
struct LinkNode* init_LinkList(void)
{
struct LinkNode *pHead = malloc(sizeof(struct LinkNode));
if (pHead == NULL)
{
perror("malloc");
return NULL;
}
pHead->next = NULL;
int val = 0;
struct LinkNode *pTail = pHead;
while (1)
{
printf("输入-1结束输入:\n");
scanf("%d", &val);
if (val == -1)
break;
struct LinkNode *newNode = malloc(sizeof(struct LinkNode));
newNode->num = val;
newNode->next = NULL;
//建立关系
pTail->next = newNode;
pTail = newNode;
}
return pHead;
}
//遍历链表内容
void foreach_LinkList(struct LinkNode *pHead)
{
if (pHead == NULL)
return;
struct LinkNode *pCurrent = pHead->next;
while (pCurrent != NULL)
{
printf("%d ", pCurrent->num);
pCurrent = pCurrent->next;
}
printf("\n");
return;
}
//插入数据
void search_LinkList(struct LinkNode *pHead, int oldVal, int newVal)
{
if (pHead == NULL)
return;
struct LinkNode * prev = pHead;
struct LinkNode * pcur = pHead->next;
while (pcur != NULL)
{
if (pcur->num == oldVal)//找到插入位置
{
break;
}
prev = pcur;
pcur = pcur->next;
}
struct LinkNode *newNode = malloc(sizeof(struct LinkNode));
newNode->num = newVal;
newNode->next = NULL;
newNode->next = pcur;
prev->next = newNode;
return;
}
//删除数据
void delete_LinkList(struct LinkNode *pHead, int delData)
{
if (pHead == NULL)
return;
struct LinkNode * prev = pHead;
struct LinkNode * pcur = pHead->next;
while (pcur != NULL)
{
if (pcur->num == delData)//找到删除位置
{
break;
}
prev = pcur;
pcur = pcur->next;
}
prev->next = pcur->next;
free(pcur);
return;
}
//清空数据
void clear_LinkList(struct LinkNode *pHead)
{
if (pHead == NULL)
return;
struct LinkNode *prev = pHead->next;
while (prev != NULL)
{
struct LinkNode *next = prev->next;
free(prev);
prev = next;
}
pHead->next = NULL;
return;
}
//销毁链表
void destroy_LinkList(struct LinkNode *pHead)
{
if (pHead == NULL)
return;
clear_LinkList(pHead);
free(pHead);
return;
}
//反转链表
void reverse_LinkList(struct LinkNode *pHead)
{
if (pHead == NULL)
return;
struct LinkNode *pPrve = NULL;
struct LinkNode *pNext = NULL;
struct LinkNode *pCurr = pHead->next;
while (pCurr != NULL)
{
pNext = pCurr->next;
pCurr->next = pPrve;
pPrve = pCurr;
pCurr = pNext;
}
pHead->next = pPrve;
return;
}
//链表总长度
int size_LinkList(struct LinkNode *pHead)
{
if (pHead == NULL)
return;
int size = 0;
struct LinkNode *pCurr = pHead->next;
while (pCurr != NULL)
{
++size;
pCurr = pCurr->next;
}
return size;
}
//递归逆序遍历数据
void print_LinkList(struct LinkNode *pHead)
{
if (pHead == NULL)
return;
print_LinkList(pHead->next);
printf("%d ", pHead->num);
}
main.c文件
#include"linkList.h"
void test01()
{
struct LinkNode * pHead = init_LinkList();
foreach_LinkList(pHead);
search_LinkList(pHead, 10, 100);
search_LinkList(pHead, 20, 200);
search_LinkList(pHead, -1, 300);
printf("插入数据后遍历结果:\n");
foreach_LinkList(pHead);
delete_LinkList(pHead, 300);
printf("删除数据后遍历结果:\n");
foreach_LinkList(pHead);
clear_LinkList(pHead);
printf("清空数据后遍历结果:\n");
foreach_LinkList(pHead);
//销毁链表
destroy_LinkList(pHead);
//printf("------------------:\n");
//search_LinkList(pHead, 10, 100);
//foreach_LinkList(pHead);
return;
}
void test02()
{
struct LinkNode * pHead = init_LinkList();
printf("反转前:\n");
foreach_LinkList(pHead);
printf("反转后:\n");
reverse_LinkList(pHead);
foreach_LinkList(pHead);
int size = size_LinkList(pHead);
printf("链表长度:%d\n", size);
return;
}
void test03()
{
struct LinkNode * pHead = init_LinkList();
foreach_LinkList(pHead);
print_LinkList(pHead->next);
printf("\n");
return;
}
int main(int argc, char* argv[])
{
test03();
system("pause");
return EXIT_SUCCESS;
}