数据结构算法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{ 数据 ...
随机推荐
- Asp.net,C# 纯数字加密解密字符串
也就是说加密后的数据不再是:N8lAaHMFtSAQgaf3+RUFng== 希望encryptedString是"1203877893704809384098328409234923840 ...
- 实时监控log文件
一个进程在运行,并在不断的写log,你需要实时监控log文件的更新(一般是debug时用),怎么办,不断的打开,关闭文件吗? 不用,至少有两个方法,来自两个很常用的命令: tail -f log.tx ...
- 仿各种APP将文章DOM转JSON并在APP中以列表显示(android、ios、php已开源)
背景 一直以来都想实现类似新闻客户端.鲜城等文章型app的正文显示,即在web editor下编辑后存为json,在app中解析json并显示正文. 网上搜过,没找到轮子.都是给的思路,然后告知是公司 ...
- variable-precision SWAR算法介绍
BITCOUNT命令是统计一个位数组中非0进制位的数量,数学上称作:”Hanmming Weight“ 目前效率最好的为variable-precision SWAR算法,可以常数时间内计算出多个字节 ...
- js正则表单验证汇总,邮箱验证,日期验证,电话号码验证,url验证,信用卡验证,qq验证
本文主要汇总各种正则验证,很多都是转载,本人也会尽可能验证准确性,如有错误欢迎留言 //trim()方法在有些浏览器中不兼容,最好自己重写一下 String.prototype.trim=functi ...
- Uwp Windows10获取设备位置(经纬度)
先在Package.appxmanifest中配置位置权限 2. 创建LocationManager类 using System; using System.Collections.Generic; ...
- MySql_SQLyog快捷键
1. SQL格式化 F12 格式化当前行所在的SQL Ctrl+F12 格式化选中的SQL Shift+F12 格式化所有SQL 2. 窗口操作 Ctrl+T 打开一个新的查询窗口 Alt+ ...
- 2016年第2周读书笔记与工作笔记 scrollIntoView()与datalist元素
这一周主要是看了html5网页开发实例与javascript 高级程序设计,供以后翻阅查找. html5网页开发实例第1章与第二章的2.1部分: 第1章内容: html5在w3c的发展史. 浏览器的 ...
- NPOI导入,导出
概述 NPOI 是 POI 项目的 .NET 版本.POI是一个开源的Java读写Excel.WORD等微软OLE2组件文档的项目.NPOI 可以在没有安装 Office 或者相应环境的机器上对 WO ...
- editplus-使用正则表达式替换每行首字母和尾字母
打开EditPlus,输入多行数据,快捷键ctrl+h 打开替换窗口,选择“正则表达式”替换 行首批量添加 查找"^" 替换为“我是行首aaa” 行尾批量添加 查找&quo ...