数据结构2:线性表

线性结构的特点是除第一个元素无直接前驱,最后一个元素无直接后继之外,每个数据元素都有一个前驱和后继。

可以想象一下糖葫芦。

线性表的顺序存储(顺序表)的基本定义:

#include<stdio.h>
#include<iostream>
using namespace std;
#define MAXSIZE 100  //一般元素个数不超过100,所以最大值定义为100
typedef struct
{
    ElemType *elem; //存储空间的基地址,也就是第一个元素存储的地址,可以理解为数组名。
    int length;//当前长度
}Sqlist;
int main()
{
    ....
}

线性表顺序存储也就是顺序表,可理解为数组。

顺序表的初始化:构造一个空的顺序表。

#include<stdio.h>
#include<iostream>
using namespace std;
#define MAXSIZE 100  //一般元素个数不超过100,所以最大值定义为100
typedef struct      
{
    ElemType *elem; //存储空间的基地址,也就是第一个元素存储的地址,可以理解为数组名。
    int length;//当前长度
}Sqlist;

int InitList(SqList &L)      //初始化      // & 是C++中的 引用 操作符 
{
    L.elem=new ElemType[MAXSIZE];  //用new给L.elem分配了相当于ElemType[MAXSIZE]一样大的空间.
    if(!L.elem) exit(0)
    L.length=0;
    return 1;
}

int main()
{
    Sqlist L; 
    InitList(L); // 给L.elem分配空间。
    ...
}

new函数用法: 动态分配空间, 分配的空间大小是 new 后面给出的数据的大小; 

 &: 相当于 *  但是比指针更加方便,可以直接用&来调用某个数据。比如  SqList &L, 就是可以直接对L进行操作。

线性表的链式存储:

单链表的定义:

#include<stdio.h>
#include<iostream>
using namespace std;
typedef struct LNode
{
    Elemtype data;   // 数据域
    struct LNode *next; //指针域    
}LNode,*LinkList;   // *Linklist 是指向LNode类型的指针。

单链表采用了递归定义,因为指针域所指向的类型就是单链表的一个结点。

 

单链表就是用指针将这样一个个相同的结点链接起来,为了方面操作,额外定义一个头指针,指向头结点。

下面的内容可以很轻松的让你理解数组和链表   摘自 《算法详解》:

 

 

 

 

 

 

 


线性表的基本操作有:插入,删除,合并,排序,查找。 所有复杂的操作都是由这些基本的操作组合成的。

下面只给出一个样例:

例:合并两个的单链表:

将两个递增的有序链表合并为一个递增的有序链表。要求结果链表仍使用原来两个链表的空间,不另外占用其他的存储空间,表中允许有重复的数据。

int MergeList(LinkList &LA,LinkList &LB,LinkList &LC)

{
    LinkList pa,pb,pc;
    pa=LA->next;
    pb=LB->next;
    pc=LA;  //以LA作为新链表的头指针
    while(pa&&pb){
        if(pa->data>pb->data){
            pc->next=pa->data;
            pc=pa;
            pa=pa->next;
        }

        if(pa->data<=pb->data){
        
            pc->next=pb->next;
            pc=pb;
            pb=pb->next;
        }
    }
    pc->next=pa?pa:pb;
    delete LB;
    return 1;
}

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值