线性表相关读书笔记

在单链表中,假设每个节点的类型用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;
}
}
}

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

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/vistadk/article/details/52384192
文章标签: 单链表 线性表
个人分类: 数据结构
想对作者说点什么? 我来说一句

数据结构之线性表基础与实现c++

2018年04月05日 452KB 下载

http权威指南 读书笔记

2018年05月29日 1.97MB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