直接干货:
LinkList.h文件:
#pragma once
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode* next;
}LNode, *LinkList;
void InitLinkList(LinkList* list);
LNode* _buyNode(ElemType Item);
void push_front(LinkList* list, ElemType x);
void push_back(LinkList* list, ElemType x);
void showList(LinkList* list);
void pop_back(LinkList* list);
void pop_front(LinkList* list);
int length_list(LinkList* list);
void insertLinklist_pos(LinkList* list, int pos, ElemType key);
void delete_LinkList_val(LinkList* list, ElemType x);
void sortLinkList(LinkList* list);
void reverseLinkList(LinkList* list);
int findval_val(LinkList* list, ElemType key);
int countX(LinkList* list, ElemType x);
void clearLinkList(LinkList* list);
void destroyLinkList(LinkList* list);
LinkList.c文件:
#include "LinkList.h"
#include <stdio.h>
#include <stdlib.h>
void InitLinkList(LinkList* list)
{
*list = NULL;
}
LNode* _buyNode(ElemType Item)
{
LNode* NewNode = (LNode*)malloc(sizeof(LNode));
if (NewNode == NULL)
{
printf("Memory allocation failed.\n");
exit(1);
}
NewNode->data = Item;
NewNode->next = NULL;
return NewNode;
}
void push_front(LinkList* list, ElemType x)
{
LNode* NewNode = _buyNode(x);
NewNode->next = *list;
*list = NewNode;
}
void push_back(LinkList* list, ElemType x)
{
if (*list == NULL)
{
push_front(list, x);
return;
}
LNode* p = *list;
while (p->next != NULL)
{
p = p->next;
}
LNode* NewNode = _buyNode(x);
p->next = NewNode;
}
void showList(LinkList* list)
{
if (*list == NULL)
{
printf("The LinkList is empty.\n");
return;
}
LNode* p = *list;
while (p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
void pop_back(LinkList* list)
{
if (*list == NULL)
{
return;
}
if ((*list)->next == NULL)
{
free(*list);
*list = NULL;
return;
}
LNode* p = *list;
while (p->next->next != NULL)
{
p = p->next;
}
free(p->next);
p->next = NULL;
}
void pop_front(LinkList* list)
{
if (*list == NULL)
{
return;
}
LNode* p = *list;
*list = (*list)->next;
free(p);
}
int length_list(LinkList* list)
{
int count = 0;
LNode* p = *list;
while (p != NULL)
{
count++;
p = p->next;
}
return count;
}
void insertLinklist_pos(LinkList* list, int pos, ElemType key)
{
if (pos < 0 || pos > length_list(list))
{
return;
}
if (pos == 0)
{
push_front(list, key);
return;
}
LNode* p = *list;
for (int i = 0; i < pos - 1; i++)
{
p = p->next;
}
LNode* NewNode = _buyNode(key);
NewNode->next = p->next;
p->next = NewNode;
}
void delete_LinkList_val(LinkList* list, ElemType x)
{
if (*list == NULL)
{
return;
}
if ((*list)->data == x)
{
pop_front(list);
return;
}
LNode* p = *list;
while (p->next != NULL && p->next->data != x)
{
p = p->next;
}
if (p->next != NULL)
{
LNode* q = p->next;
p->next = q->next;
free(q);
}
}
void sortLinkList(LinkList* list)
{
if (*list == NULL || (*list)->next == NULL)
{
return;
}
LNode* p = *list;
LNode* q;
ElemType temp;
while (p != NULL)
{
q = p->next;
while (q != NULL)
{
if (p->data > q->data)
{
temp = p->data;
p->data = q->data;
q->data = temp;
}
q = q->next;
}
p = p->next;
}
}
void reverseLinkList(LinkList* list)
{
if (*list == NULL || (*list)->next == NULL)
{
return;
}
LNode* prev = NULL;
LNode* current = *list;
LNode* next;
while (current != NULL)
{
next = current->next;
current->next = prev;
prev = current;
current = next;
}
*list = prev;
}
int findval_val(LinkList* list, ElemType key)
{
int index = 0;
LNode* p = *list;
while (p != NULL && p->data != key)
{
p = p->next;
index++;
}
if (p == NULL)
{
return -1;
}
return index;
}
int countX(LinkList* list, ElemType x)
{
int count = 0;
LNode* p = *list;
while (p != NULL)
{
if (p->data == x)
{
count++;
}
p = p->next;
}
return count;
}
void clearLinkList(LinkList* list)
{
LNode* p = *list;
while (p != NULL)
{
LNode* temp = p;
p = p->next;
free(temp);
}
*list = NULL;
}
void destroyLinkList(LinkList* list)
{
clearLinkList(list);
}
LinkList.h文件:
#pragma once
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode* next;
}LNode, *LinkList;
void InitLinkList(LinkList* list); // 初始化链表
LNode* _buyNode(ElemType Item); // 创建新结点
void push_front(LinkList* list, ElemType x); // 头插法插入结点
void push_back(LinkList* list, ElemType x); // 尾插法插入结点
void showList(LinkList* list); // 输出链表元素
void pop_back(LinkList* list); // 删除尾部结点
void pop_front(LinkList* list); // 删除头部结点
int length_list(LinkList* list); // 返回链表长度
void insertLinklist_pos(LinkList* list, int pos, ElemType key); // 在指定位置插入结点
void delete_LinkList_val(LinkList* list, ElemType x); // 删除指定元素的结点
void sortLinkList(LinkList* list); // 对链表进行排序
void reverseLinkList(LinkList* list); // 反转链表
int findval_val(LinkList* list, ElemType key);// 查找指定元素的位置
int countX(LinkList* list, ElemType x); // 统计指定元素出现的次数
void clearLinkList(LinkList* list); // 清空链表
void destroyLinkList(LinkList* list); // 销毁链表
LinkList.c文件:
#include "LinkList.h"
#include <stdio.h>
#include <stdlib.h>
void InitLinkList(LinkList* list)
{
*list = NULL;
}
LNode* _buyNode(ElemType Item)
{
LNode* NewNode = (LNode*)malloc(sizeof(LNode));
if (NewNode == NULL)
{
printf("Memory allocation failed.\n");
exit(1);
}
NewNode->data = Item;
NewNode->next = NULL;
return NewNode;
}
void push_front(LinkList* list, ElemType x)
{
LNode* NewNode = _buyNode(x);
NewNode->next = *list;
*list = NewNode;
}
void push_back(LinkList* list, ElemType x)
{
if (*list == NULL)
{
push_front(list, x);
return;
}
LNode* p = *list;
while (p->next != NULL)
{
p = p->next;
}
LNode* NewNode = _buyNode(x);
p->next = NewNode;
}
void showList(LinkList* list)
{
if (*list == NULL)
{
printf("The LinkList is empty.\n");
return;
}
LNode* p = *list;
while (p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
void pop_back(LinkList* list)
{
if (*list == NULL)
{
return;
}
if ((*list)->next == NULL)
{
free(*list);
*list = NULL;
return;
}
LNode* p = *list;
while (p->next->next != NULL)
{
p = p->next;
}
free(p->next);
p->next = NULL;
}
void pop_front(LinkList* list)
{
if (*list == NULL)
{
return;
}
LNode* p = *list;
*list = (*list)->next;
free(p);
}
int length_list(LinkList* list)
{
int count = 0;
LNode* p = *list;
while (p != NULL)
{
count++;
p = p->next;
}
return count;
}
void insertLinklist_pos(LinkList* list, int pos, ElemType key)
{
if (pos < 0 || pos > length_list(list))
{
return;
}
if (pos == 0)
{
push_front(list, key);
return;
}
LNode* p = *list;
for (int i = 0; i < pos - 1; i++)
{
p = p->next;
}
LNode* NewNode = _buyNode(key);
NewNode->next = p->next;
p->next = NewNode;
}
void delete_LinkList_val(LinkList* list, ElemType x)
{
if (*list == NULL)
{
return;
}
if ((*list)->data == x)
{
pop_front(list);
return;
}
LNode* p = *list;
while (p->next != NULL && p->next->data != x)
{
p = p->next;
}
if (p->next != NULL)
{
LNode* q = p->next;
p->next = q->next;
free(q);
}
}
void sortLinkList(LinkList* list)
{
if (*list == NULL || (*list)->next == NULL)
{
return;
}
LNode* p = *list;
LNode* q;
ElemType temp;
while (p != NULL)
{
q = p->next;
while (q != NULL)
{
if (p->data > q->data)
{
temp = p->data;
p->data = q->data;
q->data = temp;
}
q = q->next;
}
p = p->next;
}
}
void reverseLinkList(LinkList* list)
{
if (*list == NULL || (*list)->next == NULL)
{
return;
}
LNode* prev = NULL;
LNode* current = *list;
LNode* next;
while (current != NULL)
{
next = current->next;
current->next = prev;
prev = current;
current = next;
}
*list = prev;
}
int findval_val(LinkList* list, ElemType key)
{
int index = 0;
LNode* p = *list;
while (p != NULL && p->data != key)
{
p = p->next;
index++;
}
if (p == NULL)
{
return -1;
}
return index;
}
int countX(LinkList* list, ElemType x)
{
int count = 0;
LNode* p = *list;
while (p != NULL)
{
if (p->data == x)
{
count++;
}
p = p->next;
}
return count;
}
void clearLinkList(LinkList* list)
{
LNode* p = *list;
while (p != NULL)
{
LNode* temp = p;
p = p->next;
free(temp);
}
*list = NULL;
}
void destroyLinkList(LinkList* list)
{
clearLinkList(list);
}