线性表相关读书笔记

原创 2016年09月03日 09:05:55

在单链表中,假设每个节点的类型用LinkList表示,它应包括存储元素的数据域,这里用data表示,其类型用通用类型标识符ElemeType表示,还包括存储直接后继节点位置的指针域,这里用next表示。
LinkList类型的定义如下:

typedef struct LNode    //定义单链表节点类型
{
    ElemeType data;    //数据域
    struct LNode *next;//指向直接后继节点   
}LinkList;

对于双链表,采用类似的定义

typedef struct DNode    //定义单链表节点类型
{
    ElemeType data;    //数据域
    struct DNode *prior;//指向直接前驱节点  
    struct DNode *next;//指向直接后继节点   
}DLinkList;

两种方式建立单链表

  • 头插法建表
    该方法从一个空表开始,读取字符数组a中的字符,生成新节点,将读取的数据存放到新节点的数据域中,然后将新节点插入到当前链表的表头上,知道字符数组a的所有元素读取完为止。
    代码如下
void CreatListF(LinkList *L,ElemType a[],int n){
    LinkList *s; int i;
    L = (LinkList *)malloc(sizeof(LinkList));//创建头结点
    L->next = NULL;
        for (i = 0;i<n;i++){
        s = (LinkList *)malloc(sizeof(LinkList));
        s->data = a[i];
        s->next = L->next;//将s插在原开始节点之前,头结点之后。
        L->next =s;
}
}
算法时间复杂度为O(n)。
**注:**头插法生成的链表中结点的次序和原数组元素的顺序相反。
  • 尾插法建表
    将新节点查到当前链表的表尾上,为此必须增加一个尾指针r,使其始终指向当前链表的尾结点。
void CreatListR(LinkList *L,ElemType a[],int n){
    LinkList *s,r; int i;
    L = (LinkList *)malloc(sizeof(LinkList));//创建头结点
    r = L;
        for (i = 0;i<n;i++){
        s = (LinkList *)malloc(sizeof(LinkList));
        s->data = a[i];
        r->next = s;
        r= s;
}
    r->next= NULL;
}
算法的时间复杂度为O(n);
  • 链表习题

练习一:
有一个带头结点的单链表L= {a1,b1,a2,b2,…,an,bn},设计一个算法将其拆分成两个带头结点的单链表L1和L2,L1={a1,a2,…an},L2 ={bn,bn-1,…,b1}。要求L1使用L的头结点。
解法:利用原单链表L中的所有结点,采用尾插法建立单链表L1,采用头插法建立单链表L2。
代码如下:

void split(LickList *L,LickList *L1, LickList *L2){
    LickList *p = L->next,*q,*r1;
    L1 = L;
    r1 = L1;
    L2 = (LickList *)malloc(sizeof(LickList));//创建L2的头结点
    L2->next = NULL;
    while(p !=NULL){
    q = p->next;
    r1->next = p;  //尾插法将P插入L1中
    r1 =p ;
    p = q->next;  
    q->next = L2->next;  //头插发将q插入L2中
    L2->next = q;
}
r1->next = NULL;
}

练习二:
有一个带头节点的单链表L,设计一个算法使其元素递增有序排列。
解法:若元单链表中有一个或以上的数据节点,先构造只含一个数据节点的有序表(只含一个数据节点的单链表一定是有序表)。扫描原单链表余下的节点 *p(知道p==NULL),在有序表中通过比较插入(直接插入法)。
代码如下:

void sort(LinkList *L){
    LinkList *p = L->next,*q,*r;
    if(p!=NULL){
    r = p->next;
    p ->next = NULL;      //构造只含一个数据节点的有序表
    p = r;
    while(p!=NULL){
    r = p->next;
    q = L;
    while(q ->next !=NULL &&q->next-data < p->data)
    q = q ->next;
    p ->next = q->next;
    q->next = p;
    p = r;
}
}
}

持续更新相关题库······

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

数据结构(严蔚敏、吴伟民)——读书笔记-2、 线性表及其基本运算、顺序存储结构

第二章   线性表 2.1    线性表及其基本运算 2.2    线性表的顺序存储结构 2.3    线性表的链式存储结构 1、线性表:是n个数据元素的有限序列。 直接前驱元...

数据结构(C语言描述)读书笔记之线性表1

线性表是具有相同属性的数据元素的一个有限序列。    线性表的存储结构有顺序、链接、索引、散列等多种方式。    以下代码展现的是顺序存储下线性表的操作实现      类型定义:      str...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

《数据结构教程(第四版)》读书笔记-第二章 线性表

线性表:具有相同特性的数据元素的一个有限序列。线性表的长度为n。一对一结构。线性表的顺序存储结构——顺序表 物理结构上连续。线性表的链式存储结构——链表 用一组任意的存储单元存放数据元素。可以连续...

数据结构(C语言描述)读书笔记之线性表2

上一篇写了线性表的顺序存储的一些方法,下面写一下单链表的写法.单链表主要是通过一个指针来链接表中的各个要素,它的结构如下所示。      typedef int ElemType;      st...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)