当前位置:文档之家› 数据结构上机实验源文件

数据结构上机实验源文件

数据结构第一、二次上机:#include <stdio.h> #include <malloc.h> #include <stdlib.h>#define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0#define INFEASIBLE -1 #define OVERFLOW -2#define list_init_size 100 //线性表存储空间的初始分配量#define LISTINCREMENT 10 //线性表存储空间的分配增量typedef int Status; typedef intElemType;typedef struct{ ElemType *elem; //存储空间基址int length; //当前长度intlistsize; //当前分配的存储容量(以sizeof(ElemType)为单位)}SqList;Status InitList_Sq(SqList&L){ //构造一个空的线性表L L.elem =(ElemType * )malloc(list_init_size*sizeof(ElemType)); if(!L.elem )exit(OVERFLOW);//存储分配失败L.length =0; //空表长度为0 L.listsize =list_init_size;//初始存储容量return OK; }//Initlist_SqStatus ListInsert_Sq(SqList&L,inti,ElemType e){ //在顺序线性表L中第i个位置之前插入新的元素e,//i的合法值为1<=i<=ListLength_Sq(L)+1 ElemType *p,*q,*newbase; //定义指针if(i<1||i>L.length +1) return ERROR; //i值不合法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]); //q为插入位置for(p=&(L.elem [L.length -1]);p>=q;--p) *(p+1)=*p; //插入位置及之后的元素右移*q=e; //插入e ++L.length //表长增1 return OK; }//ListInsert_SqStatusListDelete_Sq(SqList&L,inti,ElemType&e){ //在顺序线性表L中删除第i个元素,并用e返回其值//i 的合法值为1<=i<=ListLength_Sq(L) ElemType *p,*q; //定义指针if((i<1) || (i>L.length )) return ERROR; //i值不合法p=&(L.elem [i-1]); //p为被删除元素的位置e=*p; //被删除元素的值赋给 e q=L.elem +L.length -1; //表尾元素的位置for(++p;p<=q;++p) *(p-1)=*p; //被删除元素之后的元素左移--L.length //表长减1 return OK; }//ListDelete_sqvoid display(SqList L) { //定义for循环函数inti; for(i=0;i<=L.length -1;i++) printf("%d\n",L.elem [i]); }intLocateElem_Sq(SqListL,ElemType e) { //在顺序线性表L中查找第1个值与e满足compare()的元素的位序//若找到,则返回其在L中的位序,否则返回0 ElemType *p; inti=1; //i的初值为第一个元素的位序p=L.elem //p的初值为第一个元素的存储位置while(i<=L.length&& *p++!=e) ++i;if(i<=L.length) return i; else return 0; }//LocateElem_SqvoidMergeList_Sq(SqListLa,SqListLb,SqList&Lc ){ //已知顺序线性表La和Lb的元素按值非递减排列//归并La和Lb得到新的顺序线性表Lc,Lc的元素也按非递减排列ElemType *pa,*pb,*pc,*pa_last,*pb_last;pa=La.elempb=Lb.elemLc.listsize=Lc.length=La.length +Lb.length pc=Lc.elem =(ElemType *)malloc(Lc.listsize *sizeof(ElemType)); if(!Lc.elem )exit(OVERFLOW); //存储分配失败pa_last=La.elem +La.length -1; pb_last=Lb.elem +Lb.length -1; while(pa<=pa_last&&pb<=pb_last){ //归并if(*pa<=*pb) *pc++=*pa++; else *pc++=*pb++; } while(pa<=pa_last) *pc++=*pa++; //插入La的剩余元素while(pb<=pb_last) *pc++=*pb++; //插入Lb的剩余元素}//MergeList_Sqvoid main() { /* SqList L;//定义线性表InitList_Sq(L);//调用空表//插入数据ListInsert_Sq(L,1,10); ListInsert_Sq(L,2,20); ListInsert_Sq(L,1,30); ListInsert_Sq(L,3,40); printf("插入后:\n"); display(L);//调用循环函数ListInsert_Sq(L,3,100);//在L表第三个位置插入100 printf("插入后:\n"); display(L);ElemType e;//定义e ListDelete_Sq(L,3,e);//删除L 表的第三个元素,用e表示printf("删除后:\n"); display(L); printf("被删除元素:%d\n\n\n\n",e); */SqListLa,Lb,Lc; InitList_Sq(La); ListInsert_Sq(La,1,3); ListInsert_Sq(La,2,5); ListInsert_Sq(La,3,8); ListInsert_Sq(La,4,11); printf("La插入后:\n"); display(La); InitList_Sq(Lb); ListInsert_Sq(Lb,1,2); ListInsert_Sq(Lb,2,6); ListInsert_Sq(Lb,3,8); ListInsert_Sq(Lb,4,9); ListInsert_Sq(Lb,5,11); ListInsert_Sq(Lb,6,15); ListInsert_Sq(Lb,7,20); printf("Lb插入后:\n"); display(Lb); MergeList_Sq(La,Lb,Lc); printf("归并后:\n"); display(Lc); printf("\n");int a=LocateElem_Sq( Lc, 5); printf("%d\n",a); }第三次上机:#include <stdio.h> #include <malloc.h>#define TRUE 1#define FALSE 0 #define OK 1 #define ERROR 0#define INFEASIBLE -1 #define OVERFLOW -2 typedef int Status; typedef intElemType;typedef struct LNode{ ElemType data; struct LNode *next; }LNOde,*LinkList;Status GetElem_L(LinkListL,inti,ElemType&e) { //L 为带头结点的单链表的头指针//当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR LinkList p; p=L->next; int j=1; //初始化,p指向第一个结点,j为计数器while(p&&j<i) { //顺指针向后查找,直到p指向第i个元素或p为空p=p->next; ++j; } if(!p||j>i) return ERROR; //第i个元素不存在e=p->data; //取第i个元素return OK; }//GetElem_LStatus ListInsert_L(LinkList&L,inti,ElemType e) { //在带头结点的单链线性表L中第i个位置之前插入元素e LinkListp,s; p=L; int j=0; while(p&&j<i-1) { p=p->next; ++j; } //寻找第i-1个结点if(!p||j>i-1) return ERROR; //i小于或者大于表长+1 s=(LinkList)malloc(sizeof(LNode)); //生成新结点s->data=e; s->next=p->next; //插入L中p->next=s; return OK; }//ListInsert_L Status ListDelete_L(LinkList&L,inti,ElemType&e) { //在带头结点的单链线性表L中,删除第i个元素,并由e返回其值LinkListp,q; p=L; int j=0; while(p->next&&j<i-1) { //寻找第i个结点,并令p 指向其前趋p=p->next;++j; } if(!(p->next)||j>i-1) return ERROR; //删除位置不合理q=p->next; p->next=q->next; //删除并释放结点e=q->data; free(q); return OK; }//ListDelete_Lvoid CreateList_L(LinkList&L,int n) { //逆位序输入n 个元素的值,建立带表头结点的单链线性表L LinkList p; L=(LinkList)malloc(sizeof(LNode)); L->next =NULL; //先建立一个带头结点的单链表for(inti=n;i>0;--i){ p=(LinkList)malloc(sizeof(LNode)); //生成新结点scanf("%d",&p->data); //输入元素值p->next=L->next L->next =p; //插入到表头}}//CreateList_Lvoid display(LinkList L) { LinkList p=L->next; //定义for循环函数while(p) { printf("%d,",p->data); p=p->next; } printf("\n"); }void main() {LinkList L;CreateList_L(L,3); display(L);ListInsert_L(L,2,100); display(L);ElemType e;ListDelete_L(L,2,e); display(L);printf("被删除的值=%d\n",e);GetElem_L(L,3,e);printf("获取的值=%d\n",e); }第四次上机#include <stdio.h> #include <malloc.h> #include <stdlib.h>#define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0#define INFEASIBLE -1 #define OVERFLOW -2typedef intSElemType; typedef int Status;#define STACK_INIT_SIZE 100 //存储空间初始分配量#define STRCKINCREMENT 10 //存储空间分配增量typedef struct{SElemType *base; //在栈构造之前和销毁之后,base的值为NULL SElemType *top; //栈顶指针intstacksize; //当前已分配的存储空间,以元素为单位}SqStack;Status InitStack(SqStack&S){ //构造一个空栈S S.base =(SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType)); if(!S.base )exit(OVERFLOW); //存储分配失败S.top =S.baseS.stacksize =STACK_INIT_SIZE; return OK; }//InitStack Status GetTop(SqStackS,SElemType&e){ //若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR if(S.top ==S.base ) return ERROR; e=*(S.top -1); return OK; }//GetTopStatus Push(SqStack&S,SElemType e){ //插入元素e为新的栈顶元素if(S.top - S.base>=S.stacksize ){ //栈满,追加存储空间S.base =(SElemType * )realloc(S.base ,(S.stacksize +STRCKINCREMENT) * sizeof(SElemType)); if(!S.base )exit(OVERFLOW); //存储分配失败S.top =S.base +S.stacksizeS.stacksize +=STRCKINCREMENT;}*S.top ++=e; return OK; }//PushStatus Pop(SqStack&S,SElemType&e){//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR if(S.top ==S.base )return ERROR; e=*--S.top return OK; }//PopStatus StackEmpty(SqStack S){ if(S.top==S.base) return TRUE; else return ERROR; }void conversion(){//对于输入的任意一个非负十进制整数,打印输出与其等值的八进制数SqStack S; int N; SElemType e; InitStack(S); //构造空栈scanf("%d",&N); while(N){ Push(S,N % 8); N=N/8; } printf("转换成八进制后的数为:"); while(!StackEmpty(S)){ Pop(S,e); printf("%d",e); } printf("\n"); }//conversionvoid main() { SqStack S; SElemTypee,x; InitStack(S); Push(S,5); Push(S,4); Push(S,3);Push(S,2); Push(S,1); GetTop(S,e); printf("栈顶元素为%d\n",e); printf("\n"); Pop(S,x); printf("删除的栈顶元素为%d\n",x); printf("\n"); printf("输入一个十进制数:"); conversion(); }第五次上机/*队列的链式存储*/ #include <stdio.h> #include <malloc.h> #include <stdlib.h>#define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0#define INFEASIBLE -1 #define OVERFLOW -2 typedef intQElemType; typedef int Status;typedef struct QNode{ QElemType data; struct QNode *next; }QNode,*QueuePtr;typedef struct{ QueuePtr front; //队头指针InitStack(S); Push(S,5); Push(S,4); Push(S,3);Push(S,2); Push(S,1); GetTop(S,e); printf("栈顶元素为%d\n",e); printf("\n"); Pop(S,x); printf("删除的栈顶元素为%d\n",x); printf("\n"); printf("输入一个十进制数:"); conversion(); }第五次上机/*队列的链式存储*/ #include <stdio.h> #include <malloc.h> #include <stdlib.h>#define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0#define INFEASIBLE -1 #define OVERFLOW -2 typedef intQElemType; typedef int Status;typedef struct QNode{ QElemType data; struct QNode *next; }QNode,*QueuePtr;typedef struct{ QueuePtr front; //队头指针free(p); return OK; }void disp(LinkQueue Q) { QueuePtr p; p=Q.front->next; //定义for 循环函数while(p) {printf("%d ",p->data); p=p->next; }printf("\n"); }void main() { LinkQueue Q; QElemType e; InitQueue(Q); printf("插入的元素为:\n"); EnQueue(Q,25); EnQueue(Q,5); EnQueue(Q,12); EnQueue(Q,60); EnQueue(Q,33); disp(Q); printf("删除队头元素后:\n"); DeQueue(Q,e); disp(Q); DestroyQueue(Q); if(DestroyQueue(Q)==1) printf("销毁队列成功!\n"); else printf("销毁队列失败!\n"); }附加:/*队列的顺序存储*/#define MAXQSIZE 100 //最大队列长度typedef struct{ QElemType *base //初始化的动态分配存储空间int front; //头指针,若队列不空,指向队列头元素int rear; //尾指针,若队列不空,指向队列尾元素的下一个位置}SqQueue;Status InitQueue(SqQueue&Q){ //构造一个空队列Q.base =(QElemType *)malloc(MAXQSIZE * sizeof(QElemType)); if(!Q.base )exit(OVERFLOW); //存储分配失败Q.front =Q.rear =0; return OK; } intQueueLenth(SqQueue Q){ //返回Q的元素个数,即队列的长度return(Q.rear -Q.front +MAXQSIZE)%MAXQSIZE; }Status EnQueue(SqQueue&Q,QElemType e){ //插入元素e为Q的新的队尾元素if((Q.rear +1) % MAXQSIZE ==Q.front) return ERROR; //队列满Q.base [Q.rear ]=e; Q.rear =(Q.rear +1) % MAXQSIZE; return OK; }Status DeQueue(SqQueue&Q,QElemType&e){ //若队列不为空,则删除Q的队头元素,用e返回其值,并返回OK;//否则返回ERROR if(Q.front ==Q.rear ) return ERROR; e=Q.base [Q.front ]; Q.front =(Q.front +1)% MAXQSIZE; return OK; } 第六次上机#include <stdio.h> #include <malloc.h> #include <stdlib.h>#define TRUE 1 #define FALSE 0#define OK 1 #define ERROR 0#define INFEASIBLE -1 #define OVERFLOW -2typedef int Status;typedef char TElemType;//二叉树的二叉链表存储表示typedef struct BiTNode{ TElemType data; struct BiTNode *lchild,*rchild; //左右孩子指针}BiTNode,*BiTree;Status CreateBiTree(BiTree&T){ //按先序次序输入二叉树中结点的值(一个字符),空格字符表示空树,//构造二叉树链表表示的二叉树T 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; }//CreateBiTreevoid PreOrderTraverse(BiTree T){ //先序遍历if(T){ printf("%c ",T->data ); //输出结点PreOrderTraverse(T->lchild ); PreOrderTraverse(T->rchild ); } }void InOrderTraverse(BiTree T){ //中序遍历if(T){ PreOrderTraverse(T->lchild );printf("%c ",T->data ); PreOrderTraverse(T->rchild ); } }void PostOrderTraverse(BiTree T){ //后序遍历if(T){ PreOrderTraverse(T->lchild ); PreOrderTraverse(T->rchild ); printf("%c ",T->data ); } }void main() {BiTree T;CreateBiTree(T);printf("\n PreOrder: \n "); PreOrderTraverse(T); }。

相关主题