2.10 指出以下算法中的错误和低效(即费时)之处,并将它改写为一个既正确又高效的算法。

SqList.h

typedef struct{

ElemType * elem; //存储空间基址

int length; //当前长度

int list; //当前分配的存储容量

}SqList;

void InitList(SqList &a)

{ //初始化线性表

a.list=listlength;

a.elem=(ElemType*)malloc(a.list*sizeof(SqList));

if(a.elem==NULL)

{

printf("初始化失败");

exit(1);

}

a.length=0;

}

void ClearList(SqList &a)

{ //清除线性表

if(a.elem!=NULL)

{

free(a.elem);

a.elem=NULL;

}

a.length=0;

a.list=0;

}

int LengthList(SqList a)

{ //求线性表长度

return a.length;

}

bool InsertList(SqList &a, ElemType item, int pos)

{ //按给定条件pos向线性表插入一个元素

if(posa.length+1)

{

printf("pos输入错误\n");

return false;

}

int i;

if(pos==0)

{

for(i=0;i

if(a.elem[i]>item)

break;

pos=i+1;

}

else if(pos==-1)

pos=a.length+1;

if(a.length==a.list)

{

a.elem=(ElemType*)realloc(a.elem,2*a.list*sizeof(ElemType));

if(a.elem==NULL)

{

printf("空间分配失败\n");

exit(1);

}

a.list*=2;

}

for(i=a.list-1;i>=pos-1;i--)

a.elem[i+1]=a.elem[i];

a.elem[pos-1]=item;

a.length++;

return true;

}

ElemType GetList(SqList L, int pos)

{ //在线性表L中求序号为pos的元素,该元素作为函数值返回

if(pos<1||pos>L.length)

{

printf("pos输入错误\n");

exit(1);

}

return L.elem[pos-1];

}

Status DeleteK(SqList&a,int i,int k){

//本过程从顺序存储结构的线性表a中删除第i个元素起的k个元素

//注意i的编号从0开始

int j;

if(i<0||k<0||i+k-1>a.length) return INFEASIBLE;

//参数不合法,原题条件i+k>a.length改为i+k-1>a.length

while(i+k<=a.length)

{

a.elem[i-1]=a.elem[i+k-1];i++;

}

a.length=a.length-k;

return OK;

}

main.cpp

#define LIST_INIT_SIZE 100

#define LISTINCREMENT 10

#define INFEASIBLE -1

#define OK 1

#define listlength 10

typedef int ElemType;

typedef int Status;

#include

#include

#include"SqList.h"

void main()

{

SqList myList;

int account=1, x, n;

int i,k;

printf("请输入正整数(输入结束以-1结尾):\n");

InitList ( myList);

scanf("%d", &x);

while ( x!= -1 )

{ if ( InsertList (myList,x,account)==0) {

printf("错误!\n");

return ;

}

account++;

scanf("%d", &x);

}

printf("请输入i的值:");

scanf("%d",&i);

printf("请输入k的值:");

scanf("%d",&k);

DeleteK(myList,i,k);

n = LengthList (myList);

printf("删除线性表a中第%d元素起的%d个元素后:",i,k);

for (i=1; i<=n; i++)

printf("%d ",GetList(myList, i));

printf("\n");

ClearList(myList);

}

运行截图:

2.11设顺序表va中的数据元素递增有序。试写一算法,将x插入到顺序表的适当位置上,以保持该表的有序性。

SqList.h

typedef struct{

ElemType * elem; //存储空间基址

int length; //当前长度

int list; //当前分配的存储容量

}SqList;

void InitList(SqList &a)

{ //初始化线性表

a.list=listlength;

a.elem=(ElemType*)malloc(a.list*sizeof(SqList));

if(a.elem==NULL)

{

printf("初始化失败");

exit(1);

}

a.length=0;

}

void ClearList(SqList &a)

{ //清除线性表

if(a.elem!=NULL)

{

free(a.elem);

a.elem=NULL;

}

a.length=0;

a.list=0;

}

int LengthList(SqList a)

{ //求线性表长度

return a.length;

}

bool InsertList(SqList &a, ElemType item, int pos)

{ //按给定条件pos向线性表插入一个元素

if(posa.length+1)

{

printf("pos输入错误\n");

return false;

}

int i;

if(pos==0)

{

for(i=0;i

if(a.elem[i]>item)

break;

pos=i+1;

}

else if(pos==-1)

pos=a.length+1;

if(a.length==a.list)

{

a.elem=(ElemType*)realloc(a.elem,2*a.list*sizeof(ElemType));

if(a.elem==NULL)

{

printf("空间分配失败\n");

exit(1);

}

a.list*=2;

}

for(i=a.list-1;i>=pos-1;i--)

a.elem[i+1]=a.elem[i];

a.elem[pos-1]=item;

a.length++;

return true;

}

ElemType GetList(SqList L, int pos)

{ //在线性表L中求序号为pos的元素,该元素作为函数值返回

if(pos<1||pos>L.length)

{

printf("pos输入错误\n");

exit(1);

}

return L.elem[pos-1];

}

void InsertOrderList(SqList &a, ElemType x)

// 在有序的顺序表 L 中保序插入数据元素 x

{

int i=0,j; if(x>=a.elem[a.length-1])

a.elem[a.length]=x;//如果x大于表最后一个元素,则直接插到最后面

else{

while(a.elem[i]<=x) i++; //找到x的插入位置

for(j=a.length-1;j>=i;j--) a.elem[j+1]=a.elem[j] ;

a.elem[i]=x;

}

a.length++; //表长加1

}

main.cpp

#define LIST_INIT_SIZE 100

#define LISTINCREMENT 10

#define INFEASIBLE -1

#define OK 1

#define listlength 10

#define OVERFLOW -2

typedef int ElemType;

typedef int Status;

#include

#include

#include"SqList.h"

void main()

{

SqList va;

int account=1, x, n,y;

int i;

printf("请输入正整数(输入结束以-1结尾):\n");

InitList (va);

scanf("%d", &y);

while ( y!= -1 )

{ if ( InsertList (va,y,account)==0) {

printf("错误!\n");

return ;

}

account++;

scanf("%d", &y);

}

printf("请输入x的值:\n");

scanf("%d",&x);

InsertOrderList(va,x);

n= LengthList (va);

printf("将x插入顺序表后:\n");

for (i=1; i<=n; i++)

printf("%d ",GetList(va, i));

printf("\n");

ClearList(va);

}

运行结果截图:

2.12 设A=(a1,....,am) 和 B=(b1,....,bn)均为顺序表,A'和B'分别为A和B中除去最大共同前缀后的子表(

例如,A=(x,y,y,z,x,z) ,B=(x,y,y,z,y,x,x,z),则两者中最大的共同前缀为(x,y,y,z),在两表中除去最大共同前缀后的子表分别为A'=(x,z) 和 B'=(y,x,x,z).若A'=B'=空表,则A=B;若A'=空表,而B'≠空表,或者两者均不为空表,且A'的首元小于B'的首元,则AB。试写一个比较A,B大小的算法(请注意在算法中,不要破坏表A和B,并且,也不一定先求得A’和 B’才比较)。

SqList.h

typedef struct{

ElemType * elem; //存储空间基址

int length; //当前长度

int list; //当前分配的存储容量

}SqList;

void InitList(SqList &a)

{ //初始化线性表

a.list=listlength;

a.elem=(ElemType*)malloc(a.list*sizeof(SqList));

if(a.elem==NULL)

{

printf("初始化失败");

exit(1);

}

a.length=0;

}

void ClearList(SqList &a)

{ //清除线性表

if(a.elem!=NULL)

{

free(a.elem);

a.elem=NULL;

}

a.length=0;

a.list=0;

}

bool InsertList(SqList &a, ElemType item, int pos)

{ //按给定条件pos向线性表插入一个元素

if(posa.length+1)

{

printf("pos输入错误\n");

return false;

}

int i;

if(pos==0)

{

for(i=0;i

if(a.elem[i]>item)

break;

pos=i+1;

}

else if(pos==-1)

pos=a.length+1;

if(a.length==a.list)

{

a.elem=(ElemType*)realloc(a.elem,2*a.list*sizeof(ElemType));

if(a.elem==NULL)

{

printf("空间分配失败\n");

exit(1);

}

a.list*=2;

}

for(i=a.list-1;i>=pos-1;i--)

a.elem[i+1]=a.elem[i];

a.elem[pos-1]=item;

a.length++;

return true;

}

char Compare(SqList A, SqList B)

{

int i;

for(i=1;i

{

if(A.elem[i]!=B.elem[i])

return A.elem[i]>B.elem[i]?'>':'

}

if(A.length==B.length)

return '=';

else

return A.length>B.length?'>':'

}

main.cpp

#define listlength 10

typedef int ElemType;

typedef int Status;

#include

#include

#include"SqList.h"

void main()

{

SqList A;

int a=1,b=1,x,y;

printf("请输入线性表A中的正整数(输入结束以-1结尾):\n");

InitList (A);

scanf("%d", &x);

while ( x!= -1 )

{ if ( InsertList (A,x,a)==0) {

printf("错误!\n");

return ;

}

a++;

scanf("%d", &x);

}

printf("请输入线性表B中的正整数(输入结束以-1结尾):\n");

SqList B;

InitList (B);

scanf("%d", &y);

while ( y!= -1 )

{ if ( InsertList (B,y,b)==0) {

printf("错误!\n");

return ;

}

b++;

scanf("%d", &y);

}

printf("表A和表B的比较结果:\n");

printf("表A %c 表B\n",Compare(A,B));

ClearList(A);

ClearList(B);

}

2.13 试写一算法在带头节点的单链表结构上实现线性表操作LOCATE(L,X).

2.14 试写一算法在带头节点的单链表结构上实现线性表操作LENGTH(L)。

LinkList.h

typedef struct LNode{

ElemType data;

struct LNode *next;

}LNode,*LinkList;

//构造一个空的线性表L

int InitList(LinkList *L)

{

(*L)=(LinkList)malloc(sizeof(struct LNode));

if(!(*L))

exit(0);

(*L)->next=NULL;

return 1;

}

// 在带头结点的单链线性表L中第i个位置之前插入元素e

int ListInsert(LinkList *L,int i,ElemType e)

{

int j=0;

LinkList p=*L,s;

while(p && j

{

p=p->next;

j++;

}

if(!p || j>i-1) // i小于1或者大于表长

return 0;

s=(LinkList)malloc(sizeof(struct LNode)); // 生成新结点

s->data=e; // 插入L中

s->next=p->next;

p->next=s;

return 1;

}

int ClearList(LinkList L)

{

LinkList p,q;

p=L->next;

while(p)

{

q=p->next;

free(p);

p=q;

}

L->next=NULL;

return 1;

}

// L为带头结点的单链表的头指针。当第i个元素存在时,其值赋给e并

// 返回1,否则返回0。

int GetElem(LinkList L,ElemType *e,int i)

{

int j = 1; // j为计数器

LinkList p=L->next; // p指向第一个结点

while(p&&j

{

p=p->next;

j++;

}

if(!p||j>i) // 第i个元素不存在

return 0;

*e = p->data; // 取第i个元素

return 1;

}

//返回L中数据元素个数。

int LENGTH(LinkList L)

{

int i=0;

LinkList p=L->next;

while(p)

{

i++;

p=p->next;

}

return i;

}

LinkList Locate(LinkList &L, ElemType x)

{ LinkList p;

p=L->next;

while(p)

{ if(p->data==x) return p; //找到x则输出

else p=p->next; //找不到则指针指向下一位

}

return NULL; //表里没有x

}

main.cpp

typedef int ElemType;

#include

#include

#include"LinkList.h"

void main()

{

LinkList myList;

int account=1, x,y, n;

int i;

printf("请输入正整数(输入结束以-1结尾):\n");

InitList ( &myList);

scanf("%d", &y);

while ( y!= -1 )

{

if ( ListInsert (&myList,account,y)==0) {

printf("错误!\n");

return ;

}

account++;

scanf("%d", &y);

}

printf("请输入x的值:\n");

scanf("%d",&x);

printf("查找结果为:\n");

if(Locate(myList,x)==0)

printf("x不在链表中\n");

else

printf("x在链表中\n");

n=LENGTH(myList);

printf("输出线性表如下:\n");

for(i=1;i<=n;i++)

{

GetElem(myList,&x,i);

printf("%d ",x);

}

printf("\n");

ClearList(myList);

}

2.15 已知指针ha和hb分别指向两个单链表的头结点,并且已知两个链表的长度分别为m和n。

试写一算法将这两个链表连接在一起(即令其中一个表的首元结点连在另一个表的最后一个

结点之后),假设指针hc指向连接后的链表的头结点,并要求算法以尽可能短的时间完成连接

运算。请分析你的算法的时间复杂度。

LinkList.h

typedef struct LNode{

ElemType data;

struct LNode *next;

}LNode,*LinkList;

//构造一个空的线性表L

int InitList(LinkList *L)

{

(*L)=(LinkList)malloc(sizeof(struct LNode));

if(!(*L))

exit(0);

(*L)->next=NULL;

return 1;

}

void CreateList(LinkList &L,int n)

{

int i;

LinkList p,q;

L=(LinkList)malloc(sizeof(LNode));

L->next=NULL;

q=L;

printf("Please input %d numbers:\n",n);

for(i=1; i<=n; i++)

{

p=(LinkList)malloc(sizeof(LNode));

scanf("%d",&p->data);

q->next=p;

q=q->next;

}

p->next=NULL;

}

int ClearList(LinkList L)

{

LinkList p,q;

p=L->next;

while(p)

{

q=p->next;

free(p);

p=q;

}

L->next=NULL;

return 1;

}

void PrintList(LinkList L)

{

LinkList p;

p=L->next;

while(p)

{

printf("%d ",p->data);

p=p->next;

}

printf("\n");

}

LinkList connect(LinkList ha,LinkList hb)

{

LinkList hc,p,q;

hc=(LinkList)malloc(sizeof(LNode));

p=ha->next;

hc->next=p;

q=hb->next;

while(p->next)

{

p=p->next;

}

p->next=q;

free(ha);

free(hb);

return hc;

}

main.cpp

typedef int ElemType;

#include

#include

#include"LinkList.h"

void main()

{

LinkList ha,hb,hc;

CreateList(ha,8);

CreateList(hb,4);

hc=connect(ha,hb);

printf("LinkList hc: ");

PrintList(hc);

printf("\n");

ClearList(ha);

ClearList(hb);

ClearList(hc);

}

2.16已知指针la和lb分别指向两个无头结点单链表中的首元结点。下列算法是从表la中删除自第i个数

起共len个元素后,将它们插入到表lb中第j个元素之前。试问此算法是否正确?若有错,请改正之。

linklist.h

#include

#define INFEASIBLE -1;

#define OK 1;

typedef int ElemType;

typedef int Status;

typedef struct LNode{

ElemType data;

struct LNode *next;

} LNode, *LinkList;

//构造一个空的线性表L

int InitList(LinkList *L)

{

(*L)=(LinkList)malloc(sizeof(struct LNode));

if(!(*L))

exit(0);

(*L)->next=NULL;

return 1;

}

void CreateList(LinkList &L,int n)

{

int i;

LinkList p,q;

L=(LinkList)malloc(sizeof(LNode));

L->next=NULL;

q=L;

printf("请输入 %d 个数字:\n",n);

for(i=1; i<=n; i++)

{

p=(LinkList)malloc(sizeof(LNode));

scanf("%d",&p->data);

q->next=p;

q=q->next;

}

p->next=NULL;

}

int ClearList(LinkList L)

{

LinkList p,q;

p=L->next;

while(p)

{

q=p->next;

free(p);

p=q;

}

L->next=NULL;

return 1;

}

void PrintList(LinkList L)

{

LinkList p;

p=L->next;

while(p)

{

printf("%d ",p->data);

p=p->next;

}

printf("\n");

}

Status DeleteAndInsertSub(LinkList &la, LinkList &lb, int i, int j, int len)

{

LinkList p,prev,q,s;

int k;

if(i<0||j<0||len<0) return INFEASIBLE;

p=la; k=0; prev=NULL;

while(p&&k

{

prev=p; p=p->next;k++;//在la查找第i个结点

}

if(!p) return INFEASIBLE;

q=p; k=1; //p指向la表中的第i个结点

while(q&&k

{

q=q->next; k++; //查找la表中的第i+len-1个结点

}

if(!q) return INFEASIBLE;

if(!prev) la=q->next; //i=1的情况

else prev->next=q->next;//完成删除

if(j==1)

{

q->next=lb; lb=p; //将从la中删除的结点插入到lb中

}

else {

s=lb;k=1;

while(s&&k

{

s=s->next; k++;//查找lb表中的第j-1个元素

}

if(!s) return INFEASIBLE;

q->next=s->next; s->next=p;//完成插入

return OK;

}

}

mian.cpp

#include

#include"linklist.h"

void main()

{

LinkList la,lb;

int account=1, x,y,m,n;

int i,j,len,a,b;

printf("请输入线性表A的长度:");

scanf("%d",&a);

CreateList(la,a);

printf("请输入线性表B的长度:");

scanf("%d",&b);

CreateList(lb,b);

printf("请输入i的值:");

scanf("%d",&i);

printf("请输入j的值:");

scanf("%d",&j);

printf("请输入len的值:");

scanf("%d",&len);

DeleteAndInsertSub(la,lb,i,j,len);

printf("输出线性表A如下:\n");

PrintList(la);

printf("输出线性表B如下:\n");

PrintList(lb);

ClearList(la);

ClearList(lb);

}

c语言中mylist是什么参数,数据结构题集(C语言版)算法设计题解析-第二章相关推荐

  1. c语言数据结构算法设计题,数据结构题集(C语言版)算法设计题答案[].doc

    数据结构题集(C语言版)算法设计题答案[].doc 第一章 绪论 1.16 void print_descending(int x,int y,int z)// 按从大到小顺序输出三个数 { scan ...

  2. c语言常用头文件algo,数据结构习题集(C语言版严蔚敏)第一二三章

    3.13 简述以下算法的功能(栈和队列的元素类型均为int). void algo3(Queue &Q) 3.14 若以1234作为双端队列的输入序列,试分别求出满足以下条件的输出序列: (1 ...

  3. 《妙趣横生的算法》第10章 算法设计与数据结构面试精粹之常见的算法设计题10-10(question?)

    [例10-10]有苹果.橘子.香蕉.菠萝.梨这5种水果,已知每个果盘中一定有3种水果,并且3种水果的种类各不相同.编程计算可以制作出多少种水果拼盘. [分析] 本题最容易最直观的解法就是使用穷举法.如 ...

  4. 数据结构题集c语言版第七章答案,数据结构题集(C语言版)答案 - 严蔚敏编著...

    C Temp); ListMinus_L(A Temp D); } 2.30 要求同2.29题 试对单链表编写算法 请释放A表中的无用结点空间 解: // 在A中删除既在B中出现又在C中出现的元素 并 ...

  5. 算法设计题3.16-栈和队列-第3章-《数据结构习题集》-严蔚敏吴伟民版

    习题集完整源码部分 第3章  栈和队列                                                                                 ...

  6. 算法设计题3.27-栈和队列-第3章-《数据结构习题集》-严蔚敏吴伟民版

    习题集完整源码部分 第3章  栈和队列                                                                                 ...

  7. c语言中argc的作用,C语言中main函数的参数argc和argv

    参考资料: C++语言中的main函数,经常带有参数argc,argv,如下: int main(int argc, char** argv) int main(int argc, char* arg ...

  8. c语言中不正确的浮点型常量,c语言中float a=1;对吗?,c语言的问题。float a=1,*b=a,*c=...

    导航:网站首页 > c语言中float a=1:对吗?,c语言的问题.float a=1,*b=&a,*c= c语言中float a=1:对吗?-,c语言的问题.float a=1,*b ...

  9. 构建线性表的c语言代码,数据结构严蔚敏C语言版—线性表顺序存储结构(顺序表)C语言实现相关代码...

    1.运行环境 这里说明一下这里所有的C语言代码都是基于code::blocks 20.03编译运行的.当然一些其他集成开发环境应该也是可以的,个人不太喜欢功能太过强大的IDE,因为那同样意味着相关设置 ...

  10. 数据结构课后答案 c语言版

    在线:https://wenku.baidu.com/view/ddd0f4a10342a8956bec0975f46527d3250ca607.html 百度网盘下载:https://pan.bai ...

最新文章

  1. CodeIgniter源码分析(一) 目录结构
  2. Qt-QTableWidget设置只能选中一行
  3. Yii权限控制组件authManager使用思想RBAC
  4. springboot集成mybatis源码分析-启动加载mybatis过程(二)
  5. delphi 到出execl2010 文件损坏_Win7系统出现explorer.exe损坏的图像的解决方法是什么?...
  6. 返回后的数据处理_【掘金使用技巧2】掘金返回数据中时间的处理方法
  7. Android手机隐藏命令大全
  8. 基于javaweb SSM邮件收发信息系统设计和实现以及文档
  9. 面向多星多任务的大数据处理系统设计
  10. 从系统盘符选错到认识硬盘的各种分区
  11. 【数据结构笔记42】哈希表应用:文件中单词词频统计
  12. JQuery 表格拖动调整列宽效果
  13. 尚硅谷大数据之Linux
  14. 《Linux操作系统-基础笔记》第6章 编译调试工具(GCC、GDB)
  15. 光通量发光强度照度亮度关系_光通量、发光强度、照度单位的关系
  16. 【对称加密与非对称加密】-- 概念、图示、优缺点
  17. 过滤器和拦截器(SpringMVC实现)
  18. 第一次软件工程实践作业
  19. 微信如何设置足迹地图状态?
  20. Linux DNS缓存相关

热门文章

  1. 《Java并发编程实践》学习笔记之二:线程安全性(thread-safe)
  2. oracle中查询被锁的表并释放session
  3. mysql 存储session
  4. .NET面试基础知识
  5. Android04-UI01常用控件
  6. 2013-07-29 IT 要闻速记快想
  7. 20佳非常有创意的About页面设计
  8. Easyui datagrid加载本地Json数据
  9. 美国公司报告称2020年中国会非常穷 我学者驳斥[转]
  10. php扫雷算法,扫雷游戏算法 - osc_qv1fwke0的个人空间 - OSCHINA - 中文开源技术交流社区...