数据结构算法C语言实现(二)---2.3线性表的链式表示和实现之单链表
一.简述
【暂无】
二.头文件
#ifndef _2_3_part1_H_
#define _2_3_part1_H_
//2_3_part1.h
/**
author:zhaoyu
email:zhaoyu1995.com@gmail.com
date:2016-6-4
note:realize my textbook <<数据结构(C语言版)>>
*/
//----线性表的单链表存储结构----
/**
My Code
to make the paragram run correctlly
*/
#define ElemType int
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode, *LinkList;
/**
algorithm 2.8
*/
Status GetElem_L(LinkList L, int i, ElemType &e)
{
//L为带头结点的单链表的头指针
//当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR
LinkList p = L->next;
int j = ;//初始化,p指向第一个节点,j为计数器
while (p && j<i)
{//顺指针向后查找,直到p指向第i个元素或p为空
p = p->next;
++j;
}
if (!p || j > i)
{//第i个元素不存在
return ERROR;
}
e = p->data;//取第i个元素
return OK;
}//GetElem_L
//关于指针的引用
/**
algorithm 2.9
*/
Status ListInsert_L(LinkList &L, int i, ElemType e)
{
//在带头结点的单链线性表L中第i个位置之前插入元素
LinkList p = L;
int j = ;
while (p && j < i-)
{//寻找第i-1个节点
p = p->next;
++j;
}
if (!p || j>i-)
{//i小于 1 或大于表长加 1
return ERROR;
}
LinkList s = (LinkList)malloc(sizeof(LNode));
s->data = e;//插入 L 中
s->next = p->next;//注意顺序
p->next = s;
return OK;
}//ListInsert_L /**
algorithm 2.10
*/
Status ListDelete_L(LinkList &L, int i, ElemType &e)
{
//在带头结点的单链线性表L中,删除第 i 个节点,并由 e 返回其值
LinkList p = L;
int j = ;
while (p->next && j < i-)
{//寻找第 i 个节点,并另 p 指向其前驱
p = p->next;
++j;
}
if (!(p->next) || j > i-)
{//删除位置不合理
return ERROR;
}
LinkList q = p->next;
p->next = q->next;//删除并释放节点
e = q->data;
free(q);
return OK;
}//ListDelete_L
/**
algorithm 2.11
从表尾到表头逆向建立单链表的算法
*/
void CreateList_L(LinkList &L, int n)
{
//逆位序输入 n 个元素的值,建立带表头节点的单链线性表 L
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;//先建立一个带头结点的单链表
for (int i = n; i > ; i--)
{
LinkList p = (LinkList)malloc(sizeof(LNode));//生成新节点
scanf("%d", &p->data);//输入元素值
p->next = L->next;
L->next = p;//插入到表头
}
}//CreateList_L
/**
algorithm 2.12
*/
void MergeList_L(LinkList &La, LinkList &Lb, LinkList &Lc)
{
//已知单链线性表 La 和 Lb 的元素按值非递减排列
//归并 La 和 Lb 得到新的单链线性表 Lc,Lc的元素也按值非递减排列
LinkList pa = La->next, pb = Lb->next;
LinkList pc = Lc = La;//用 La 的头结点作为 Lc 的头结点
while (pa && pb)
{
if (pa->data <= pb->data)
{
pc->next = pa;
pc = pa;
pa = pa->next;
}
else
{
pc->next = pb;
pc = pb;
pb = pb->next;
}
}
pc->next = pa ? pa : pb;//插入剩余节点
free(Lb);
}//MergeList_L /**
My Code
*/
void PrintList(LinkList L)
{
LinkList p = L->next;
while (p != NULL)
{
printf("%d\t", p->data);
p = p->next;
}
printf("\n");
}
#endif
三.CPP文件
//2_3_part1.cpp
/**
author:zhaoyu
email:zhaoyu1995.com@gmail.com
date:2016-6-4
note:realize my textbook <<数据结构(C语言版)>>
*/
#include "head.h"
#include "2_3_part1.h"
int main(int argc, char const *argv[])
{
LinkList La, Lb, Lc;
//逆序建表
printf("Create ListA\n");
CreateList_L(La, );
printf("Create ListB\n");
CreateList_L(Lb, );
printf("Print ListA\n");
PrintList(La);
printf("Print ListB\n");
PrintList(Lb);
printf("Insert 7 at location 4 In ListA\n");
ListInsert_L(La, , );
PrintList(La);
printf("Delete 7 at location 3 In ListB\n");
int temp;
ListDelete_L(Lb, , temp);
PrintList(Lb);
printf("%d is deleted\n", temp);
printf("Merge ListA and ListB\n");
MergeList_L(La, Lb, Lc);
PrintList(Lc);
printf("Get element at location 1 2 3 in ListC\n");
int e1, e2, e3;
GetElem_L(Lc,,e1);
GetElem_L(Lc,,e2);
GetElem_L(Lc,,e3);
printf("%d\t%d\t%d\n", e1, e2, e3);
return ;
}
四.测试

