[计算机软件及应用]数据结构c++_顺序表_单链表。.ppt

[计算机软件及应用]数据结构c++_顺序表_单链表。.ppt

[计算机软件及应用]数据结构c_顺序表_单链表。

算法设计一 2. 删除算法: 参数: L , i , j , e 算法步骤: (1) 参数 i 、 j 的合理性及 i 表非空检测; (2) e = L.S[ L.F[i]+j-1 ]; (3) if ( j (L.R[i]-L.F[i]+1)/2 ){ i表左部元素往右移动一位; L.F[i]++; } else { i表右部元素往左移动一位; L.R[i]--; } 算法设计一 3. 初始空表算法: 参数: L 算法步骤:置所有表的 F 为 1 、R 为 0 。 InitNList( NList L){ for( i=1 ;i=N;i++) { L.F[i]=1;L.R[i]=0;} } 4. 打印 S , F, R printNList( Nlist L){ for(i=1;i=N;i++) printf(“%3d, %3d ” , L.F[i],L.R[i]); for(i=1;i=M,i++) printf(“%3d”, L.S[i]); } 算法设计二 表与表之间不允许出现空隙 1. 插入算法: 参数: L , i , j , e 算法步骤: (1) 参数 i 、 j 的合理性检测; (2) if (L.R[N]+1L.F[N+1]){ 从插入位置到L.R[n]的数据块往右移动; 插入数据元素 e ; L.R[i]++; i表后的所有线性表的 F 和 R都加 1; } else 没有存储空间,不能插入。 算法设计二 2. 删除算法: 参数: L , i , j , e 算法步骤: (1) 参数 i 、 j 的合理性及 i 表非空检测; (2) e = L.S[ L.F[i]+j-1 ]; (3) 从L.F[i]+j到L.R[N]的数据块往左移动; L.R[i]--; i 表后的所有表的F、R都减 1 。 1.已知线性表中的元素以值递增有序排列,并以单链表作存储结构。试写一算法,删除表中所有值大于mink且小于maxk的元素(若表中存在这样的元素),并分析你的算法的时间复杂度(注意:mink和 maxk是给定的两个参变量,它们的值为任意的整数)。 2.同上题条件,试写一算法,删除表中所有值相同的多余元素(使得运算后的线性表中所有元素的值不相同),并分析你的算法的时间复杂度。 3. 假设有一个循环链表的长度大于 1,且表中既无头结点也无头指针。已知 s 为指向链表中某结点的指针,试编写算法在链表中删除指针s所指结点的前驱结点。 单链表算法作业 4. 假设有一个单向循环链表,其结点含三个域:pre, data 和 next,其中data为数据域,next为指针域,其值为后继结点的地址,pre也为指针域,它的值为空(NULL),试编写算法将此链表改为双向循环链表。 5.已知由单链表表示的线性表中含有三类字符的数据元素(如:字母字符、数字字符和其它字符),试编写算法构造三个以循环链表表示的线性表,使每个表中只含同一类的字符,且利用原表中的结点空间作为这三个表的存储空间,头结点可另辟空间。 * * 问题:线性表中,哪些元素没有前驱?哪些元素没有后继? a3 有几个前驱?有几个后继? * * 双向链表可用C++描述如下: class dblink { public: elemtype data; //结点的数据域,类型设定为elemtype dblink *next , *prior; //定义指向直接后继和直接前驱的指针 void dbinsert(dulink *head , elemtype x , elemtype y); //插入函数 …… //其他成员函数定义及实现

文档评论(0)

1亿VIP精品文档

相关文档