数据结构复习-线性表

a.逻辑结构(略)

 b.存储结构

         顺序表:把线性表数据元素按其逻辑次序,依次存储在一组地址连续的存储单元中。

         存储特点:逻辑上相邻,物理上也相邻;可随机访问;插入删除等操作要移动大量元素

         存储结构两种格式:动态分配存储:由基地址elem指针,length,listsize,注意内在关系

                                               静态分配存储:data数组,length

 

示例:

/*顺序线性表*/ struct Sqlist { int data[20]; int length; };

链式存储:注意有带头结点的

         存储特点:逻辑上相邻,物理上可以不相邻;表中元素只能顺序访问;插入、删除秩序修改指针而不需修改移动元素;存储空间利用率高;表的容量可以动态变化

  示例:

/*链式线性表*/ struct LNode { int data; struct LNode *next; };

 比较:空间:如果长度变化不大,宜采用顺序表

              时间:多插入操作,宜采用链表;

 

 c.技巧和操作

         1.双向搜索 顺序表

/*双向搜索*/ void IntMode(struct Sqlist &L) { int i = 0; int j = L.length - 1; int temp; while(i < j) { while(L.data[i] < 0) i++; while(L.data[j] > 0) j--; if(i < j) { temp = L.data[i]; L.data[i] = L.data[j]; L.data[j] = temp; } } }

         2.顺序表逆置算法  双向推进,前后交换

         3.带头结点  

  4.链表操作,要准备的变量:有头指针head,临时扫描指针p,用来临时保存的指针q

         5.链表逆置 前插算法

前插算法:这里是把递增有序链表LA、LB合并成LC,其中LC为递减

/*前插操作*/ void Link_MergeDown(LNode *&LA,LNode *&LB,LNode *&LC) { LNode *pa,*pb,*q; /*指向两个链表*/ pa = LA->next; pb = LB->next; LC = LA; LC->next = NULL; /*比较,插入小值*/ while(pa!=NULL && pb!=NULL) { if(pa->data < pb->data) { q = pa->next; //保存断点处 /*前插*/ pa->next=LC->next; LC->next = pa; pa = q; //从断点处继续 } else { q = pb->next; //保存断点处 /*前插*/ pb->next=LC->next; LC->next = pb; pb = q; //从断点处继续 } } /*插入剩余的*/ if(pb == NULL) //将pb指向还有剩余节点的链表 pb = pa; while(pb!=NULL) { q = pb->next; //保存断点处 /*前插*/ pb->next=LC->next; LC->next = pb; pb = q; //从断点处继续 } }

         6.逐个前移法,顺序表中比较、删除元素的高效方法

 示例:/*逐个前移*/ void Sq_MulDelete(Sqlist &L) { int i=0,j=1; while(j < L.length) { /*不相同的话*/ if(L.data[i] != L.data[j]) { i++; L.data[i] = L.data[j]; } j++; //相同的元素跳移指针 } L.length = i+1; }

你可能感兴趣的:(数据结构,算法,struct,null,存储)