5.分析下列各算法的时间
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
仿照课本算法,写出下面顺序表示的线性表的基本操 作的算法。
#define LIST_INIT SIZE 100 #define LISTINCREMENT 10 typedef struct { Elemtype *elem;//存储空间的 基地址 Int length;//当前长度 Int listsize;//当前分配的存储容 量 }SqList; Void DestroyList_Sq(SqList &L) { free(L.elem); L.elem=NULL; L.length=0; L.listsize=0; }
ListLength_L(LinkList L) {p=L.next;j=0; if(p) {++j; p=p->next; } return j; }
ListLength_L(LinkList L) {p=L.next;j=0; if(p) {++j; p=p->next; } return j; }
仿照课本算法,写出下面链式表示的线性 表的基本操作的算法。
DestroyList_L(LinkList &L) { p=L; while(p) {q=p; p=p->next; free(q); } }
ListEmpty_L(LinkList L) { if(L.next==NULL) return TURE; else return FALSE; }
(2)T(n)=0(n)
(3)prime(int n) {int i=2; while((n%i)!=0 && i<sqrt(n)) i++; if(i>sqrt(n)) printf("%d是一个素数\n",n); else printf("%d不是一个素数\n",n); } (3)T(n)=0(sqrt(n))
typedef 声明新的类型名来代替已有的类型名, typedef int INTEGER; typedef float REAL; 还可以声明结构体类型 typedef struct {int month; int day; int year; }DATE; 声明新类型名DATE,它代表上面指定的一个结构体类型。这时就可以 用DATE定义变量: DATE birthday; DATE *p;
引用 引用是一个别名。当建立引用时,程序用另一个变 量或者对象的名字初始化它。对引用的改动,实际 上是对目标的改动。假如有一个变量a,想给它起 个别名b,可以这样写:int &b=a,这样b就成为a的 别名(引用),也可以说a、b代表同一个变量,占 a b 有相同的内存空间
a 内存单元 b
Status ListDelete(LinkList &L,int i,ElemType &e) {…... e=q->data; free(q); ……. }
插入元素:ListInsert_L(LinkList *L, int i, ElemType e)
Status ListInsert(LinkList *L,int i,ElemType e) {LinkList p,s; int j=0; if(i<1 || i>L.len+1) return ERROR; p=(*L).head; while(p && j<i-1) {p=p->next; ++j;}//寻找第i-1个结点 s=(LinkList)malloc(sizeof(struct Lnode)); if(!s) exit(OVERFLOW); s->data=e; s->next=p->next; p->next=s; return OK;}
NextElem_L(LinkList L,ElemType cur_e,ElemTpye &next_e) {p=L->next; while(p->data!=cur_e&&p!=NULL) p=p->next; if(p->data!=cur_e) return ERROR; if(p->data=cur_e&&p->next=NULL) return ERROR; next_e=p->next->data; return next_e; }
1.仿照课本算法,பைடு நூலகம்出下面栈的基本操作的算法。 DestroyStack(&S), ClearStack(&S), StackEmpty(S), StackLength(S) Status DestroyStack(SqStack &S) {free(S.base); S.base=S.top=NULL; S.stacksize=0; return OK; } Status ClearStack(SqStack S) {S.top=S.base; return OK; }
插入元素(ListInsert_Sq)
Status ListInsert_Sq(SqList *L,int i,ElemType e) {ElemType * p,*q,*newbase; if(i<1 || i>L->length+1) return ERROR; if(L->length>=L->listsize) {newbase=(ElemType *)realloc(L->elem, (L->listsize+LISTINCREMENT)*sizeof(ElemType)); if(!newbase) exit(OVERFLOW); L->elem=newbase; L->listsize+=LISTINCREMENT;} q=&(L->elem[i-1]);//要插入元素的位置 for(p=&(L->elem[L->length-1]);p>=q;--p) *(p+1)=*p; *q=e; ++L->Length; return OK;}
5.分析下列各算法的时间复杂度T(n)。
(1)sum(int n) {int p=1,sum=0,i; for(i=1;i<=n;i++) {p*=i; sum+=p; } return(sum); } (1)T(n)=0(n) (2)fact(int n) { if (n<=1) return(1); else return(n*fact(n-1)); }
Status GetElem_Sq(SqList L,int i,ElemType &e) {if(L.length==0) return ERROR; if(i<1 || i>L.length) return ERROR; e=L.elem[i-1]; return OK;}
假设有如下定义:typedef int ElemType; 根据课本上线性表的类型定义及算法,用C语言 语言写出顺序表示 语言 的线性表的三个基本操作的程序: 初始化线性表(InitList_Sq) Status InitList_Sq(SqList *L) {L->elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType)); if(!L->elem) exit(OVERFLOW); L->Length=0; L->listsize=LIST_INIT_SIZE; return OK;}
PriorElem_L(LinkList L,ElemType cur_e,Elemtype &pre_e) {p=L;j=0; do {q=p; p=p->next; j++; }while(p->data!=cur_e&&p!=NULL) if(p->data!=cur_e) return ERROR; if(j<=1) return ERROR; pre_e=*q; return ok; }
删除元素: ListDelete_L(LinkList L, int i, ElemType *e) Status ListDelete(LinkList L,int i,ElemType *e) {LinkList p,q; int j=0; if(i<1 || i>L.len) return ERROR; p=L.head; while(p->next && j<i-1) {p=p->next; ++j;}//找到第i-1个结点 q=p->next; p->next=q->next; *e=q->data; free(q); return OK;}
删除元素(ListDelete_Sq)
Status ListDelete_Sq(SqList *L,int i,ElemType *e) {ElemType * p,*q; if(i<1 || i>L->length) return ERROR; p=&(L->elem[i-1]); *e=*p; q=L->elem+L->length-1;//指针q指向线性表 的最后 for(++p;p<=q;++p) *(p-1)=*p; --L->Lngth; return OK;}
Status MatchTest(void) { InitStack(S); while((ch=getchar())!='\n') {switch(ch) {case '(': case '[': push(S,ch);break; case ')': if(StackEmpty(S)) return ERROR; GetTop(S,e); if(e=='(') Pop(S,e); else return ERROR; break; case ']': if(StackEmpty(S)) return ERROR; GetTop(S,e); if(e=='[') Pop(S,e); else return ERROR; break; default: return ERROR; } } if(StackEmpty(S)) return OK; else return ERROR; }
2.假设有如下定义:typedef int ElemType; 根据课本上线性表的类型定义及算法,用C语言 语言写出 语言 链式表示的线性表的三个基本操作的程序: 建立线性表:CreateList_L(LinkList &L, int n)
Void CreateList(LinkList *L,int n) {LinkList p;int i; * L=(LinkList)malloc(sizeof(struct Lnode)); if(!(*L)) exit(OVERFLOW); (*L)->next=NULL; L.len=0; for(i=n;i>0;--i)//建立结点 {p=(LinkList)malloc(sizeof(struct Lnode)); if(!p) exit(OVERFLOW); scanf(“%d”,&p->data); p->next=L.head->next; (*L)->next=p;} L.len=n; return OK;}
Status StackEmpty(SqStack S) { if(S.top==S.base) return TRUE; return FALSE; } int StackLength(SqStack S) { return (S.top-S.base); }
2.根据课本3.2.2节括号匹配检验的原理,写一算法来检验输入 字符序列中括号是否匹配。若匹配则返回OK,不匹配则返回 ERROR。假设输入字符序列中只有圆括号和方括号两种,以回 车作为结束(回车的ASCII码是13)。函数头定义为: Status MatchTest(void) 1.凡出现左括号,则进栈; 凡出现左括号,则进栈; 凡出现左括号 2.凡出现右括号,则先检查栈是否为空,若栈空,则表明该 凡出现右括号, 凡出现右括号 则先检查栈是否为空,若栈空, 右括号”多余; “右括号”多余;否则和栈定元素比较 若相匹配, 若相匹配,则左括号出栈 否则 表明不匹配 3.表达式结束时, 表达式结束时, 表达式结束时 若栈空,则表明表达式中匹配正确,否则表明“左括号” 若栈空,则表明表达式中匹配正确,否则表明“左括号”有 余。
Void ClearList_Sq(SqList &L)//将L重置为空表 {L.length=0; } Status ListEmpty_Sq(SqList L) //若L为空表则返回TRUE {if(L.length==0) return TRUE; else } int ListLength_Sq(SqList L) //返回L中数据元素的个数 {return(L.length);} return FALSE;