线性结构的特点是除第一个元素无直接前驱,最后一个元素无直接后继之外,每个数据元素都有一个前驱和后继。
可以想象一下糖葫芦。
线性表的顺序存储(顺序表)的基本定义:
#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;
}