1. 线性表的顺序表示指用一组地址连续的存储单元依次存取线性表的数据
线性表动态分配顺序存储结构
#define LIST_INIT_SIZE 100
#define LIST_INCREMENT 10
typedef struct
{
ElemType* elem;
int length;
int listsize;
}SqList;
2。 线性表的链式存取结构的特点是用一组任意的存储单元存储线性表的数据(这组存储单元可以是连续的,也可以是不连续的)为了表达某个元素ai和其直接后继元素ai+1之间的
逻辑关系,对于数据ai除了存储其本身的信息外,还存储一个指向其后继元素的信息(即直接后继的位置)。这两部分信息组成数据元素ai的存储影像,成为节点。他包括两个域。
其中存储数据元素信息的域为数据域。存取直接后继位置的域为指针域,指针域存储的信息为指针或链。
-----线性表单链表存储结构------
typedef struct LNode {
ElemType data;
struct LNode * next;
}LNode, *LinkList;
LNode head;
if (head.next == NULL) // 空表
void CreateList ( LinkList & L,int n)
{
L = (LinkList) malloc(sizeof(LNode));
L->next = NULL ; //先建立头结点
for ( int i=0; i<n; i++) {
p = (LinkList) malloc (sizeof(LNode));
scanf(&p->data);
p->next = L->next; //插入表头
L->next = p;
}
}
3.用一维数组描述线性链表
-----线性表静态链表存储结构------
#define MAXSIZE 1000
typdef struct {
ElemType data;
int cur;//游标(指示器)
}componet, SLinkList[MAXSIZE];
假设由终端输入集合元素,先建立表示集合A的静态链表S,而后输入集合B的元素的同时查找S表,弱存在B相同的元素,则从S删除之,否则将元素插入到S。
void InitSpace_SL(SLinkList ( & space )
{
for(i=0 ; i<MAXSIZE; i++;) {
space[i].cur = i+1;
}
space[MAXSIZE-1] = 0;
}
int Malloc_SL(SLinkList & space)
{
//若备用空间链表非空,则返回分配的节点下标,否则返回0.
i = space[0].cur;
if (space[0].cur) space[0].cur = space[i].cur;
return i;
}
void Free_SL(SLinkList & space,int k)
{
//将K的空闲节点回收到备用链表。
space[k].cur = space[0].cur;
space[0].cur = k;
}
4. 循环链表是令一种形式的链式存储结构,他的特点是表中最后一个节点的指针指向头结点,整个链表形成一个环。由次,从表中任一个节点出发都能找到其他节点。
5。双向链表,有2个指针域,其中一个指向后继,另一个指向前驱。
-----线性表双向链表结构-----
typedef struct DulNode{
ElemType data;
struct DulNode * prior ;
struct DulNode *next;
}DulNode,*DuLinkList;
-----带头结点的线性链表------
typedef struct LNode{
ElemType data;
struct LNode * next;
} * Link, *Position;
typdef struct {
Link head,tail;
int len; //指示线性表中元素的个数
}LinkList;
应用 ,一元多项式的表示及相加
typedef struct {
float coef; // 系数
int expn; //指数
} ElemType;
typedef LinkList polynomail;
基本操作的函数原型
void CreatePolyn(polynomail &p ,int m) ; //输入m项的系数和指数,建立一个一元多项式的有序链表P
void DestroyPolyn(polynomail &p);
void PrintPolyn(polynomail &p);
int PolynLength(polynomail &p);
void AddPolyn(polynomail &pa,polynomail &pb);
void SubtractPolyn(polynomail &pa,polynomail &pb);
void MultiPlyPolyn(polynomail &pa,polynomail &pb);
void CreatePolyn(polynomail &p ,int m){
InitList(p); h= GetHead(p);
e.coef = 0.0; e.expn = -1; SetCurElem(h,e); //设置头结点的数据元素
for ( i =0; i<= m; i++) {
scanf(e.coef,e.expn);
if(!LocateElem(p,e,q,(*cmp)())){ //当前链表不存在该数据项
if(MakeNode(s,e)) InsFirst(q,s); //生成结点并插入链表
}
}
}
void AddPolyn(polynomail &pa,polynomail &pb) {
ha = GetHead(pa); hb = GetHead(pb);
qa = NextPos(pa,ha); qb = NextPos(pb,hb);
while( qa && qb) {
a = GetCurElem(qa); b = GetCurElem(qb);
switch(*cmp(a,b)) {
case -1: // 多项式pa中当前结点的指数小
ha = qa; qa = NextPos(pa,qa); break;
case 0: //两者的指数相同
sum = a.coef+b.coef;
if (sum != 0.0) {
SetCurElem(qa,sum}; ha = qa;} // 修改多项式PA当前结点的系数值
else { //删除多项式PA当前结点
DelCurElem(qa,sum); ha = qa;
}
DelFirst(hb,qb); FreeNode(qb); qb = NextPos(pb,hb);
qa = NextPos(pa,ha); break;
case 1: //多项式PB当前结点的指数小
DelFirst(hb,pb); InsFirst(ha,qb);
qb = NextPos(pb,hb); ha = NextPos( pa,ha); break;
} //switch
}//while
if(!Empty(pb)) Append(pa,pb); // 链接pb中剩余的结点
FreeNode(hb); //释放pb的头结点
}