一.简述

  【暂无】

  二.头文件

 #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. 无法连接windows虚拟机oracle的解决办法

    在mac机上玩基于oracle db的开发真心不容易,oracle公司死活不出oracle express edition for mac OS,曾经发布过的oracle 10 for mac下载地址 ...

  2. 继续node爬虫 — 百行代码自制自动AC机器人日解千题攻占HDOJ

    前言 不说话,先猛戳 Ranklist 看我排名. 这是用 node 自动刷题大概半天的 "战绩",本文就来为大家简单讲解下如何用 node 做一个 "自动AC机&quo ...

  3. <实训|第十一天>学习一下linux中的进程,文件查找,文件压缩与IO重定向

    [root@localhost~]#序言 在今后的工作中,运维工程师每天的例行事务就是使用free -m,top,uptime,df -h...每天都要检查一下服务器,看看是否出现异常.那么今天我们就 ...

  4. JavaScript中的类型转换(一)

    前言 JavaScript是一种非常灵活的弱类型的语言,它的灵活性的一方面体现在其繁杂多样的类型转换.比如当JavaScript期望使用一个布尔值的时候(比如if语句中)你可以提供任一类型的值,Jav ...

  5. 为什么我们的web前端变的越来越复杂

    前端发展了也有些年头了,曾记得很多年前,聊起前端,都觉得是很简单,那个时候都没有前端工程师这个职位.可现在,前端已经逆袭了,已经不是原来的样子了,各种技术层出不穷,显的越来越高深莫测了.前端真的变得那 ...

  6. 在线程中调用SaveFileDialog

    在多线程编程中,有时候可能需要在单独线程中执行某些操作.例如,调用SaveFileDialog类保存文件.首先,我们在Main方法中创建了一个新线程,并将其指向要执行的委托SaveFileAsyn.在 ...

  7. 外网不能访问部署在虚机的NodeJs网站(80端口)

    外网能访问部署在虚机的NodeJs网站需注意如下: 在管理门户上配置端点(Http 80->80) 在虚机中的防火墙入站规则中增加应用程序Node.exe的允许规则 启动NodeJs的侦听进程时 ...

  8. C# 控制台程序实现 Ctrl + V 粘贴功能

    代码主要分为两部分,首先调用系统API注册剪切板相关的事件,然后监控用户的按键操作.完整代码如下: class ClipBoard { [DllImport("user32.dll" ...

  9. Css-自适应高度修复(高度随内容而自动撑高)

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  10. 我的一个小作品 android App ---校园资讯助手

        软件主界面采用Fragment+ViewPager组成.在点开后将会自动对学校新闻页面使用URl类来抓取,然后对网页中的信息提取,使用WebView来loadData在主界面上面显示, 为了使 ...