链表的基本实现
来源:互联网 发布:欧盟对华反倾销数据 编辑:程序博客网 时间:2024/05/16 14:18
单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始;链表是使用指针进行构造的列表;又称为结点列表,因为链表是由一个个结点组装起来的;其中每个结点都有指针成员变量指向列表中的下一个结点;
相比较普通的线性结构,链表结构的可以总结一下:
(1)单个结点创建非常方便,普通的线性内存通常在创建的时候就需要设定数据的大小
(2)结点的删除非常方便,不需要像线性结构那样移动剩下的数据
(3)结点的访问方便,可以通过循环或者递归的方法访问到任意数据,但是平均的访问效率低于线性表.
下面实现一个基本具有增删查改功能的单向链表:
头文件
#pragma once#include <stdio.h>#include <malloc.h>#include <assert.h>typedef int Datatype;typedef struct Listnode{ Datatype data; struct Listnode* next;}Listnode;Listnode* BuyNode(Datatype x);//创建一个新的节点void PrintList(Listnode* plist);//打印链表void PushBack(Listnode** pplist, Datatype x);//尾部插入void PopBack(Listnode** pplist);//删除最后一个void PushFront(Listnode** pplist, Datatype x);//头插void PopFront(Listnode** pplist);//头删Listnode* Find(Listnode* plist, Datatype x);//查找任意一个// 在pos的前面插入一个节点x void Insert(Listnode** pplist, Listnode* pos, Datatype x);void Erase(Listnode** pplist, Listnode* pos);//删除位置为pos的节点
函数实现
#include"list.h"Listnode* BuyNode(Datatype x)//创建一个新的节点{ Listnode* node = (Listnode*)malloc(sizeof(Listnode)); node->data = x; node->next = NULL; return node;}void PushBack(Listnode** pplist, Datatype x)//尾部插入{ if ((*pplist) == NULL)//没有节点时 { *pplist = BuyNode(x); } else if ((*pplist)->next == NULL)//有一个节点时 { (*pplist)->next = BuyNode(x); } else { Listnode* tmp = *pplist; while (tmp->next)//有两个或两个以上个节点时 { tmp = tmp->next; } tmp->next= BuyNode(x); }}void PopBack(Listnode** pplist)//删除最后一个{ if (*pplist == NULL)//没有节点时 { return; } else if ((*pplist)->next == NULL)//有一个节点时 { free(*pplist); *pplist = NULL; } else { Listnode* cur = *pplist; Listnode* pos = cur; while (cur->next )//有两个或两个以上个节点时 { pos = cur; cur = cur->next; } free(cur); cur = NULL; pos->next = NULL; }}void PushFront(Listnode** pplist, Datatype x)//头插{ if ((*pplist) == NULL)//没有节点 { (*pplist) = BuyNode(x); } else//有节点 { Listnode *tmp = BuyNode(x); tmp->next = *pplist; *pplist = tmp; }}void PopFront(Listnode** pplist)//头删{ if (*pplist == NULL)//没有节点 { return; } else if ((*pplist)->next == NULL)//一个节点 { free(*pplist); (*pplist) = NULL; } else//多个节点 { while ((*pplist)->next != NULL) { Listnode *tmp = (*pplist)->next; free(*pplist); (*pplist) = NULL; (*pplist) = tmp; } }}Listnode* Find(Listnode* plist, Datatype x)//查找任意一个{ if (plist == NULL) { return NULL; } else { while (plist) { if (plist->data = x) return plist; } plist = plist->next; } return NULL;}void PrintList(Listnode* plist)//打印链表{ Listnode* cur = plist; while (cur) { printf("%d->", cur->data); cur = cur->next; } printf("NULL\n");}void Insert(Listnode** pplist, Listnode* pos, Datatype x){ assert(pos); if ((*pplist == NULL) || (*pplist)->next == NULL || (*pplist == pos)) { PushFront(pplist, x); } else { Listnode*tmp = NULL; Listnode*cur = *pplist; while (cur->next!=pos) { cur = cur->next; } tmp = BuyNode(x); cur->next = tmp; tmp->next = pos; }}void Erase(Listnode** pplist, Listnode* pos)//删除位置为pos的节点{ assert(pos); if ((*pplist == NULL) || ((*pplist)->next == NULL) || (*pplist == pos)) { PopFront(pplist); } else { Listnode* tmp = *pplist; while (tmp->next != pos) { tmp = tmp->next; } tmp->next = pos->next; free(pos); pos = NULL; }}
主函数
#define _CRT_SECURE_NO_WARNINGS 1#include"list.h"void test1(){ Listnode *list = NULL; PushBack(&list, 1); PushBack(&list, 2); PushBack(&list, 3); PushBack(&list, 4); PrintList(list); PopBack(&list); PopBack(&list); PopBack(&list); PopBack(&list); PrintList(list);}void test2(){ Listnode* list = NULL; PushFront(&list, 1); PushFront(&list, 2); PushFront(&list, 3); PushFront(&list, 4); PopFront(&list); PopFront(&list); PopFront(&list); PopFront(&list); PopFront(&list); PrintList(list);}void test3(){ Listnode* list = NULL; PushBack(&list, 1); PushBack(&list, 2); PushBack(&list, 3); Listnode* pos = Find(list, 2); Insert(&list, pos, 4); PrintList(list); pos = Find(list, 2); Erase(&list, pos); PrintList(list);}int main(){ test3(); //test1(); test2(); getchar(); return 0;}
多谢各位大佬指点错误。
阅读全文
0 0
- 链表的基本实现
- 链表的基本实现例程
- 链表的基本操作实现
- 链表基本操作的实现
- 链表基本操作的实现
- 链表基本操作的实现
- c++实现链表的基本操作
- 双向链表的基本操作实现
- 链表基本操作的实现
- 链表基本操作的实现
- 链表的最基本实现
- 链表的基本实现-c语言
- 循环链表的基本实现
- 链式链表的基本实现
- c#中基本链表的实现
- JAVA实现链表的基本操作
- 数据结构-链表的基本操作实现
- c++实现链表的基本操作
- bzoj3529 [Sdoi2014]数表
- 迭代器的原理和使用
- 关于TTMS影院系统的总结
- AI 1
- windows socket错误码及出错原因
- 链表的基本实现
- android 6.0 power按键深度解析
- MyBatis JdbcType 与Oracle、MySql数据类型对应关系详解作者@loongshawn
- [C++11版]Ubuntu下Json的使用
- HAWQ取代传统数仓实践(十七)——事实表技术之累积度量
- centos samba 挂载
- 数论总结一
- caffe:cmake编译指定glog,gflag路径
- AI 2