数据结构算法C语言实现(二)---2.3线性表的链式表示和实现之单链表的更多相关文章
- 数据结构-线性表的链式存储相关算法(C语言实现)
链表的简单介绍 为什么需要线性链表 当然是为了克服顺序表的缺点,在顺序表中,做插入和删除操作时,需要大量的移动元素,导致效率下降. 线性链表的分类 按照链接方式: 按照实现角度: 线性链表的创建和简单 ...
- 线性表的链式存储C语言版
#include <stdio.h> #include <malloc.h> #define N 10 typedef struct Node { int data; stru ...
- C语言 线性表 双向链式结构 实现
一个双向链式结构实现的线性表 duList (GCC编译). /** * @brief 线性表双向链表结构 * @author wid * @date 2013-10-28 * * @note 若代码 ...
- 线性表的链式存储——C语言实现
SeqList.h #ifndef _WBM_LIST_H_ #define _WBM_LIST_H_ typedef void List; typedef void ListNode; //创建并且 ...
- 数据结构算法C语言实现(二十七)--- 7.2图的遍历
一.简述 栈与队列,DFS与BFS.仅以连接表为例实现. 二.头文件 BFS要用到的头文件 //3_4_part1.h /** author:zhaoyu email:zhaoyu1995.com@g ...
- 数据结构算法C语言实现(二十)--- 6.3.1遍历二叉树
一.简述 二叉树的遍历主要是先序.中序.后序及对应的递归和非递归算法,共3x2=6种,其中后序非递归在实现上稍复杂一些.二叉树的遍历是理解和学习递归及体会栈的工作原理的绝佳工具! 此外,非递归所用的栈 ...
- 数据结构算法C语言实现(十二)--- 3.4循环队列&队列的顺序表示和实现
一.简述 空队列的处理方法:1.另设一个标志位以区别队列是空还是满:2.少用一个元素空间,约定以队列头指针在队尾指针下一位置上作为队列呈满的状态的标志. 二.头文件 //3_4_part1.h /** ...
- 数据结构算法C语言实现(八)--- 3.2栈的应用举例:迷宫求解与表达式求值
一.简介 迷宫求解:类似图的DFS.具体的算法思路可以参考书上的50.51页,不过书上只说了粗略的算法,实现起来还是有很多细节需要注意.大多数只是给了个抽象的名字,甚至参数类型,返回值也没说的很清楚, ...
- 数据结构算法C语言实现(六)---2.4一元多项式的表示及相加
一.简述 利用链表表示稀疏多项式,并基于之前的一些操作(编程实现上还是有所不同的)组合新的操作实现一元多项式的表示及相加. 二.ADT 抽象数据类型一元多项式的定义 ADT Polyomail{ 数据 ...
随机推荐
- 清北学堂2017NOIP冬令营入学测试P4747 D’s problem(d)
时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试题 描述 题目描述 小D是一名魔法师,它最喜欢干的事就是对批判记者了. 这次记者招待会上,记者对 ...
- Theano2.1.11-基础知识之稀疏
来自:http://deeplearning.net/software/theano/tutorial/sparse.html sparse 通常来说,稀疏矩阵可以和常规矩阵一样提供相同的功能.两者不 ...
- 强迫症的福利——我的第一个VS插件,对using排序!
首先来看看VS自带的using整理功能: 长短不一,看着让人生厌!这是哪个门子的整理?越来越乱了好吗! 难道就没有一款,由短到长——金字塔搬的排序方案吗? 于是各种百度: “VS 插件 using排序 ...
- 误人子弟的网络,谈谈HTTP协议中的短轮询、长轮询、长连接和短连接
引言 最近刚到公司不到一个月,正处于熟悉项目和源码的阶段,因此最近经常会看一些源码.在研究一个项目的时候,源码里面用到了HTTP的长轮询.由于之前没太接触过,因此LZ便趁着这个机会,好好了解了一下HT ...
- ASP.NET文件上传大小的限制解决方案
我们大家都知道ASP.NET为我们提供了文件上传服务器控件FileUpload,默认情况下可上传的最大文件为4M,如果要改变可上传文件大小限制,那么我们可以在web.config中的httpRunti ...
- 基于FPGA的电压表与串口通信(上)
实验原理 该实验主要为利用TLC549采集模拟信号,然后将模拟信号的数字量通过串口发送到PC上上位机进行显示,使用到的TLC549驱动模块在进阶实验已经使用到了,串口模块在基础实验也已经使用到了,本实 ...
- ElasticSearch入门系列(七)搜索
一.在之前,我们已经学会了如何使用elasticsearch作为一个简单的NoSql风格的分布式文件存储器--我们可以将一个JSON文档扔给Elasticsearch.也可以根据ID检索他们.但Ela ...
- TouchSlop与VelocityTracker认识
TouchSlop是处理触摸事件中的一个常量,被系统认为滑动和点击事件的临界点.理 解这个touchSlop是一个滑动距离值的常量,也就是说当我们手触摸在屏幕上滑动时,如果滑动距离没有超过touchS ...
- mysql 备份恢复图
http://blog.csdn.net/oldboy8/article/details/8294631
- Shiro 学习笔记(二)——shiro身份验证
身份验证: 在应用中证明他就是他本人.一般上用身份证.用户/密码 来证明. 在shiro中,用户需要提供principals (身份)和credentials(证明)给shiro,从而应用能验证用户身 ...