创建动态链表的三种算法(C语言实现)——正向、逆向、递归
来源:互联网 发布:windows无法检索有关 编辑:程序博客网 时间:2024/06/08 14:32
链表分为静态链表和动态链表,本文主要讨论动态链表的创建。
静态链表是用两个数组模拟一个链表,其中一个数组中存实际数据,可以称之为数据数组。另一个数组中存数据数组中各元素的下标,我们称之为地址数组(注意地址数组中存的并不是地址值,而是整形的数)。静态数组的好处是避免了指针的操作,不足之处是占用了较多的存储空间。
静态链表不是本文讨论的重点,下面主要列出创建动态链表的三个常用算法,这里链表结点中的数据域以一个int型的数据为例。此外,本文只是说明创建链表的方法,创建成功之后无法再次在链表中加入结点。
创建链表的方法大致有三种:
1.正向创建链表:最容易理解,即为每次在链表末尾插入一个结点。
2.逆向创建链表:即为每次在原链表的头结点之前插入一个结点。
3.递归创建链表:递归创建链表的特点在于,递归调用时申请空间并对数据域赋值,递归返回时挂链。所以创建出来的是一个逆向的链表。
#include <stdio.h>#include <stdlib.h>typedef struct Node{int data;struct Node *next;}ElemSN;ElemSN* CreatLink1(int data[],int n);//正向(尾插法)创建无表头链表ElemSN* CreatLink2(int data[],int n);//逆向(头插法)创建无表头链表ElemSN* CreatLink3(int data[],int n);//递归法创建链表void PrintLinkEnum();void PrintLink(ElemSN *h);//正向输出链表的数据int main(void){ElemSN *head1=NULL,*head2=NULL,*head3=NULL;int data[8]={3,2,5,8,4,7,6,9};head1=CreatLink1(data,8);//正向(尾插法)创建无表头链表PrintLink(head1);head2=CreatLink2(data,8);//逆向(头插法)创建无表头链表PrintLink(head2);head3=CreatLink3(data,8);//递归法创建链表PrintLink(head3);return 0;}ElemSN* CreatLink1(int data[],int n)//正向(尾插法)创建无表头链表{ElemSN *h=NULL,*p=NULL,*t=NULL;int i;for(i=0;i<n;i++){p=(ElemSN *)malloc(sizeof(ElemSN));p->data=data[i];p->next=NULL;if(h==NULL){t=h=p;}t=t->next=p;}return h;}ElemSN* CreatLink2(int data[],int n)//逆向(头插法)创建无表头链表 {ElemSN *h=NULL,*p=NULL;int i;for(i=n-1;i>=0;i--){h=(ElemSN *)malloc(sizeof(ElemSN));h->data=data[i];if(!h){//if(h==NULL)p=h;h->next=NULL;}h->next=p;p=h;}return h;}ElemSN* CreatLink3(int data[],int n)//递归法创建链表{ElemSN *p=NULL;if(n>0){p=(ElemSN *)malloc(sizeof(ElemSN));p->next=CreatLink3(data,n-1);p->data=data[n-1];}return p;}void PrintLink(ElemSN *h)//正向输出链表的数据 {ElemSN *p=NULL;for(p=h;p!=NULL;p=p->next){printf("%4d",p->data);}printf("\n链表输出结束!\n");}
阅读全文
0 0
- 创建动态链表的三种算法(C语言实现)——正向、逆向、递归
- 自己动手写分词引擎——逆向最大、正向最大、双向最大分词算法的实现
- c语言用尾递归实现单向链表的逆向排列
- CRC32 逆向算法的C语言实现
- c语言实现顺序二叉树的非递归的三种遍历算法
- C语言创建单向链表之正向建链
- 组合算法的实现,递归,C语言
- C语言正向链表栈的实现
- 数据结构和算法C语言实现:链表的实现(基于动态内存分配)
- C语言实现线性结构创建动态链表的学习心得(一)
- 汉诺塔算法——C语言递归实现
- 第三篇:汉诺塔算法——C语言递归实现
- C语言实现递归算法
- 递归算法——Hanoi(汉诺)问题(Java实现&C语言实现)
- C语言 ----- 动态栈的算法实现
- C语言创建单向链表之逆向建链
- 十进制与字符串的转换,正向和逆向互转-C语言学习笔记2
- 二叉树(二)——三种遍历算法的非递归实现(java版)
- Unity中Lerp与SmoothDamp函数使用误区浅析
- 脱氧核糖核酸(DNA)由两条互补的碱基链以双螺旋的方式结合而成
- CTF常见题型
- Eclipse无法查看jdk源码解决方法
- ionic项目实战-小白踩坑走起
- 创建动态链表的三种算法(C语言实现)——正向、逆向、递归
- 【Swift4.0】集合类型-Array
- Node.Js Path模块
- eclipse安装TestNG后在view中不显示TestNG的解决方法
- 怎么根据进程名字杀死进程
- Docker-Gitlab 安装部署笔记
- maven工程:spring+jpa(hhibernate)(cxf服务端配置文件代码)
- 自动化ui automator 按键自定义时长长按的实现
- HDU 逃离迷宫