关于单向链表创建以及一些简单的增删查改功能
2017-08-02 20:37
579 查看
[align=center]1.单向链表简介[/align]
[align=left] 单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始;链表是使用指针进行构造的列表;又称为结点列表,因为链表是由一个个结点组装起来的;其中每个结点都有指针成员变量指向列表中的下一个结点;[/align]
[align=left] 列表是由结点构成,head指针指向第一个成为表头结点,而终止于最后一个指向nuLL的指针。[/align]
[align=center]2.实现链表功能[/align]
[align=left] 本人利用C语言实现了一个简单的单向链表,并且实现了增删查改,动态内存管理能一系列功能,仅供大家参考。[/align]
[align=center]3.程序代码[/align]
[align=left]1.Linklist.h[/align]
3.test.c
[align=left] 单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始;链表是使用指针进行构造的列表;又称为结点列表,因为链表是由一个个结点组装起来的;其中每个结点都有指针成员变量指向列表中的下一个结点;[/align]
[align=left] 列表是由结点构成,head指针指向第一个成为表头结点,而终止于最后一个指向nuLL的指针。[/align]
[align=center]2.实现链表功能[/align]
[align=left] 本人利用C语言实现了一个简单的单向链表,并且实现了增删查改,动态内存管理能一系列功能,仅供大家参考。[/align]
[align=center]3.程序代码[/align]
[align=left]1.Linklist.h[/align]
#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-& 4000 gt;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; }
相关文章推荐
- mongodb学习一 关于 下载 安装 以及增删改查 还有一些简单的命令
- Sql Server 的crud(增删改查)以及一些简单的嵌套查询
- 关于新创建一个虚拟机以及多台机器ssh无密登录的一些细节问题补充
- (C语言版)链表(一)——实现单向链表创建、插入、删除等简单操作(包含个人理解说明及注释,新手跟着写代码)
- (C语言版)链表(二)——实现单向循环链表创建、插入、删除、释放内存等简单操作
- 关于链表的一些简单内容
- 二、jena解析关于基因的go.owl文件(创建、新增类、以及一些节点)
- 链表的头文件以及一些简单的应用
- Data Mining with R (code + notes) Chapter 1 --- R中关于DM的数据结构,以及一些简单的命令
- (C语言版)链表(一)——实现单向链表创建、插入、删除等简单操作(包含个人理解说明及注释,新手跟着写代码)
- [转]C语言之单向链表的创建插入删除等功能
- 关于ios的autoLayout的一些简单介绍以及使用方法
- 创建一个简单的单向链表并将其倒序输出
- 关于短信模板管理简单的增删改查的功能实现
- 链表的头文件以及一些简单的应用
- 关于ios的autoLayout的一些简单介绍以及使用方法
- 关于历史命令和一些简单的快捷键的初识;以及man帮助
- T-sql之创建表以及其他简单功能
- oracle对表进行增删查改的操作,以及对用户的一些简单的操作
- (C语言版)链表(二)——实现单向循环链表创建、插入、删除、释放内存等简单操作