数据结构算法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{ 数据 ...
随机推荐
- Spring 4.0.2 学习笔记(2) - 自动注入及properties文件的使用
接上一篇继续, 学习了基本的注入使用后,可能有人会跟我一样觉得有点不爽,Programmer的每个Field,至少要有一个setter,这样spring配置文件中才能用<property> ...
- 使用EasyUI布局时出现混乱瞬间的解决方法
在所有form代码之前加遮罩层 <div id='PageLoadingTip' style="position: absolute; z-index: 1000; top: 0px; ...
- SQLServer(MSSQL)、MySQL、SQLite、Access相互迁移转换工具 DB2DB v1.2
最近公司有一个项目,需要把原来的系统从 MSSQL 升迁到阿里云RDS(MySQL)上面.为便于测试,所以需要把原来系统的所有数据表以及测试数据转换到 MySQL 上面.在百度上找了很多方法,有通过微 ...
- Java:注解(元数据)
初识Java注解 所谓的元数据是指用来描述数据的数据,可能刚听到元数据的时候你会有点陌生,其实任何一个使用过struts或者hibernate的开发人员都在不知不觉中使用元数据,更通俗一点来说元数据是 ...
- JavaScript 总结几个提高性能知识点
前段时间花时间看了大半的<High Performance JavaScript>这本书啊,然后就开始忙项目了,庆幸最忙的一周已经熬过去了.由于空不出时间,这个月写的学习笔记也不多,忙完最 ...
- RHEL每天定时备份Oracle
步骤: (1)创建脚本文件bak_112.sh,内容如下(自动按当前日期备份数据库): #!/bin/sh export ORACLE_BASE=/u01/app/oracle; ORACLE_HOM ...
- MEF
详情见链接:http://www.cnblogs.com/comsokey/p/MEF1.html#top
- Python 一些总结和比较
数据类型
- git介绍
简介:Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目.Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件.Git ...
- (01)javascript 数据类型
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...