1、南审数据结构课程教学设计个人说明任务题目一览度版第二章 线性表顺序表的操作1、 顺序表的建立(从键盘或者数组中导入数据)Status InitList(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; 2、 顺序表按照值查找位置int LocateElem(SqList L, ElemType e) /根据数据元素的值,返回它在线性
2、表L中的位置 int i=0; while (i=L.length)&(*(L.elem+i-1)!=e) i+; if (i=L.length) return i; else return(-1); 3、 顺序表按照序号查找元素的值Status GetElem(SqList L,int i,ElemType &e) /根据数据元素在线性表L中的位置,返回它的值 if(iL.length ) return ERROR; e=*(L.elem+i-1); return OK; 4、 顺序表数据元素的插入Status ListInsert(SqList &L,int i,ElemType e) /
3、 在L中第i个位置之前插入新的数据元素e,L的长度加1 ElemType *p,*q,*newbase; if(iL.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.elemi-1); for(p=&(L.elemL.length-1)
4、;p=q; -p) *(p+1)=*p; *q=e; +L.length ; return OK; 5、 顺序表数据元素的删除Status ListDelete(SqList &L,int i,ElemType &e) /删除L的第i个数据元素,并用e返回其值,L的长度减1 ElemType *q,*p; if(iL.length) return ERROR; p=&(L.elemi-1); e=*p; q=L.elem+L.length-1; for(+p;p=q;+p) *(p-1)=*p; -L.length; return OK; 6、 顺序表数据元素的输出Status visit(S
5、qList L) /按序输出顺序表的各个元素值 int i; for(i=1;i=L.length;i+) printf(%d ,*(L.elem+i-1); coutnext=NULL; printf(请输入%d个数据n,n); for(i=n;i0;-i) p=(LinkList)malloc(sizeof(LNode); scanf(%d,&p-data); p-next=L-next; L-next=p; void CreateList2(LinkList &L,int n) / 正位序输入n个元素的值,建立带表头结构的单链线性表 int i; LinkList p,q; L=(Lin
6、kList)malloc(sizeof(LNode); L-next=NULL; q=L; printf(请输入%d个数据n,n); for(i=1;idata); q-next=p; q=q-next; p-next=NULL;2、单链表的输出Status visit(LinkList L) /按序输出单链表的各个元素值 LinkList p=L-next; while(p) printf(%d ,p-data); p=p-next; printf(n); return OK; 3、单链表结点的插入Status ListInsert(LinkList &L,int i,ElemType e)
7、 LinkList p,s;p=L;int j=0; while(p&jnext; +j; if(!p|ji-1)return ERROR; s=(LinkList)malloc(sizeof(LNode); s-data=e;s-next=p-next; p-next=s; return OK;4、单链表结点的删除Status ListDelete(LinkList&L,int i,ElemType e) LinkList p,q;p=L; int j=0; while(p-next&jnext; +j; if(!(p-next)|ji-1)return ERROR; q=p-next;p-
8、next=q-next; e=q-data;free(q); return OK;5、单链表中按照结点的值查找结点的位序int LocateElem(LinkList L,ElemType e) / 返回L中第1个值为e 的数据元素的位序,若这样的数据元素不存在,则返回值为0 int i=0; LinkList p=L-next; while(p) i+; if(p-data=e) return i; p=p-next; return 0; 6、单链表中按照结点的位序返回结点的值Status GetElem(LinkList L,int i,ElemType &e) / L为带头结点的单链表的
9、头指针。当第i个元素存在时,其值赋给e并返回OK,否则返回 ERROR int j=1; LinkList p=L-next; while(p&jnext; j+; if(!p|ji) return ERROR; e=p-data; return OK; 7、单链表的初始化(新建一个只含头结点的单链表) Status InitList(LinkList &L) / 构造一个空的单链表L L=(LinkList)malloc(sizeof(LNode); if (!L) exit(OVERFLOW); L-next=NULL; return OK; 8、单链表的销毁(所有结点都要销毁)Statu
10、s DestroyList(LinkList &L) / 销毁单链表L LinkList q; while(L) q=L-next; free(L); L=q; return OK; 9、求单链表的长度int ListLength(LinkList L) / 返回L中数据元素个数 if(L=0) return 0; int i=0; LinkList p=L-next; while(p) i+; p=p-next; return i; 10、两个单链表的归并void MergeList(LinkList &La, LinkList &Lb, LinkList &Lc) /已知线性表La和Lb中
11、的数据元素按值非递减排列 /归并La和Lb得到新的线性表Lc,Lc的数据元素也按值非递减排列 LinkList pa,pb,pc; pa=La-next;pb=Lb-next; Lc=pc=La; while(pa&pb) if(pa-datadata) pc-next=pa; pc=pa; pa=pa-next; elsepc-next=pb; pc=pb; pb=pb-next; pc-next=pa?pa:pb; free(Lb);第三章 栈和队列栈的操作1、 初始化一个顺序栈(从键盘或者数组中导入数据)Status InitStack(SqStack &S) S.base=(SElem
12、Type*)malloc(STACK_INIT_SIZE*sizeof(SElemType); if(!S.base)exit(OVERFLOW); S.top=S.base; S.stacksize=STACK_INIT_SIZE; return OK;2、 判断栈是否为空Status StackEmpty(SqStack S) / 若栈S为空栈,则返回TRUE;否则返回FALSE if(S.top=S.base)return TRUE; else return FALSE;3、 取栈顶元素Status GetTop(SqStack S,SElemType &e) / 在教科书第47页 /
13、若栈S不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR if(S.top=S.base)return ERROR; e=*(S.top-1); return OK;4、 元素进栈Status Push(SqStack &S,SElemType e) / 插入元素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.bas
14、e+S.stacksize; S.stacksize+=STACK_INCREMENT; *S.top+=e; return OK;5、 元素出栈Status Pop(SqStack &S,SElemType &e) / 在教科书第47页 / 若栈S不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR if(S.top=S.base)return ERROR; e=*-S.top; return OK;6、 计算栈中数据元素的个数int StackLength(SqStack S) / 返回栈S的元素个数,即栈的长度 return S.top-S.base;递归1、 递归实现
15、阶乘int f(int n) if(n=0) return 1; else return (n*f(n-1);2、 递归实现链表的输出(正序、逆序)void RevPrint(LNode *head) if(NULL!=head) if(NULL!=head-next) RevPrint(head-next); printf(%dt,head-data); /逆序后输出void PrintList_L(LinkList L) if(L!=NULL) printf(%dt,L-data); PrintList_L(L-next); /正序输出3、 递归实现链表的逆序LinkList revers
16、e(LinkList p) LinkList q,h; if(p-next=NULL) return p; else q=p-next; h=reverse(q); q-next=p; p-next=NULL; return h; 4、 递归求链表的长度int ListLength(LinkList L) int len; if(!L) return 0; len=1+ListLength(L-next); return len;第六章 树和二叉树二叉树的操作(采用二叉链式存储)1、 二叉树的建立Status CreateBiTree(BiTree &T) / 算法6.4:按先序次序输入二叉树
17、中结点的值(可为字符型或整型,在主程中定义), char ch; 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); return OK;2、 二叉树的遍历(四种)Status PreOrderTraverse(BiTree T,void(*Visit)(TElemType) / 初始条件:二叉树T存在,Visit是对结点操作的应用函数。修改算
18、法6.1 / 操作结果:先序递归遍历T,对每个结点调用函数Visit一次且仅一次 if(T) Visit(T-data); if(PreOrderTraverse(T-lchild,Visit) if(PreOrderTraverse(T-rchild,Visit) return OK; else return OK;Status InOrderTraverse(BiTree T,void(*Visit)(TElemType) / 初始条件:二叉树T存在,Visit是对结点操作的应用函数 / 操作结果:中序递归遍历T,对每个结点调用函数Visit一次且仅一次 if(T) InOrderTrav
19、erse(T-lchild,Visit); Visit(T-data); if(InOrderTraverse(T-rchild,Visit) return OK; else return OK;Status PostOrderTraverse(BiTree T,void(*Visit)(TElemType) / 初始条件:二叉树T存在,Visit是对结点操作的应用函数 / 操作结果:后序递归遍历T,对每个结点调用函数Visit一次且仅一次 if(T) PostOrderTraverse(T-lchild,Visit); if(PostOrderTraverse(T-rchild,Visit)
20、 Visit(T-data); return OK; else return OK;Status LevelOrderTraverse(BiTree T,void(*Visit)(TElemType) / 初始条件:二叉树T存在,Visit是对结点操作的应用函数 / 操作结果:层序递归遍历T(利用队列),对每个结点调用函数Visit一次且仅一次 LinkQueue q; QElemType a; if(T) InitQueue(q); EnQueue(q,T); while(!QueueEmpty(q) DeQueue(q,a); Visit(a-data); if(a-lchild!=NUL
21、L) EnQueue(q,a-lchild); if(a-rchild!=NULL) EnQueue(q,a-rchild); printf(n); return OK;3、 求二叉树高度int TreeDepth(BiTree T) int depth,depthleft,depthright; if(!T) depth=0; else depthleft=TreeDepth(T-lchild); depthright=TreeDepth(T-rchild); depth=1+(depthleftdepthright?depthleft:depthright); return depth;4
22、、 交换二叉树的左右子树Status exchange(BiTree T) /先序遍历 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; return T; void exchanget(BiTree T) / 后序遍历 if(T!=NULL) if(T-lchild!=NULL|T-rchild!=NULL) BiTree *p,*q; q = T-rchild; p =
23、T-lchild; T-lchild = q; T-rchild = p; exchange(T-lchild); exchange(T-rchild); return T;5、 求二叉树的结点个数Status NodeNum(BiTree T,int *num) if (T) if(T-data) num+; if (NodeNum(T-lchild,num) if(NodeNum(T-rchild,num) return OK; return ERROR; else return OK; 6、 求二叉树的叶子数void CountLeaf(BiTree T,int &count) if(T
24、) if(T-lchild=NULL&T-rchild=NULL) count+; else CountLeaf(T-lchild, count); CountLeaf(T-rchild,count); 7、 按照目录形式输出二叉树 Status PrintTree(BiTree bt,int nLayer) /* 按竖向树状打印的二叉树 */ if(bt!=NULL) PrintTree(bt-lchild,nLayer+1); for(int i=0;idata); PrintTree(bt-rchild,nLayer+1); return OK;树的操作(采用左孩子右兄弟存储结构)1、
25、求树的深度int TreeDepth(CSTree T) / 初始条件:树T存在。操作结果:返回T的深度 int maxd,d; CSTree p; if(!T) return 0; else for(maxd=0,p=T-firstchild;p;p=p-nextsibling) if(d=TreeDepth(p)maxd) maxd=d; return maxd+1; 2、 求树中给定结点的右兄弟TElemType RightSibling(CSTree T,TElemType cur_e) / 初始条件:树T存在,cur_e是T中某个结点 / 操作结果:若cur_e有右兄弟,则返回它的右
26、兄弟;否则返回“空” CSTree f; f=Point(T,cur_e); if(f&f-nextsibling) return f-nextsibling-data; else return ;3、 树的后根遍历void PostOrderTraverse(CSTree T,void(*Visit)(TElemType) CSTree p; 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、顺序查找法 int Search_Seq(SSTable ST,KeyType key) / 在顺序表ST中顺序查找其关键字等于key的数据元素。若找到,则函数值为
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1