设为首页 加入收藏

TOP

动态分配的顺序线性表的十五种操作―C语言实现(二)
2014-11-23 19:22:20 来源: 作者: 【 】 浏览:46
Tags:动态 分配 顺序 线性 十五 操作 语言 实现
译报错!常量不能作为左值出现,来提醒自己
复制代码
1 //4、求长度操作,若线性表已经存在,则返回表L中元素个数
2 int ListLength(SqList L)
3 {
4 if (L.elem)
5 {
6 return L.length;
7 }
8 puts("表不存在,无法求长度!");
9 return 0;
10 }
复制代码
复制代码
1 //5、定位操作:线性表 L 已存在,返回 L 中第 1 个与 e 满足相等关系的元素位置。
2 int LocateElem(SqList L, int e)
3 {
4 int i;//定位
5 for (i = 0; i < L.length; i++)
6 {
7 //数组名本身就是数组的首地址
8 if (e == L.elem[i] && i < L.length)
9 {
10 printf("定位成功,该元素的位置 = %d\n", i + 1);
11 return i + 1;
12 }
13 }
14 puts("定位失败!没有找到该元素");
15 return 0;
16 }
复制代码
个人觉得因为已经有初始化操作和判空操作,则其余函数不用再写判断表存在否的语句
c的数组下标从0开始,但是还是习惯1对应第一个数据元素,以此类推……
1、定位算法的时间复杂度分析
假设表长为n
最好的情况,如果第一个元素就满足关系,那么时间复杂度为0(1)
最坏的情况,如果最后一个元素满足关系或者没有满足关系的(依然还是比较了),时间复杂度为0(n)
2、算法平均时间复杂度:
显然是和表长成正比的,为0(n)
复制代码
1 //6、求元素后继,线性表 L 已存在。若 cur_e是 L 中的元素,返回后继
2 void NextElem(SqList L, int cur_e)
3 {
4 int i = LocateElem(L, cur_e);//先定位参照元素的位置
5
6 if (0 != i)
7 {
8 if (i == L.length)
9 {
10 puts("这是最后一个元素,没有后继!");
11 }
12 else
13 {
14 printf("%d的后继是%d\n", L.elem[i - 1], L.elem[i]);
15 }
16 }
17 else
18 {
19 puts("表中没有这个元素!");
20 }
21 }
复制代码
注意:区分数组角度看问题和用户角度看问题,表长范围等不要混淆。
复制代码
1 //7、得到指定的元素值,线性表 L 已存在, e 返回 L 中第 i 个元素的值。
2 int GetElem(SqList L, int i, int e)
3 {
4 if (i < 1 || i > L.length)
5 {
6 puts("超出了查找范围,重新输入!");
7 return 0;
8 }
9 e = L.elem[i - 1];
10 return e;
11 }
复制代码
这里没有打印,只是返回了值,不太好,因为出现了一个问题,函数内部的e是局部变量,且是值传递参数类型,函数执行完毕,e的内存消失,不再起作用,对实参没有影响。在函数外打印e的值得不到正确值
复制代码
1 int GetElem(SqList L, int i, int *e)
2 {
3 if (i < 1 || i > L.length)
4 {
5 puts("超出了查找范围,重新输入!");
6 return 0;
7 }
8 *e = L.elem[i - 1];
9 printf("%d\n", *e);
10 return *e;
11 }
复制代码
改进:或者增加函数内的打印语句,或者把e变为指针类型的变量,可以修改实参,相应的声明里也要修改!
复制代码
1 /8、求元素前驱,线性表L已经存在,若cur_e是L的数据,则返回前驱
2 void PriorElem(SqList L, int cur_e)
3 {
4 int i = LocateElem(L, cur_e);//如果定位失败返回0
5
6 if (0 != i)
7 {
8 if (1 == i)
9 {
10 puts("这是第一个元素,没有前驱!");
11 }
12 else
13 {
14 printf("找到了%d的前驱%d \n", L.elem[i - 1], L.elem[i - 2]);
15 }
16 }
17 else
18 {
19 puts("找不到这个元素!");
20 }
21 }
复制代码
注意一下: L.elem[i - 1]和 L.elem[i - 2]与i的关系
复制代码
1 //9、遍历表中元素,线性表 L 已存在,打印出表中每个元素
2 void ListTraverse(SqList L)
3 {
4 int i;
5
6 for (i = 0; i < L.length; i++)
7 {
8 printf("%5d", L.elem[i]);
9 }
10
11 }
复制代码
%5d,宽度为5打印输出
复制代码
1 /************************************************************************/
2 /* 第四类:加工型操作 */
3 /************************************************************************/
4
5 //10、把表清空(不释放内存),线性表 L 已存在,将 L 重置为空表。
6 void ClearList(SqList *L)
7 {
8 if (L->elem)
9 {
10 L->length = 0;//顺序表置空,表长为0即可
11 }
12 }
复制代码
和销毁内存区分
复制代码
1 //11、给表元素赋值,线性表 L 已存在,1≤i≤LengthList(L)
2 //L 中第 i 个元素赋值为 e
3 void PutElem(SqList *L, int i, int e )
4 {
5 if (i < 1 || i > L->length)
6 {
7 puts("超出
首页 上一页 1 2 3 4 5 下一页 尾页 2/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C开发者眼中的SICP学习 下一篇Objective-C KVC 自动转换类型研究

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: