单链表的定义和基本操作
来源:互联网 发布:下载免费打电话软件 编辑:程序博客网 时间:2024/06/05 05:12
链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)访问特定编号的节点则需要O(n)的时间,而顺序表相应的时间复杂度分别是O(logn)和O⑴。
使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。
但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大。在计算机科学中,链表作为一种基础的数据结构可以用来生成其它类型的数据结构。链表通常由一连串节点组成,每个节点包含任意的实例数据(data fields)和一或两个用来指向上一个/或下一个节点的位置的链接("links")。
链表最明显的好处就是,常规数组排列关联项目的方式可能不同于这些数据项目在记忆体或磁盘上顺序,数据的存取往往要在不同的排列顺序中转换。而链表是一种自我指示数据类型,因为它包含指向另一个相同类型的数据的指针(链接)。
以上都是度娘提供的! 下面才是重点!!!
链表允许插入和移除表上任意位置上的节点,但是不允许随机存取。链表有很多种不同的类型:单向链表,双向链表以及循环链表。
今天就写一下单链表的定义和一本操作!
先看一下头文件内容,应该是包含了所有数据结构材料中提供的关于链表的基本操作了,进阶操作将在下一篇文章里进行实现!
#ifndef _LINK_H_#define _LINK_H_#include<stdio.h>#include<stdlib.h>#include<string.h>/*单链表数据域类型定义*/typedef int ElemType;/*单链表结点结构定义*/typedef struct _Node{ElemType data;struct _Node * next;}NODE,*PNODE;/*单链表头结点类型定义*/typedef NODE HEAD,*PHEAD;/*单链表头结点初始化*/int Init(PHEAD *pHead);/*单链表打印*/void Show(PHEAD pHead);/*单链表在头结点后面插入结点*/int Insert_Head(PHEAD pHead,ElemType e);/*单链表尾部插入结点*/int Insert_Tail(PHEAD pHead,ElemType e);/*单链表某结点之后插入结点插入结点*/int Insert_AnyPos(PNODE node,ElemType e);/*单链表某结点之前插入结点插入结点,e不存在则插入在末尾*/int Insert_Previous(PHEAD pHead,ElemType e);/*单链表获得某结点的前驱*/int Get_Prior(PHEAD pHead,PNODE node,PNODE *pre);/*删除指定结点*/int Delete(PHEAD pHead,ElemType e);/*单链表销毁*/int Destory(PHEAD *pHead);/*单链表逆置*/void Reverse(PHEAD pHead);/*单链表排序*/int Sort(PHEAD Sort);#endif
下面就是单链表的基本操作的实现了,基本都没有什么难度,我还是一个字一个字仔细的敲了一遍,并且经过调试验证正确的!
希望能对需要的童鞋有所帮助!
/*功能:单链表的定义和基本操作!姓名:Ben时间:22:46 2014/1/21*/#include"link.h"int Init(PHEAD *pHead){int rv = 0;if(NULL != *pHead){return rv;}*pHead = (PHEAD)malloc(sizeof(HEAD));if(NULL == *pHead){rv = -1;return rv;}memset(*pHead,0,sizeof(HEAD));return rv;}void Show(PHEAD pHead){if(NULL == pHead || NULL == pHead->next){printf("Empty Link!\n");return;}pHead = pHead->next;while(pHead){printf("%d ->",pHead->data);pHead = pHead->next;}printf("NULL \n");return;}int Insert_Head(PHEAD pHead,ElemType e){int rv = 0;if(NULL == pHead){rv = -2;return rv;}PNODE node = NULL;node = (PNODE)malloc(sizeof(NODE));if(node == NULL){rv = -1;return rv;}node->data = e;node->next =pHead->next;pHead->next = node;return rv;}int Insert_Tail(PHEAD pHead,ElemType e){int rv = 0;if(NULL == pHead){rv = -2;return rv;}PNODE node = NULL;node = (PNODE)malloc(sizeof(NODE));if(node == NULL){rv = -1;return rv;}while(pHead->next != NULL){pHead = pHead->next;}node->data = e;node->next = pHead->next;pHead->next = node;return rv;}int Insert_AnyPos(PNODE node,ElemType e){int rv = 0;if(NULL == node){rv = -2;return rv;}PNODE pNode = NULL;pNode = (PNODE)malloc(sizeof(NODE));if(NULL == pNode){rv = -1;return rv;}pNode->data = e;pNode->next = node->next;node->next = pNode;return rv;}int Insert_Previous(PHEAD pHead,ElemType e){int rv = 0;if(NULL == pHead){rv = -2;return rv;}while (pHead->data !=e && pHead->next != NULL){pHead = pHead->next;}PNODE node = NULL;node = (PNODE)malloc(sizeof(NODE));if(node == NULL){rv = -1;return rv;}node->data = e;node->next =pHead->next;pHead->next = node;return rv;}PNODE Get_Prior(PHEAD pHead,PNODE node){if(pHead == NULL || node == NULL){return NULL;}PNODE p = pHead;while(p->next != node && p->next != NULL){p = p->next;}if(p->next == NULL){return NULL;}return p;}int Delete(PHEAD pHead,ElemType e){int rv = 0;if(NULL == pHead){rv = -2;return rv;}while (pHead->next->data !=e && pHead->next != NULL){pHead = pHead->next;}if(NULL == pHead->next){return rv;}else{PNODE tmp = pHead->next;pHead->next = pHead->next->next;free(tmp);tmp = NULL;}return rv;}int Destory(PHEAD *pHead){int rv = 0;if(NULL == *pHead){rv = -2;return rv;}while (NULL != (*pHead)->next){PNODE tmp = (*pHead)->next;(*pHead)->next = (*pHead)->next->next;free(tmp);}free((*pHead));*pHead = NULL;return rv;}void Reverse(PHEAD pHead){if (!pHead || !pHead->next || !pHead->next->next){return;}PNODE p1 =pHead->next;PNODE p2 =p1->next;PNODE p3;p1->next = NULL;while (p2){p3 = p2->next;p2->next = p1;p1 = p2;p2 = p3;}pHead->next = p1;}void Sort(PHEAD pHead){if (!pHead || !pHead->next || !pHead->next->next){return;}PNODE p1 =pHead->next->next;PNODE p2;while (p1){p2 = Get_Prior(pHead,p1);PNODE tmp = p1->next;while (p2 != pHead && p2->data > p1->data){if(p2->next == p1){p2->next = tmp;}p2 = Get_Prior(pHead,p2);}if(p2->next != p1){p1->next = p2->next;p2->next = p1;}p1 = tmp;}}
0 0
- 单链表的定义和基本操作
- 存储过程的定义和基本操作!
- AVL树的定义和基本操作
- 线性表的定义和基本操作
- 树的定义和基本操作
- 数组的定义和基本操作
- 单链表的定义及基本操作
- 字符串定义和基本操作
- memcached的基本操作和简单类定义
- 数据结构复习-线性表的定义和基本操作
- canvas.js定义和提供canvas的基本操作
- 线性表-顺序表和单链表的定义与基本操作
- 类相关定义和SQL基本操作
- 教科书上的单链表定义及基本操作
- 树的定义及基本操作
- 顺序表的定义及基本操作
- 二叉树的定义及基本操作
- 队列的定义及其基本操作
- HDOJ 1241 Oil Deposits
- 重启Tomcat出现这样的错误
- 【脚本练习】shell脚本
- 基于ZeroMQ程序库的分布式存储系统
- 吐槽一下北京创客空间的新年118爬楼梯活动
- 单链表的定义和基本操作
- QT -1: 错误:Qt Creator 需要设置一个编译器来构建。在构建套件选项里设置一个编译器。
- 小白之《研发工程师应聘之路》
- tox and solution for neutron tox error
- 浅谈C中的wprintf和宽字符显示【其实很深】
- SEO新手如何让“伪原创”成为“原创”
- linux awk
- stl_map,set 用法
- OpenGL学习二十七:混合