一.简述

  【暂无】

  二.头文件

 #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线性表的链式表示和实现之单链表的更多相关文章

  1. 数据结构-线性表的链式存储相关算法(C语言实现)

    链表的简单介绍 为什么需要线性链表 当然是为了克服顺序表的缺点,在顺序表中,做插入和删除操作时,需要大量的移动元素,导致效率下降. 线性链表的分类 按照链接方式: 按照实现角度: 线性链表的创建和简单 ...

  2. 线性表的链式存储C语言版

    #include <stdio.h> #include <malloc.h> #define N 10 typedef struct Node { int data; stru ...

  3. C语言 线性表 双向链式结构 实现

    一个双向链式结构实现的线性表 duList (GCC编译). /** * @brief 线性表双向链表结构 * @author wid * @date 2013-10-28 * * @note 若代码 ...

  4. 线性表的链式存储——C语言实现

    SeqList.h #ifndef _WBM_LIST_H_ #define _WBM_LIST_H_ typedef void List; typedef void ListNode; //创建并且 ...

  5. 数据结构算法C语言实现(二十七)--- 7.2图的遍历

    一.简述 栈与队列,DFS与BFS.仅以连接表为例实现. 二.头文件 BFS要用到的头文件 //3_4_part1.h /** author:zhaoyu email:zhaoyu1995.com@g ...

  6. 数据结构算法C语言实现(二十)--- 6.3.1遍历二叉树

    一.简述 二叉树的遍历主要是先序.中序.后序及对应的递归和非递归算法,共3x2=6种,其中后序非递归在实现上稍复杂一些.二叉树的遍历是理解和学习递归及体会栈的工作原理的绝佳工具! 此外,非递归所用的栈 ...

  7. 数据结构算法C语言实现(十二)--- 3.4循环队列&队列的顺序表示和实现

    一.简述 空队列的处理方法:1.另设一个标志位以区别队列是空还是满:2.少用一个元素空间,约定以队列头指针在队尾指针下一位置上作为队列呈满的状态的标志. 二.头文件 //3_4_part1.h /** ...

  8. 数据结构算法C语言实现(八)--- 3.2栈的应用举例:迷宫求解与表达式求值

    一.简介 迷宫求解:类似图的DFS.具体的算法思路可以参考书上的50.51页,不过书上只说了粗略的算法,实现起来还是有很多细节需要注意.大多数只是给了个抽象的名字,甚至参数类型,返回值也没说的很清楚, ...

  9. 数据结构算法C语言实现(六)---2.4一元多项式的表示及相加

    一.简述 利用链表表示稀疏多项式,并基于之前的一些操作(编程实现上还是有所不同的)组合新的操作实现一元多项式的表示及相加. 二.ADT 抽象数据类型一元多项式的定义 ADT Polyomail{ 数据 ...

随机推荐

  1. Theano3.4-练习之多层感知机

    来自http://deeplearning.net/tutorial/mlp.html#mlp Multilayer Perceptron note:这部分假设读者已经通读之前的一个练习 Classi ...

  2. infer.net 入门2 用一个侦探故事来讲解,通俗易懂

    The results look OK, but how do you know that you aren’t missing something. Would a more sophisticat ...

  3. 20160220 - JavaScript for OS X Automation 调试技巧

    在JXA代码中加入如下代码后,可使用 Safari Web Inspector 调试: //debugger; 使用 Safari Web Inspector 查看 Array 或 Object 并不 ...

  4. jquery的offset与position的区别

    这里offset取得是屏幕影藏的y轴的距离➕元素距离屏幕的y轴的距离. 而postion取得的则是,上一个父元素(包含postion定位的)的距离

  5. Log4net使用(一)

    LogHelper.cs using NLog; using NLog.Targets; namespace MyProject.Tool.Log { public class LogHelper { ...

  6. C#高级特性_Lambda

    “Lambda 表达式”(lambda expression)是一个匿名函数 省略delegate,甚至省略参数类型: 直接用(参数)=> {语句或表达式} 例如: button1.Click ...

  7. 'hibernate.dialect' must be set when no Connection avalable’

    一个错误'hibernate.dialect' must be set when no Connection avalable ‘ 网上也有不少人遇到这种问题,看上去好像是跟Hibernate的方言有 ...

  8. oracle数据泵实现不同用户之间的导出导入

    来源于:http://www.cnblogs.com/kevinsun/archive/2007/02/03/638803.aspx http://blog.sina.com.cn/s/blog_68 ...

  9. [Mindjet MindManager]思维导图的快捷键操作

    来源于:http://www.cnblogs.com/whylaughing/p/5530935.html Mindjet MindManager(思维导图) 快捷键如下: Insert or CTR ...

  10. 转 漫谈linux文件IO

    在Linux 开发中,有几个关系到性能的东西,技术人员非常关注:进程,CPU,MEM,网络IO,磁盘IO.本篇文件打算详细全面,深入浅出.剖析文件IO的细节.从多个角度探索如何提高IO性能.本文尽量用 ...