单链表的简单函数实现
来源:互联网 发布:云安全软件好用吗 编辑:程序博客网 时间:2024/06/17 06:32
首先我们得了解一下什么是链表?什么是单链表
所谓链表其实就是一些包含数据的独立数据结构(通常称为结点)的集合,链表中的每个结点通过链或指针连接在一起,程序通过指针访问链表中的结点。
在单链表中,每个结点包含一个指向链表下一个结点的指针,链表最后一个结点的指针字段的值为NULL。
下图为单链表的具体实现方式图
下面我们用代码来简单实现一下~
LinkList.h //函数声明
#ifndef _LINKLIST_H__#define _LINKLIST_H__#include<stdio.h>#include<stdlib.h>#include<assert.h>#include<string.h>typedef int DataType;//假设结点的数据域类型为整型typedef struct Node//结点类型定义{ DataType data;//结点的数据域 struct Node* next;//结点的指针域}Node, *pNode, *pList;void InitLinkList(pList* pplist);void Display(pList pl);//打印void PushFront(pList* pplist, DataType x);//头插void PopFront(pList* pplist);//头删void PushBack(pList* pplist, DataType x);//尾插void PopBack(pList* pplist);//尾删pNode Find(pList pl, DataType d); //查找void Remove(pList *pplist, DataType x);//删除链表中指定元素void Destroy(pList* pplist);//销毁void Show(pList pl);//逆序打印(递归实现)void DelNotTail(pNode pos);//删除无头链表的非尾节点void InsertFrontNode(pNode pos, DataType d);//当前节点插入一个数据
LinkList.c //函数的具体实现
#define _CRT_SECURE_NO_WARNINGS 1 #include"LinkList.h"void InitLinkList(pList* pplist)//初始化{ assert(pplist != NULL); *pplist = NULL;}void Display(pList pl){ if (pl == NULL) { return; } while (pl) { printf("%d-->", pl->data); pl = pl->next; } printf("over\n");}void PushFront(pList* pplist, DataType d)//头插{ assert(pplist); Node* newNode = (Node*)malloc(sizeof(Node)); if (newNode == NULL) { perror("use malloc"); exit(EXIT_FAILURE); } newNode->data = d; newNode->next = NULL; newNode->next = *pplist; *pplist = newNode;}void PopFront(pList* pplist){ assert(pplist); pNode cur = *pplist; if (cur == NULL) { return; } else { *pplist = cur->next; free(cur); }}void PushBack(pList* pplist, DataType d){ pNode head = *pplist; pNode cur = NULL; pNode newnode = (Node*)malloc(sizeof(Node)); if (newnode == NULL) { perror("use malloc"); exit(EXIT_FAILURE); } newnode->data = d; newnode->next = NULL; if (head == NULL) { *pplist = newnode; newnode->data = d; newnode->next = NULL; } else { while (head != NULL) { cur = head; head = head->next; } cur->next = newnode; }}void PopBack(pList* pplist){ pNode prev = NULL; pNode cur = *pplist; if (*pplist == NULL) { return; } while (cur->next != NULL) { prev = cur; cur = cur->next; } if (prev != NULL) { prev->next = NULL; free(cur); } else { free(cur); *pplist = NULL; }}pNode Find(pList pl, DataType d){ pNode cur = pl; while (cur != NULL) { if (cur->data == d) { return cur; } cur = cur->next; } return NULL;}void Remove(pList *pplist, DataType d)//删除链表中指定元素{ assert(pplist); pNode prev = NULL; pNode cur = Find(*pplist, d); if (cur == NULL) { return; } prev = cur->next; cur->data = prev->data; cur->next = prev->next; free(prev); prev->next = NULL;}void Destroy(pList* pplist){ free(*pplist); pplist = NULL;}void Show(pList pl){ if (pl == NULL) { return; } else { Show(pl->next); printf("%d-->", pl->data); }}void DelNotTail(pNode pos){ assert(pos != NULL); pNode del = NULL; del = pos->next; pos->data = del->data; pos->next = del->next; free(del); del->next = NULL;}void InsertFrontNode(pNode pos, DataType d){ pNode new = (Node*)malloc(sizeof(Node)); if (new == NULL) { perror("use malloc"); exit(EXIT_FAILURE); } else { new->data = pos->data; pos->data = d; new->next = pos->next; pos->next = new; }}
test.c //函数测试
#define _CRT_SECURE_NO_WARNINGS 1#include"LinkList.h"void test1()//头插和头删的测试{ pList plist; InitLinkList(&plist); PushFront(&plist, 1); PushFront(&plist, 2); PushFront(&plist, 3); PushFront(&plist, 4); Display(plist); PopFront(&plist); Display(plist); PopFront(&plist); Display(plist); PopFront(&plist); Display(plist); PopFront(&plist); Display(plist); Destroy(&plist);}void test2(){ pList plist; InitLinkList(&plist); PushBack(&plist, 1); PushBack(&plist, 2); PushBack(&plist, 3); PushBack(&plist, 4); Display(plist); PopBack(&plist); Display(plist); PopBack(&plist); Display(plist); PopBack(&plist); Display(plist); PopBack(&plist); Display(plist); Destroy(&plist);}void test3(){ pList plist; InitLinkList(&plist); PushBack(&plist, 1); PushBack(&plist, 2); PushBack(&plist, 3); PushBack(&plist, 4); Display(plist); Remove(&plist, 3); Display(plist); Destroy(&plist);}void test4(){ pList plist; InitLinkList(&plist); PushBack(&plist, 1); PushBack(&plist, 2); PushBack(&plist, 3); PushBack(&plist, 4); Display(plist); Show(plist); Destroy(&plist);}void test5(){ pList plist; pNode find = NULL; InitLinkList(&plist); PushBack(&plist, 1); PushBack(&plist, 2); PushBack(&plist, 3); PushBack(&plist, 4); Display(plist); find= Find(plist, 3); DelNotTail(find); Display(plist); Destroy(&plist);}void test6(){ pList plist; pNode find = NULL; InitLinkList(&plist); PushBack(&plist, 1); PushBack(&plist, 2); PushBack(&plist, 3); PushBack(&plist, 4); Display(plist); find = Find(plist, 3); InsertFrontNode(find, 5); Display(plist); Destroy(&plist);}int main(){ //test1(); //test2(); //test3(); //test4(); //test5(); test6(); getchar(); return 0;}
阅读全文
1 0
- 单链表的简单函数实现
- 简单的printf函数实现
- atoi函数的简单实现
- Nextday函数的简单实现
- strchr函数的简单实现
- strstr函数的简单实现
- atoi函数的简单实现
- 简单的实现atoi函数
- 简单的实现itoa函数
- malloc函数的简单实现
- 实现简单的printf函数
- 仿函数(functor)的简单实现
- ftoa||gcvt函数的简单实现
- string.h 函数的简单实现
- js中trim函数的简单实现
- 自己实现简单的栈操作函数
- 实现简单的队列操作函数
- 简单的实现atoi函数源代码
- qt做的软件的更新程序!
- 剑指Offer---替换空格
- jquery中点击某元素后滚动条滚动到某元素位置或底部
- 基于易语言写QQ音乐播放器
- Largest Submatrix of All 1’s--(单调队列)
- 单链表的简单函数实现
- 【Python3.6爬虫学习记录】(四)爬取百度贴吧某帖子内容及图片
- HDU 1556-Color the ball(线段树区间更新)
- 构建降序的set
- 记一次springboot拦截器失效的调试
- noip 模拟赛(by azui大爷) day2 t2(附O(1)求RMQ)
- Java文件上传下载
- Python语法基础14.字符串
- 标志性log关键词