南审《数据结构课程教学设计》个人说明任务题目一览度版.docx
《南审《数据结构课程教学设计》个人说明任务题目一览度版.docx》由会员分享,可在线阅读,更多相关《南审《数据结构课程教学设计》个人说明任务题目一览度版.docx(19页珍藏版)》请在冰豆网上搜索。
南审《数据结构课程教学设计》个人说明任务题目一览度版
第二章线性表
顺序表的操作
1、顺序表的建立(从键盘或者数组中导入数据)
StatusInitList(SqList&L)
{//构造一个空的顺序表
L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!
L.elem)
exit(OVERFLOW);
L.length=0;
L.listsize=LIST_INIT_SIZE;
returnOK;
}
2、顺序表按照值查找位置
intLocateElem(SqListL,ElemTypee)
{//根据数据元素的值,返回它在线性表L中的位置
inti=0;
while((i<=L.length)&&(*(L.elem+i-1)!
=e))
i++;
if(i<=L.length)
returni;
else
return(-1);
3、顺序表按照序号查找元素的值
StatusGetElem(SqListL,inti,ElemType&e)
{//根据数据元素在线性表L中的位置,返回它的值
if(i<1||i>L.length)
returnERROR;
e=*(L.elem+i-1);
4、顺序表数据元素的插入
StatusListInsert(SqList&L,inti,ElemTypee)
{//在L中第i个位置之前插入新的数据元素e,L的长度加1
ElemType*p,*q,*newbase;
if(i<1||i>L.length+1)
if(L.length>=L.listsize)
{newbase=(ElemType*)realloc(L.elem,
(L.listsize+LISTINCREMENT)*sizeof(ElemType));
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;
5、顺序表数据元素的删除
StatusListDelete(SqList&L,inti,ElemType&e)
{//删除L的第i个数据元素,并用e返回其值,L的长度减1
ElemType*q,*p;
p=&(L.elem[i-1]);
e=*p;
q=L.elem+L.length-1;
for(++p;p<=q;++p)*(p-1)=*p;
--L.length;
6、顺序表数据元素的输出
Statusvisit(SqListL)
{//按序输出顺序表的各个元素值
inti;
for(i=1;i<=L.length;i++)
printf("%d",*(L.elem+i-1));
cout<printf("L.elem=%uL.length=%dL.listsize=%d\n",L.elem,L.length,L.listsize);returnOK;}单链表的操作1、单链表的建立voidCreateList(LinkList&L,intn){//逆位序输入n个元素的值,建立带表头结构的单链线性表Linti;LinkListp;L=(LinkList)malloc(sizeof(LNode));L->next=NULL;printf("请输入%d个数据\n",n);for(i=n;i>0;--i){p=(LinkList)malloc(sizeof(LNode));scanf("%d",&p->data);p->next=L->next;L->next=p;}}voidCreateList2(LinkList&L,intn){//正位序输入n个元素的值,建立带表头结构的单链线性表inti;LinkListp,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;}2、单链表的输出Statusvisit(LinkListL){//按序输出单链表的各个元素值LinkListp=L->next;while(p){printf("%d",p->data);p=p->next;}printf("\n");returnOK;}3、单链表结点的插入StatusListInsert(LinkList&L,inti,ElemTypee){LinkListp,s;p=L;intj=0;while(p&&j{p=p->next;++j;}if(!p||j>i-1)returnERROR;s=(LinkList)malloc(sizeof(LNode));s->data=e;s->next=p->next;p->next=s;returnOK;}4、单链表结点的删除StatusListDelete(LinkList&L,inti,ElemTypee){LinkListp,q;p=L;intj=0;while(p->next&&j{p=p->next;++j;}if(!(p->next)||j>i-1)returnERROR;q=p->next;p->next=q->next;e=q->data;free(q);returnOK;}5、单链表中按照结点的值查找结点的位序intLocateElem(LinkListL,ElemTypee){//返回L中第1个值为e的数据元素的位序,若这样的数据元素不存在,则返回值为0inti=0;LinkListp=L->next;while(p){i++;if(p->data==e)returni;p=p->next;}return0;}6、单链表中按照结点的位序返回结点的值StatusGetElem(LinkListL,inti,ElemType&e){//L为带头结点的单链表的头指针。当第i个元素存在时,其值赋给e并返回OK,否则返回ERRORintj=1;LinkListp=L->next;while(p&&j{p=p->next;j++;}if(!p||j>i)returnERROR;e=p->data;returnOK;}7、单链表的初始化(新建一个只含头结点的单链表)StatusInitList(LinkList&L){//构造一个空的单链表LL=(LinkList)malloc(sizeof(LNode));if(!L)exit(OVERFLOW);L->next=NULL;returnOK;}8、单链表的销毁(所有结点都要销毁)StatusDestroyList(LinkList&L){//销毁单链表LLinkListq;while(L){q=L->next;free(L);L=q;}returnOK;}9、求单链表的长度intListLength(LinkListL){//返回L中数据元素个数if(L==0)return0;inti=0;LinkListp=L->next;while(p){i++;p=p->next;}returni;}10、两个单链表的归并voidMergeList(LinkList&La,LinkList&Lb,LinkList&Lc){//已知线性表La和Lb中的数据元素按值非递减排列//归并La和Lb得到新的线性表Lc,Lc的数据元素也按值非递减排列LinkListpa,pb,pc;pa=La->next;pb=Lb->next;Lc=pc=La;while(pa&&pb){if(pa->data<=pb->data){pc->next=pa;pc=pa;pa=pa->next;}else{pc->next=pb;pc=pb;pb=pb->next;}}pc->next=pa?pa:pb;free(Lb);}第三章栈和队列栈的操作1、初始化一个顺序栈(从键盘或者数组中导入数据)StatusInitStack(SqStack&S){S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));if(!S.base)exit(OVERFLOW);S.top=S.base;S.stacksize=STACK_INIT_SIZE;returnOK;}2、判断栈是否为空StatusStackEmpty(SqStackS){//若栈S为空栈,则返回TRUE;否则返回FALSEif(S.top==S.base)returnTRUE;elsereturnFALSE;}3、取栈顶元素StatusGetTop(SqStackS,SElemType&e)//在教科书第47页{//若栈S不空,则用e返回S的栈顶元素,并返回OK;否则返回ERRORif(S.top==S.base)returnERROR;e=*(S.top-1);returnOK;}4、元素进栈StatusPush(SqStack&S,SElemTypee){//插入元素e为栈S新的栈顶元素。if(S.top-S.base>=S.stacksize){S.base=(SElemType*)realloc(S.base,(S.stacksize+STACK_INCREMENT)*sizeof(SElemType));if(!S.base)exit(OVERFLOW);S.top=S.base+S.stacksize;}S.stacksize+=STACK_INCREMENT;*S.top++=e;returnOK;}5、元素出栈StatusPop(SqStack&S,SElemType&e)//在教科书第47页{//若栈S不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERRORif(S.top==S.base)returnERROR;e=*--S.top;returnOK;}6、计算栈中数据元素的个数intStackLength(SqStackS){//返回栈S的元素个数,即栈的长度returnS.top-S.base;}递归1、递归实现阶乘intf(intn){if(n==0)return1;elsereturn(n*f(n-1));}2、递归实现链表的输出(正序、逆序)voidRevPrint(LNode*head){if(NULL!=head){if(NULL!=head->next){RevPrint(head->next);}printf("%d\t",head->data);}}//逆序后输出voidPrintList_L(LinkListL){if(L!=NULL){printf("%d\t",L->data);PrintList_L(L->next);}}//正序输出3、递归实现链表的逆序LinkListreverse(LinkListp){LinkListq,h;if(p->next==NULL)returnp;else{q=p->next;h=reverse(q);q->next=p;p->next=NULL;returnh;}}4、递归求链表的长度intListLength(LinkListL){intlen;if(!L)return0;len=1+ListLength(L->next);returnlen;}第六章树和二叉树二叉树的操作(采用二叉链式存储)1、二叉树的建立StatusCreateBiTree(BiTree&T){//算法6.4:按先序次序输入二叉树中结点的值(可为字符型或整型,在主程中定义),charch;scanf("%c",&ch);if(ch=='')T=NULL;else{if(!(T=(BiTNode*)malloc(sizeof(BiTNode))))exit(OVERFLOW);T->data=ch;CreateBiTree(T->lchild);CreateBiTree(T->rchild);}returnOK;}2、二叉树的遍历(四种)StatusPreOrderTraverse(BiTreeT,void(*Visit)(TElemType)){//初始条件:二叉树T存在,Visit是对结点操作的应用函数。修改算法6.1//操作结果:先序递归遍历T,对每个结点调用函数Visit一次且仅一次if(T){Visit(T->data);if(PreOrderTraverse(T->lchild,Visit))if(PreOrderTraverse(T->rchild,Visit))returnOK;}elsereturnOK;}StatusInOrderTraverse(BiTreeT,void(*Visit)(TElemType)){//初始条件:二叉树T存在,Visit是对结点操作的应用函数//操作结果:中序递归遍历T,对每个结点调用函数Visit一次且仅一次if(T){InOrderTraverse(T->lchild,Visit);Visit(T->data);if(InOrderTraverse(T->rchild,Visit))returnOK;}elsereturnOK;}StatusPostOrderTraverse(BiTreeT,void(*Visit)(TElemType)){//初始条件:二叉树T存在,Visit是对结点操作的应用函数//操作结果:后序递归遍历T,对每个结点调用函数Visit一次且仅一次if(T){PostOrderTraverse(T->lchild,Visit);if(PostOrderTraverse(T->rchild,Visit))Visit(T->data);returnOK;}elsereturnOK;}StatusLevelOrderTraverse(BiTreeT,void(*Visit)(TElemType)){//初始条件:二叉树T存在,Visit是对结点操作的应用函数//操作结果:层序递归遍历T(利用队列),对每个结点调用函数Visit一次且仅一次LinkQueueq;QElemTypea;if(T){InitQueue(q);EnQueue(q,T);while(!QueueEmpty(q)){DeQueue(q,a);Visit(a->data);if(a->lchild!=NULL)EnQueue(q,a->lchild);if(a->rchild!=NULL)EnQueue(q,a->rchild);}printf("\n");}returnOK;}3、求二叉树高度intTreeDepth(BiTreeT){intdepth,depthleft,depthright;if(!T)depth=0;else{depthleft=TreeDepth(T->lchild);depthright=TreeDepth(T->rchild);depth=1+(depthleft>depthright?depthleft:depthright);}returndepth;}4、交换二叉树的左右子树Statusexchange(BiTreeT)//先序遍历{if(T!=NULL)if(T->lchild!=NULL||T->rchild!=NULL){BiTree*p,*q;p=exchange(T->lchild);q=exchange(T->rchild);T->lchild=q;T->rchild=p;}returnT;}voidexchanget(BiTreeT)//后序遍历{if(T!=NULL)if(T->lchild!=NULL||T->rchild!=NULL){BiTree*p,*q;q=T->rchild;p=T->lchild;T->lchild=q;T->rchild=p;exchange(T->lchild);exchange(T->rchild);}returnT;}5、求二叉树的结点个数StatusNodeNum(BiTreeT,int*num){if(T){if(T->data)num++;if(NodeNum(T->lchild,num))if(NodeNum(T->rchild,num))returnOK;returnERROR;}elsereturnOK;}6、求二叉树的叶子数voidCountLeaf(BiTreeT,int&count){if(T){if(T->lchild==NULL&&T->rchild==NULL)count++;else{CountLeaf(T->lchild,count);CountLeaf(T->rchild,count);}}}7、按照目录形式输出二叉树StatusPrintTree(BiTreebt,intnLayer)/*按竖向树状打印的二叉树*/{if(bt!=NULL){PrintTree(bt->lchild,nLayer+1);for(inti=0;iprintf("-");printf("%c\n",bt->data);PrintTree(bt->rchild,nLayer+1);}returnOK;}树的操作(采用左孩子右兄弟存储结构)1、求树的深度intTreeDepth(CSTreeT){//初始条件:树T存在。操作结果:返回T的深度intmaxd,d;CSTreep;if(!T)return0;else{for(maxd=0,p=T->firstchild;p;p=p->nextsibling)if((d=TreeDepth(p))>maxd)maxd=d;returnmaxd+1;}}2、求树中给定结点的右兄弟TElemTypeRightSibling(CSTreeT,TElemTypecur_e){//初始条件:树T存在,cur_e是T中某个结点//操作结果:若cur_e有右兄弟,则返回它的右兄弟;否则返回“空”CSTreef;f=Point(T,cur_e);if(f&&f->nextsibling)returnf->nextsibling->data;elsereturn'';}3、树的后根遍历voidPostOrderTraverse(CSTreeT,void(*Visit)(TElemType)){CSTreep;if(T){if(T->firstchild){PostOrderTraverse(T->firstchild,Visit);p=T->firstchild->nextsibling;while(p){PostOrderTraverse(p,Visit);p=p->nextsibling;}}Visit(T->data);}第九章查找1、顺序查找法intSearch_Seq(SSTableST,KeyTypekey){//在顺序表ST中顺序查找其关键字等于key的数据元素。若找到,则函数值为
printf("L.elem=%uL.length=%dL.listsize=%d\n",L.elem,L.length,L.listsize);
单链表的操作
1、单链表的建立
voidCreateList(LinkList&L,intn)
{//逆位序输入n个元素的值,建立带表头结构的单链线性表L
LinkListp;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
printf("请输入%d个数据\n",n);
for(i=n;i>0;--i)
{
p=(LinkList)malloc(sizeof(LNode));
scanf("%d",&p->data);
p->next=L->next;
L->next=p;
voidCreateList2(LinkList&L,intn)
{//正位序输入n个元素的值,建立带表头结构的单链线性表
LinkListp,q;
q=L;
for(i=1;i<=n;i++)
q->next=p;
q=q->next;
p->next=NULL;
2、单链表的输出
Statusvisit(LinkListL)
{//按序输出单链表的各个元素值
LinkListp=L->next;
while(p)
printf("%d",p->data);
p=p->next;
printf("\n");
3、单链表结点的插入
StatusListInsert(LinkList&L,inti,ElemTypee)
LinkListp,s;p=L;intj=0;
while(p&&j{p=p->next;++j;}if(!p||j>i-1)returnERROR;s=(LinkList)malloc(sizeof(LNode));s->data=e;s->next=p->next;p->next=s;returnOK;}4、单链表结点的删除StatusListDelete(LinkList&L,inti,ElemTypee){LinkListp,q;p=L;intj=0;while(p->next&&j{p=p->next;++j;}if(!(p->next)||j>i-1)returnERROR;q=p->next;p->next=q->next;e=q->data;free(q);returnOK;}5、单链表中按照结点的值查找结点的位序intLocateElem(LinkListL,ElemTypee){//返回L中第1个值为e的数据元素的位序,若这样的数据元素不存在,则返回值为0inti=0;LinkListp=L->next;while(p){i++;if(p->data==e)returni;p=p->next;}return0;}6、单链表中按照结点的位序返回结点的值StatusGetElem(LinkListL,inti,ElemType&e){//L为带头结点的单链表的头指针。当第i个元素存在时,其值赋给e并返回OK,否则返回ERRORintj=1;LinkListp=L->next;while(p&&j{p=p->next;j++;}if(!p||j>i)returnERROR;e=p->data;returnOK;}7、单链表的初始化(新建一个只含头结点的单链表)StatusInitList(LinkList&L){//构造一个空的单链表LL=(LinkList)malloc(sizeof(LNode));if(!L)exit(OVERFLOW);L->next=NULL;returnOK;}8、单链表的销毁(所有结点都要销毁)StatusDestroyList(LinkList&L){//销毁单链表LLinkListq;while(L){q=L->next;free(L);L=q;}returnOK;}9、求单链表的长度intListLength(LinkListL){//返回L中数据元素个数if(L==0)return0;inti=0;LinkListp=L->next;while(p){i++;p=p->next;}returni;}10、两个单链表的归并voidMergeList(LinkList&La,LinkList&Lb,LinkList&Lc){//已知线性表La和Lb中的数据元素按值非递减排列//归并La和Lb得到新的线性表Lc,Lc的数据元素也按值非递减排列LinkListpa,pb,pc;pa=La->next;pb=Lb->next;Lc=pc=La;while(pa&&pb){if(pa->data<=pb->data){pc->next=pa;pc=pa;pa=pa->next;}else{pc->next=pb;pc=pb;pb=pb->next;}}pc->next=pa?pa:pb;free(Lb);}第三章栈和队列栈的操作1、初始化一个顺序栈(从键盘或者数组中导入数据)StatusInitStack(SqStack&S){S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));if(!S.base)exit(OVERFLOW);S.top=S.base;S.stacksize=STACK_INIT_SIZE;returnOK;}2、判断栈是否为空StatusStackEmpty(SqStackS){//若栈S为空栈,则返回TRUE;否则返回FALSEif(S.top==S.base)returnTRUE;elsereturnFALSE;}3、取栈顶元素StatusGetTop(SqStackS,SElemType&e)//在教科书第47页{//若栈S不空,则用e返回S的栈顶元素,并返回OK;否则返回ERRORif(S.top==S.base)returnERROR;e=*(S.top-1);returnOK;}4、元素进栈StatusPush(SqStack&S,SElemTypee){//插入元素e为栈S新的栈顶元素。if(S.top-S.base>=S.stacksize){S.base=(SElemType*)realloc(S.base,(S.stacksize+STACK_INCREMENT)*sizeof(SElemType));if(!S.base)exit(OVERFLOW);S.top=S.base+S.stacksize;}S.stacksize+=STACK_INCREMENT;*S.top++=e;returnOK;}5、元素出栈StatusPop(SqStack&S,SElemType&e)//在教科书第47页{//若栈S不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERRORif(S.top==S.base)returnERROR;e=*--S.top;returnOK;}6、计算栈中数据元素的个数intStackLength(SqStackS){//返回栈S的元素个数,即栈的长度returnS.top-S.base;}递归1、递归实现阶乘intf(intn){if(n==0)return1;elsereturn(n*f(n-1));}2、递归实现链表的输出(正序、逆序)voidRevPrint(LNode*head){if(NULL!=head){if(NULL!=head->next){RevPrint(head->next);}printf("%d\t",head->data);}}//逆序后输出voidPrintList_L(LinkListL){if(L!=NULL){printf("%d\t",L->data);PrintList_L(L->next);}}//正序输出3、递归实现链表的逆序LinkListreverse(LinkListp){LinkListq,h;if(p->next==NULL)returnp;else{q=p->next;h=reverse(q);q->next=p;p->next=NULL;returnh;}}4、递归求链表的长度intListLength(LinkListL){intlen;if(!L)return0;len=1+ListLength(L->next);returnlen;}第六章树和二叉树二叉树的操作(采用二叉链式存储)1、二叉树的建立StatusCreateBiTree(BiTree&T){//算法6.4:按先序次序输入二叉树中结点的值(可为字符型或整型,在主程中定义),charch;scanf("%c",&ch);if(ch=='')T=NULL;else{if(!(T=(BiTNode*)malloc(sizeof(BiTNode))))exit(OVERFLOW);T->data=ch;CreateBiTree(T->lchild);CreateBiTree(T->rchild);}returnOK;}2、二叉树的遍历(四种)StatusPreOrderTraverse(BiTreeT,void(*Visit)(TElemType)){//初始条件:二叉树T存在,Visit是对结点操作的应用函数。修改算法6.1//操作结果:先序递归遍历T,对每个结点调用函数Visit一次且仅一次if(T){Visit(T->data);if(PreOrderTraverse(T->lchild,Visit))if(PreOrderTraverse(T->rchild,Visit))returnOK;}elsereturnOK;}StatusInOrderTraverse(BiTreeT,void(*Visit)(TElemType)){//初始条件:二叉树T存在,Visit是对结点操作的应用函数//操作结果:中序递归遍历T,对每个结点调用函数Visit一次且仅一次if(T){InOrderTraverse(T->lchild,Visit);Visit(T->data);if(InOrderTraverse(T->rchild,Visit))returnOK;}elsereturnOK;}StatusPostOrderTraverse(BiTreeT,void(*Visit)(TElemType)){//初始条件:二叉树T存在,Visit是对结点操作的应用函数//操作结果:后序递归遍历T,对每个结点调用函数Visit一次且仅一次if(T){PostOrderTraverse(T->lchild,Visit);if(PostOrderTraverse(T->rchild,Visit))Visit(T->data);returnOK;}elsereturnOK;}StatusLevelOrderTraverse(BiTreeT,void(*Visit)(TElemType)){//初始条件:二叉树T存在,Visit是对结点操作的应用函数//操作结果:层序递归遍历T(利用队列),对每个结点调用函数Visit一次且仅一次LinkQueueq;QElemTypea;if(T){InitQueue(q);EnQueue(q,T);while(!QueueEmpty(q)){DeQueue(q,a);Visit(a->data);if(a->lchild!=NULL)EnQueue(q,a->lchild);if(a->rchild!=NULL)EnQueue(q,a->rchild);}printf("\n");}returnOK;}3、求二叉树高度intTreeDepth(BiTreeT){intdepth,depthleft,depthright;if(!T)depth=0;else{depthleft=TreeDepth(T->lchild);depthright=TreeDepth(T->rchild);depth=1+(depthleft>depthright?depthleft:depthright);}returndepth;}4、交换二叉树的左右子树Statusexchange(BiTreeT)//先序遍历{if(T!=NULL)if(T->lchild!=NULL||T->rchild!=NULL){BiTree*p,*q;p=exchange(T->lchild);q=exchange(T->rchild);T->lchild=q;T->rchild=p;}returnT;}voidexchanget(BiTreeT)//后序遍历{if(T!=NULL)if(T->lchild!=NULL||T->rchild!=NULL){BiTree*p,*q;q=T->rchild;p=T->lchild;T->lchild=q;T->rchild=p;exchange(T->lchild);exchange(T->rchild);}returnT;}5、求二叉树的结点个数StatusNodeNum(BiTreeT,int*num){if(T){if(T->data)num++;if(NodeNum(T->lchild,num))if(NodeNum(T->rchild,num))returnOK;returnERROR;}elsereturnOK;}6、求二叉树的叶子数voidCountLeaf(BiTreeT,int&count){if(T){if(T->lchild==NULL&&T->rchild==NULL)count++;else{CountLeaf(T->lchild,count);CountLeaf(T->rchild,count);}}}7、按照目录形式输出二叉树StatusPrintTree(BiTreebt,intnLayer)/*按竖向树状打印的二叉树*/{if(bt!=NULL){PrintTree(bt->lchild,nLayer+1);for(inti=0;iprintf("-");printf("%c\n",bt->data);PrintTree(bt->rchild,nLayer+1);}returnOK;}树的操作(采用左孩子右兄弟存储结构)1、求树的深度intTreeDepth(CSTreeT){//初始条件:树T存在。操作结果:返回T的深度intmaxd,d;CSTreep;if(!T)return0;else{for(maxd=0,p=T->firstchild;p;p=p->nextsibling)if((d=TreeDepth(p))>maxd)maxd=d;returnmaxd+1;}}2、求树中给定结点的右兄弟TElemTypeRightSibling(CSTreeT,TElemTypecur_e){//初始条件:树T存在,cur_e是T中某个结点//操作结果:若cur_e有右兄弟,则返回它的右兄弟;否则返回“空”CSTreef;f=Point(T,cur_e);if(f&&f->nextsibling)returnf->nextsibling->data;elsereturn'';}3、树的后根遍历voidPostOrderTraverse(CSTreeT,void(*Visit)(TElemType)){CSTreep;if(T){if(T->firstchild){PostOrderTraverse(T->firstchild,Visit);p=T->firstchild->nextsibling;while(p){PostOrderTraverse(p,Visit);p=p->nextsibling;}}Visit(T->data);}第九章查找1、顺序查找法intSearch_Seq(SSTableST,KeyTypekey){//在顺序表ST中顺序查找其关键字等于key的数据元素。若找到,则函数值为
{p=p->next;
++j;
p||j>i-1)returnERROR;
s=(LinkList)malloc(sizeof(LNode));
s->data=e;s->next=p->next;
p->next=s;
4、单链表结点的删除
StatusListDelete(LinkList&L,inti,ElemTypee)
LinkListp,q;p=L;
intj=0;
while(p->next&&j{p=p->next;++j;}if(!(p->next)||j>i-1)returnERROR;q=p->next;p->next=q->next;e=q->data;free(q);returnOK;}5、单链表中按照结点的值查找结点的位序intLocateElem(LinkListL,ElemTypee){//返回L中第1个值为e的数据元素的位序,若这样的数据元素不存在,则返回值为0inti=0;LinkListp=L->next;while(p){i++;if(p->data==e)returni;p=p->next;}return0;}6、单链表中按照结点的位序返回结点的值StatusGetElem(LinkListL,inti,ElemType&e){//L为带头结点的单链表的头指针。当第i个元素存在时,其值赋给e并返回OK,否则返回ERRORintj=1;LinkListp=L->next;while(p&&j{p=p->next;j++;}if(!p||j>i)returnERROR;e=p->data;returnOK;}7、单链表的初始化(新建一个只含头结点的单链表)StatusInitList(LinkList&L){//构造一个空的单链表LL=(LinkList)malloc(sizeof(LNode));if(!L)exit(OVERFLOW);L->next=NULL;returnOK;}8、单链表的销毁(所有结点都要销毁)StatusDestroyList(LinkList&L){//销毁单链表LLinkListq;while(L){q=L->next;free(L);L=q;}returnOK;}9、求单链表的长度intListLength(LinkListL){//返回L中数据元素个数if(L==0)return0;inti=0;LinkListp=L->next;while(p){i++;p=p->next;}returni;}10、两个单链表的归并voidMergeList(LinkList&La,LinkList&Lb,LinkList&Lc){//已知线性表La和Lb中的数据元素按值非递减排列//归并La和Lb得到新的线性表Lc,Lc的数据元素也按值非递减排列LinkListpa,pb,pc;pa=La->next;pb=Lb->next;Lc=pc=La;while(pa&&pb){if(pa->data<=pb->data){pc->next=pa;pc=pa;pa=pa->next;}else{pc->next=pb;pc=pb;pb=pb->next;}}pc->next=pa?pa:pb;free(Lb);}第三章栈和队列栈的操作1、初始化一个顺序栈(从键盘或者数组中导入数据)StatusInitStack(SqStack&S){S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));if(!S.base)exit(OVERFLOW);S.top=S.base;S.stacksize=STACK_INIT_SIZE;returnOK;}2、判断栈是否为空StatusStackEmpty(SqStackS){//若栈S为空栈,则返回TRUE;否则返回FALSEif(S.top==S.base)returnTRUE;elsereturnFALSE;}3、取栈顶元素StatusGetTop(SqStackS,SElemType&e)//在教科书第47页{//若栈S不空,则用e返回S的栈顶元素,并返回OK;否则返回ERRORif(S.top==S.base)returnERROR;e=*(S.top-1);returnOK;}4、元素进栈StatusPush(SqStack&S,SElemTypee){//插入元素e为栈S新的栈顶元素。if(S.top-S.base>=S.stacksize){S.base=(SElemType*)realloc(S.base,(S.stacksize+STACK_INCREMENT)*sizeof(SElemType));if(!S.base)exit(OVERFLOW);S.top=S.base+S.stacksize;}S.stacksize+=STACK_INCREMENT;*S.top++=e;returnOK;}5、元素出栈StatusPop(SqStack&S,SElemType&e)//在教科书第47页{//若栈S不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERRORif(S.top==S.base)returnERROR;e=*--S.top;returnOK;}6、计算栈中数据元素的个数intStackLength(SqStackS){//返回栈S的元素个数,即栈的长度returnS.top-S.base;}递归1、递归实现阶乘intf(intn){if(n==0)return1;elsereturn(n*f(n-1));}2、递归实现链表的输出(正序、逆序)voidRevPrint(LNode*head){if(NULL!=head){if(NULL!=head->next){RevPrint(head->next);}printf("%d\t",head->data);}}//逆序后输出voidPrintList_L(LinkListL){if(L!=NULL){printf("%d\t",L->data);PrintList_L(L->next);}}//正序输出3、递归实现链表的逆序LinkListreverse(LinkListp){LinkListq,h;if(p->next==NULL)returnp;else{q=p->next;h=reverse(q);q->next=p;p->next=NULL;returnh;}}4、递归求链表的长度intListLength(LinkListL){intlen;if(!L)return0;len=1+ListLength(L->next);returnlen;}第六章树和二叉树二叉树的操作(采用二叉链式存储)1、二叉树的建立StatusCreateBiTree(BiTree&T){//算法6.4:按先序次序输入二叉树中结点的值(可为字符型或整型,在主程中定义),charch;scanf("%c",&ch);if(ch=='')T=NULL;else{if(!(T=(BiTNode*)malloc(sizeof(BiTNode))))exit(OVERFLOW);T->data=ch;CreateBiTree(T->lchild);CreateBiTree(T->rchild);}returnOK;}2、二叉树的遍历(四种)StatusPreOrderTraverse(BiTreeT,void(*Visit)(TElemType)){//初始条件:二叉树T存在,Visit是对结点操作的应用函数。修改算法6.1//操作结果:先序递归遍历T,对每个结点调用函数Visit一次且仅一次if(T){Visit(T->data);if(PreOrderTraverse(T->lchild,Visit))if(PreOrderTraverse(T->rchild,Visit))returnOK;}elsereturnOK;}StatusInOrderTraverse(BiTreeT,void(*Visit)(TElemType)){//初始条件:二叉树T存在,Visit是对结点操作的应用函数//操作结果:中序递归遍历T,对每个结点调用函数Visit一次且仅一次if(T){InOrderTraverse(T->lchild,Visit);Visit(T->data);if(InOrderTraverse(T->rchild,Visit))returnOK;}elsereturnOK;}StatusPostOrderTraverse(BiTreeT,void(*Visit)(TElemType)){//初始条件:二叉树T存在,Visit是对结点操作的应用函数//操作结果:后序递归遍历T,对每个结点调用函数Visit一次且仅一次if(T){PostOrderTraverse(T->lchild,Visit);if(PostOrderTraverse(T->rchild,Visit))Visit(T->data);returnOK;}elsereturnOK;}StatusLevelOrderTraverse(BiTreeT,void(*Visit)(TElemType)){//初始条件:二叉树T存在,Visit是对结点操作的应用函数//操作结果:层序递归遍历T(利用队列),对每个结点调用函数Visit一次且仅一次LinkQueueq;QElemTypea;if(T){InitQueue(q);EnQueue(q,T);while(!QueueEmpty(q)){DeQueue(q,a);Visit(a->data);if(a->lchild!=NULL)EnQueue(q,a->lchild);if(a->rchild!=NULL)EnQueue(q,a->rchild);}printf("\n");}returnOK;}3、求二叉树高度intTreeDepth(BiTreeT){intdepth,depthleft,depthright;if(!T)depth=0;else{depthleft=TreeDepth(T->lchild);depthright=TreeDepth(T->rchild);depth=1+(depthleft>depthright?depthleft:depthright);}returndepth;}4、交换二叉树的左右子树Statusexchange(BiTreeT)//先序遍历{if(T!=NULL)if(T->lchild!=NULL||T->rchild!=NULL){BiTree*p,*q;p=exchange(T->lchild);q=exchange(T->rchild);T->lchild=q;T->rchild=p;}returnT;}voidexchanget(BiTreeT)//后序遍历{if(T!=NULL)if(T->lchild!=NULL||T->rchild!=NULL){BiTree*p,*q;q=T->rchild;p=T->lchild;T->lchild=q;T->rchild=p;exchange(T->lchild);exchange(T->rchild);}returnT;}5、求二叉树的结点个数StatusNodeNum(BiTreeT,int*num){if(T){if(T->data)num++;if(NodeNum(T->lchild,num))if(NodeNum(T->rchild,num))returnOK;returnERROR;}elsereturnOK;}6、求二叉树的叶子数voidCountLeaf(BiTreeT,int&count){if(T){if(T->lchild==NULL&&T->rchild==NULL)count++;else{CountLeaf(T->lchild,count);CountLeaf(T->rchild,count);}}}7、按照目录形式输出二叉树StatusPrintTree(BiTreebt,intnLayer)/*按竖向树状打印的二叉树*/{if(bt!=NULL){PrintTree(bt->lchild,nLayer+1);for(inti=0;iprintf("-");printf("%c\n",bt->data);PrintTree(bt->rchild,nLayer+1);}returnOK;}树的操作(采用左孩子右兄弟存储结构)1、求树的深度intTreeDepth(CSTreeT){//初始条件:树T存在。操作结果:返回T的深度intmaxd,d;CSTreep;if(!T)return0;else{for(maxd=0,p=T->firstchild;p;p=p->nextsibling)if((d=TreeDepth(p))>maxd)maxd=d;returnmaxd+1;}}2、求树中给定结点的右兄弟TElemTypeRightSibling(CSTreeT,TElemTypecur_e){//初始条件:树T存在,cur_e是T中某个结点//操作结果:若cur_e有右兄弟,则返回它的右兄弟;否则返回“空”CSTreef;f=Point(T,cur_e);if(f&&f->nextsibling)returnf->nextsibling->data;elsereturn'';}3、树的后根遍历voidPostOrderTraverse(CSTreeT,void(*Visit)(TElemType)){CSTreep;if(T){if(T->firstchild){PostOrderTraverse(T->firstchild,Visit);p=T->firstchild->nextsibling;while(p){PostOrderTraverse(p,Visit);p=p->nextsibling;}}Visit(T->data);}第九章查找1、顺序查找法intSearch_Seq(SSTableST,KeyTypekey){//在顺序表ST中顺序查找其关键字等于key的数据元素。若找到,则函数值为
(p->next)||j>i-1)returnERROR;
q=p->next;p->next=q->next;
e=q->data;free(q);
5、单链表中按照结点的值查找结点的位序
intLocateElem(LinkListL,ElemTypee)
{//返回L中第1个值为e的数据元素的位序,若这样的数据元素不存在,则返回值为0
{i++;
if(p->data==e)
return0;
6、单链表中按照结点的位序返回结点的值
StatusGetElem(LinkListL,inti,ElemType&e)
{//L为带头结点的单链表的头指针。
当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR
intj=1;
while(p&&j
j++;
p||j>i)
e=p->data;
7、单链表的初始化(新建一个只含头结点的单链表)
StatusInitList(LinkList&L)
{//构造一个空的单链表L
L)
8、单链表的销毁(所有结点都要销毁)
StatusDestroyList(LinkList&L)
{//销毁单链表L
LinkListq;
while(L){
q=L->next;
free(L);
L=q;
9、求单链表的长度
intListLength(LinkListL)
{//返回L中数据元素个数
if(L==0)
10、两个单链表的归并
voidMergeList(LinkList&La,LinkList&Lb,LinkList&Lc)
{//已知线性表La和Lb中的数据元素按值非递减排列
//归并La和Lb得到新的线性表Lc,Lc的数据元素也按值非递减排列
LinkListpa,pb,pc;
pa=La->next;pb=Lb->next;
Lc=pc=La;
while(pa&&pb)
if(pa->data<=pb->data)
{pc->next=pa;
pc=pa;
pa=pa->next;
else{pc->next=pb;
pc=pb;
pb=pb->next;}
pc->next=pa?
pa:
pb;
free(Lb);
第三章栈和队列
栈的操作
1、初始化一个顺序栈(从键盘或者数组中导入数据)
StatusInitStack(SqStack&S)
S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
S.base)exit(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
2、判断栈是否为空
StatusStackEmpty(SqStackS)
{//若栈S为空栈,则返回TRUE;否则返回FALSE
if(S.top==S.base)returnTRUE;
elsereturnFALSE;
3、取栈顶元素
StatusGetTop(SqStackS,SElemType&e)//在教科书第47页
{//若栈S不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR
if(S.top==S.base)returnERROR;
e=*(S.top-1);
4、元素进栈
StatusPush(SqStack&S,SElemTypee)
{//插入元素e为栈S新的栈顶元素。
if(S.top-S.base>=S.stacksize)
{S.base=(SElemType*)realloc(S.base,
(S.stacksize+STACK_INCREMENT)*sizeof(SElemType));
S.top=S.base+S.stacksize;
}S.stacksize+=STACK_INCREMENT;
*S.top++=e;
5、元素出栈
StatusPop(SqStack&S,SElemType&e)//在教科书第47页
{//若栈S不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
e=*--S.top;
6、计算栈中数据元素的个数
intStackLength(SqStackS)
{//返回栈S的元素个数,即栈的长度
returnS.top-S.base;
递归
1、递归实现阶乘
intf(intn)
if(n==0)return1;
elsereturn(n*f(n-1));
2、递归实现链表的输出(正序、逆序)
voidRevPrint(LNode*head)
if(NULL!
=head)
=head->next)
RevPrint(head->next);
printf("%d\t",head->data);
}//逆序后输出
voidPrintList_L(LinkListL)
if(L!
=NULL)
printf("%d\t",L->data);
PrintList_L(L->next);
}//正序输出
3、递归实现链表的逆序
LinkListreverse(LinkListp)
LinkListq,h;
if(p->next==NULL)returnp;
q=p->next;
h=reverse(q);
returnh;
4、递归求链表的长度
{intlen;
L)return0;
len=1+ListLength(L->next);
returnlen;
第六章树和二叉树
二叉树的操作(采用二叉链式存储)
1、二叉树的建立
StatusCreateBiTree(BiTree&T)
{//算法6.4:
按先序次序输入二叉树中结点的值(可为字符型或整型,在主程中定义),
charch;
scanf("%c",&ch);
if(ch=='')T=NULL;
(T=(BiTNode*)malloc(sizeof(BiTNode))))exit(OVERFLOW);
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
2、二叉树的遍历(四种)
StatusPreOrderTraverse(BiTreeT,void(*Visit)(TElemType))
{//初始条件:
二叉树T存在,Visit是对结点操作的应用函数。
修改算法6.1
//操作结果:
先序递归遍历T,对每个结点调用函数Visit一次且仅一次
if(T)
Visit(T->data);
if(PreOrderTraverse(T->lchild,Visit))
if(PreOrderTraverse(T->rchild,Visit))
elsereturnOK;
StatusInOrderTraverse(BiTreeT,void(*Visit)(TElemType))
二叉树T存在,Visit是对结点操作的应用函数
中序递归遍历T,对每个结点调用函数Visit一次且仅一次
InOrderTraverse(T->lchild,Visit);
if(InOrderTraverse(T->rchild,Visit))
StatusPostOrderTraverse(BiTreeT,void(*Visit)(TElemType))
后序递归遍历T,对每个结点调用函数Visit一次且仅一次
PostOrderTraverse(T->lchild,Visit);
if(PostOrderTraverse(T->rchild,Visit))
StatusLevelOrderTraverse(BiTreeT,void(*Visit)(TElemType))
层序递归遍历T(利用队列),对每个结点调用函数Visit一次且仅一次
LinkQueueq;
QElemTypea;
{InitQueue(q);
EnQueue(q,T);
while(!
QueueEmpty(q))
{DeQueue(q,a);
Visit(a->data);
if(a->lchild!
EnQueue(q,a->lchild);
if(a->rchild!
EnQueue(q,a->rchild);
3、求二叉树高度
intTreeDepth(BiTreeT)
intdepth,depthleft,depthright;
T)depth=0;
depthleft=TreeDepth(T->lchild);
depthright=TreeDepth(T->rchild);
depth=1+(depthleft>depthright?
depthleft:
depthright);
returndepth;
4、交换二叉树的左右子树
Statusexchange(BiTreeT)//先序遍历
if(T!
if(T->lchild!
=NULL||T->rchild!
BiTree*p,*q;
p=exchange(T->lchild);
q=exchange(T->rchild);
T->lchild=q;
T->rchild=p;
returnT;
voidexchanget(BiTreeT)//后序遍历
q=T->rchild;
p=T->lchild;
exchange(T->lchild);
exchange(T->rchild);
5、求二叉树的结点个数
StatusNodeNum(BiTreeT,int*num)
if(T->data)num++;
if(NodeNum(T->lchild,num))
if(NodeNum(T->rchild,num))returnOK;
6、求二叉树的叶子数
voidCountLeaf(BiTreeT,int&count)
if(T->lchild==NULL&&T->rchild==NULL)
count++;
CountLeaf(T->lchild,count);
CountLeaf(T->rchild,count);
7、按照目录形式输出二叉树
StatusPrintTree(BiTreebt,intnLayer)/*按竖向树状打印的二叉树*/
if(bt!
PrintTree(bt->lchild,nLayer+1);
for(inti=0;iprintf("-");printf("%c\n",bt->data);PrintTree(bt->rchild,nLayer+1);}returnOK;}树的操作(采用左孩子右兄弟存储结构)1、求树的深度intTreeDepth(CSTreeT){//初始条件:树T存在。操作结果:返回T的深度intmaxd,d;CSTreep;if(!T)return0;else{for(maxd=0,p=T->firstchild;p;p=p->nextsibling)if((d=TreeDepth(p))>maxd)maxd=d;returnmaxd+1;}}2、求树中给定结点的右兄弟TElemTypeRightSibling(CSTreeT,TElemTypecur_e){//初始条件:树T存在,cur_e是T中某个结点//操作结果:若cur_e有右兄弟,则返回它的右兄弟;否则返回“空”CSTreef;f=Point(T,cur_e);if(f&&f->nextsibling)returnf->nextsibling->data;elsereturn'';}3、树的后根遍历voidPostOrderTraverse(CSTreeT,void(*Visit)(TElemType)){CSTreep;if(T){if(T->firstchild){PostOrderTraverse(T->firstchild,Visit);p=T->firstchild->nextsibling;while(p){PostOrderTraverse(p,Visit);p=p->nextsibling;}}Visit(T->data);}第九章查找1、顺序查找法intSearch_Seq(SSTableST,KeyTypekey){//在顺序表ST中顺序查找其关键字等于key的数据元素。若找到,则函数值为
printf("-");
printf("%c\n",bt->data);
PrintTree(bt->rchild,nLayer+1);
树的操作(采用左孩子右兄弟存储结构)
1、求树的深度
intTreeDepth(CSTreeT)
树T存在。
操作结果:
返回T的深度
intmaxd,d;
CSTreep;
T)return0;
for(maxd=0,p=T->firstchild;p;p=p->nextsibling)
if((d=TreeDepth(p))>maxd)maxd=d;
returnmaxd+1;
2、求树中给定结点的右兄弟
TElemTypeRightSibling(CSTreeT,TElemTypecur_e)
树T存在,cur_e是T中某个结点
若cur_e有右兄弟,则返回它的右兄弟;否则返回“空”
CSTreef;
f=Point(T,cur_e);
if(f&&f->nextsibling)
returnf->nextsibling->data;
return'';
3、树的后根遍历
voidPostOrderTraverse(CSTreeT,void(*Visit)(TElemType))
if(T->firstchild)
PostOrderTraverse(T->firstchild,Visit);
p=T->firstchild->nextsibling;
PostOrderTraverse(p,Visit);
p=p->nextsibling;
第九章查找
1、顺序查找法
intSearch_Seq(SSTableST,KeyTypekey)
{//在顺序表ST中顺序查找其关键字等于key的数据元素。
若找到,则函数值为
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1