1.单向链表简介
单向链表(
单链表
)是
链表
的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始;链表是使用
指针
进行构造的列表;又称为结点列表,因为链表是由一个个结点组装起来的;其中每个结点都有指针
成员变量
指向列表中的下一个结点;
2.实现链表功能
本人利用C语言实现了一个简单的单向链表,并且实现了增删查改,动态内存管理能一系列功能,仅供大家参考。
3.程序代码
1.Linklist.h
#pragma once
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
typedef int DataType;
typedef struct Node
{
DataType data;
struct Node* next;
}Node, *pNode, *pList;
void InitLinkList(pList* pplist);//链表初始化
void PushFront(pList* pplist, DataType d);//头部插入
void Display(pList pl);//打印链表
void PopFront(pList *pplist);//头部删除
void PushBack(pList *pplist, DataType d);//尾部插入
void insert(pList*pplist, int pos, DataType d);//指定位置插入
void erase( pList*pplist, int pos);//指定位置删除
void removec(pList*pplist, DataType d);//删除指定元素
void removeall(pList*pplist, DataType d);//删除所有指定元素
void DestroyList(pList* pplist);//链表销毁
void PopBack(pList *pplist);//尾部删除
pNode Find(pList pl, DataType d);//查找指定元素并返回地址
2实现模块.c
#define _CRT_SECURE_NO_WARNINGS #include"Linklist.h" void InitLinkList(pList* pplist) { assert(pplist); *pplist = NULL; } void DestroyList(pList* pplist) { assert(pplist); pList cur = *pplist; while (cur) { cur = cur->next; free(*pplist); cur = *pplist; } } void PushFront(pList* pplist, DataType d) { Node* cur = malloc(sizeof(Node)); if (cur == NULL) { perror("use malloc "); exit(EXIT_FAILURE); } cur->next = *pplist; cur->data = d; *pplist = cur; } void Display(pList pl) { assert(pl); while (pl) { printf("%d-->", pl->data); pl = pl->next; } printf("\n"); } void PopFront(pList *pplist) { assert(pplist); if (*pplist == NULL) return; pNode tmp = NULL; tmp = *pplist; *pplist = (*pplist)->next; free(tmp); } void PushBack(pList *pplist, DataType d) { assert(pplist); pNode head = *pplist; pNode cur =(pNode)malloc(sizeof(Node)); if (cur == NULL) { perror("use malloc"); exit(EXIT_FAILURE); } cur->data = d; cur->next = NULL; if (head == NULL) { *pplist = cur; return; } while (head->next!= NULL) { head = head->next; } head->next = cur; } void PopBack(pList *pplist) { assert(pplist); pList cur = NULL; pList head = *pplist; if (*pplist == NULL) { return; } while (head->next != NULL) { cur = head; head = head->next; } cur->next = NULL; free(head); } pNode Find(pList pl, DataType d) { assert(pl); while (pl->next != NULL) { if (pl->data == d) { return pl; } pl = pl->next; } return NULL; } void insert(pList*pplist, int pos, DataType d) { assert(pplist); pNode CUR = NULL; pNode head = *pplist; pNode tmp = (pNode)malloc(sizeof(Node)); tmp->data = d; while (head->next&&pos--) { CUR = head; head = head->next; } CUR->next = tmp; tmp->next = head; } void erase(pList*pplist, int pos) { assert(pplist); pList head = *pplist; pList cur = NULL; int num = pos - 1; if (head == NULL) { return; } if (head->next == NULL) { free(head); head = NULL; } if (pos <= 1) { cur = head; cur = cur->next; free(head); return; } while (head->next != NULL&&num--) { cur = head; head = head->next; } head = head->next; free(cur->next); cur->next = head; } void removec(pList*pplist, DataType d) { assert(pplist); pList head = *pplist; pList cur = NULL; if (head == NULL)//空链表处理 { return; } if ((*pplist)->data == d)//删除的是头节点 { *pplist = (*pplist)->next; return; } while (head != NULL) { if (head->data == d) { head = head->next; free(cur->next); cur->next = head; return; } cur = head; head = head->next; } } void removeall(pList*pplist, DataType d) { assert(pplist); pList head = *pplist; pList cur = NULL; if (head == NULL)//空链表处理 { return; } while (head) { if ((*pplist)->data == d) { cur = *pplist; head = head->next; free(cur); continue; } if (head->data == d) { head = head->next; free(cur->next); cur->next = head; continue; } cur = head; head = head->next; } }
3.test.c#define _CRT_SECURE_NO_WARNINGS #include"Linklist.h" void test1()//链表初始化和销毁 { Node *head; InitLinkList(&head); DestroyList(&head); } void test2()//头部插入和打印以及头部删除 { Node *list; InitLinkList(&list); PushFront(&list, 4); PushFront(&list, 3); PushFront(&list, 2); PushFront(&list, 1); Display(list); PopFront(&list); Display(list); PopFront(&list); Display(list); PopFront(&list); Display(list); } void test3()//尾部插入和删除 { Node *list; InitLinkList(&list); PushBack(&list, 1); Display(list); PushBack(&list, 2); Display(list); PushBack(&list, 3); Display(list); PushBack(&list, 4); Display(list); PushBack(&list, 5); Display(list); PopBack(&list); Display(list); PopBack(&list); Display(list); PopBack(&list); Display(list); } void test4()//指定位置插入和删除和查找 { Node *list; InitLinkList(&list); PushBack(&list, 1); PushBack(&list, 2); PushBack(&list, 3); PushBack(&list, 4); Display(list); /*pNode tmp = Find(list, 2); if (tmp == NULL) { printf("没找到\n"); } else { printf("%d\n", tmp->data); }*/ /*insert(&list, 3, 10); Display(list);*/ erase(&list, 2); Display(list); } void test5()//删除指定元素和删除所有指定元素 { Node *list; InitLinkList(&list); PushBack(&list, 1); PushBack(&list, 2); PushBack(&list, 3); PushBack(&list, 4); PushBack(&list, 4); PushBack(&list, 4); PushBack(&list, 4); Display(list); removec(&list, 3); Display(list); removeall(&list, 4); Display(list); } int main() { test5(); getchar(); return 0; }