数据结构

  • 格式:doc
  • 大小:43.00 KB
  • 文档页数:11

《数据结构上机习题》学生姓名:________ 学号:__________ 班级:____________ 专业:__________ 指导教师:________提交日期:2010-12-12ⅩⅩ大学目录一、上机习题1.线性表:(一)线性表的基本操作(二)插入(三)删除(四)归并2.线性链表:(一)线性表的基本操作(二)插入(三)删除(四)归并二、总结与心得(一)、上机习题1.线性表#include <malloc.h>//malloc#include <stdio.h>#include <stdlib.h>//exit#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2typedef int Status;//类定义状态typedef int Elemtype;#define LIST_INIT_SIZE 100#define LISTINCREMENT 10typedef struct{Elemtype *elem;int length;int listsize;}SqList;Status InitList(SqList &L)//构造一个空的线形表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;}Status ListInsert(SqList &L,int i,Elemtype e)//插入{if(i<1||i>L.length+1) return ERROR;if(L.length>=L.listsize){Elemtype *newbase;newbase=(Elemtype*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(Elemtype));if(!newbase)exit (OVERFLOW);L.elem=newbase;L.listsize+=LISTINCREMENT;}int *q,*p;q=&(L.elem[i-1]);for(p=&(L.elem[L.length-1]);p>=q;--p)*(p+1)=*p;*q=e;++L.length;return OK;}Status ListDelete(SqList &L,int i,Elemtype &e)//删除{if(i<1||i>L.length+1) return ERROR;int *p,*q;p=&(L.elem[i-1]);//p为被删除元素的位置e=*p;//被删除元素的值赋给eq=L.elem+L.length-1;//表尾元素的位置for(++p;p<=q;++p) ////被删除元素的值赋给e*(p-1)=*p;--L.length;return OK;}void MergeList(SqList &La,SqList &Lb,SqList &Lc){//对俩个已知有序表进行非递减排序int *pa,*pb,*pc,*pa_last,*pb_last;pa=La.elem; pb=Lb.elem;Lc.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++;while(pb<=pb_last) *pc++=*pb++;}Status Listempty(SqList &L)//判空{if(L.length==0)return TRUE;else return FALSE;}Status ListLength(SqList &L)//求表长{if(Listempty(L)==0)return L.length;}Status GetElem(SqList &L,int i)//取出表中指定元素{Elemtype e;e=L.elem[i-1];return e;}Status compare(Elemtype m,Elemtype n){if(m==n)return 1;else return 0;}Status LocateElem(SqList L,Elemtype e){//查找,定位。

若找到,返回在L中的位序,否则返回0 int i=1;int *p=L.elem;//p的初值为第一个元素的存储位置while(i<=L.length&&!(*compare)(*p++,e)) ++i;if(i<=L.length) return i;else return 0;}void input(SqList &L)//输入表中各元素{int n;printf("输入表长n的值:");scanf("%d",&n);//n为需要的表长printf("输入表中%d个元素:\n",n);int i;for(i=0;i<n;i++)scanf("%d",&L.elem[i]);L.length=n;}void output(SqList &L)//输出表中各元素{int n=L.length;printf("输出L表中%d元素为:\n",n);for(int j=0;j<n;j++)printf("%d ",L.elem[j]);printf("\n");}void main(){int a,i,e;SqList L1,L2,L3;InitList(L1);InitList(L2);InitList(L3);//构造一个空的线形表Linput(L1);input(L2);output(L1);output(L2);printf("\n线形表的基本操作:\n");printf("\n求表长:L1的长度%d , L2的长度%d\n",ListLength(L1),ListLength(L2));printf("\n取出表中指定元素:输入i,取出L1中i位置的元素:\n");scanf("%d",&i);printf("\n取出表L1中指定元素值为:%d\n",GetElem(L1,i));printf("\n(一)、线形表的定位\n");printf("\n输入在L1中要查找的元素!!\n");scanf("%d",&e);a=LocateElem(L1,e);//查找e元素在L1中的位置printf("查找元素%d在L1中的位序为:%d\n",e,a);printf("\n(二)、线形表的归并\n");MergeList(L1,L2,L3);//对俩个已知有序表进行非递减排序printf("对俩个有序表L1,L2进行非递减排序,并输出新表L3:");output(L3);printf("\n(三)、线形表的插入\n");printf("\n输入i与元素e,把元素e插入到L1中i位置:\n");scanf("%d %d",&i,&e);ListInsert(L1,i,e);printf("\n");//向L1中插入元素output(L1);printf("\n(四)、线形表的删除\n");printf("\n输入i,删除L1中i位置的元素并赋给e:\n");scanf("%d",&i);ListDelete(L1,i,a);//向L1删除中元素printf("\n输出被删除的元素e:%d\n",e);//输出被删除的元素output(L1);}2.线性链表#include <malloc.h>//malloc#include <stdio.h>#include <stdlib.h>//exit#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2typedef int Status;//类定义状态typedef int Elemtype;#define LIST_INIT_SIZE 100#define LISTINCREMENT 10typedef struct LNode//定义一个新类型{ //结点类型Elemtype data;struct LNode *next;}LNode,*LinkList;Status ListDelete(LinkList &L,int i,Elemtype &e)//删除{LNode *p;LNode *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;}void MergeList(LinkList &La,LinkList &Lb,LinkList &Lc){//对俩个已知有序表进行非递减排序LNode *pa,*pb,*pc;Lc=(LinkList)malloc(sizeof(LNode));Lc->next=NULL;pc=Lc;pa=La->next;pb=Lb->next;while(pa&&pb){if(pa->data<=pb->data){La->next=pa->next;//截取点pa->next=pc->next;//将pa插入pc之后pc->next=pa;pc=pa;pa=La->next;}else{Lb->next=pb->next;//截取点pb->next=pc->next;//将pb插入pc之后pc->next=pb;pc=pb;pb=Lb->next;}}pc->next=pa?pa:pb;free(Lb);}Status InitList(LinkList &L)//构造一个空的线形链表L {L=(LinkList)malloc(sizeof(LNode));L->next=NULL;return OK;}void CreatList(LinkList &L)//初始化一个线形链表L {LNode *p,*q;int n;L=(LinkList)malloc(sizeof (LNode));L->next=NULL;//建立一个带头结点的单链表p=L;printf("输入一个线形链表的长度:");scanf("%d",&n);printf("输入链表中%d元素\n",n);for(int i=0;i<n;i++){q=(LinkList)malloc(sizeof(LNode));//生成新结点scanf("%d",&q->data);q->next=p->next;p->next=q;p=p->next;}}void output(LinkList L)//输出链表中各元素{LNode *p;p=L->next;printf("\n输出链表中所有元素:\n");while(p){printf("%d ",p->data);p=p->next;}printf("\n");}Status ListInsert(LinkList &L,int i,Elemtype e)//插入{LNode *p;LNode *s;p=L;int j=0;while(p&&j<i-1){p=p->next; ++j;//寻找第i-1个结点}if(!p||j>i-1) return ERROR;s=(LinkList)malloc(sizeof (LNode));//生成新结点s->data=e;s->next=p->next;p->next=s;output(L);return OK;}void main(){LinkList L1,L2,L3;int i,e,a;CreatList(L1);output(L1);//初始化一个线形链表CreatList(L2);output(L2);//初始化一个线形链表printf("\n(一)、线形链表的归并\n");MergeList(L1,L2,L3);//对俩个已知有序表进行非递减排序printf("对俩个有序链表L1,L2进行非递减排序,并输出新表L3:");output(L3);printf("\n(二)、线形链表的插入\n");printf("\n输入i与元素e,把元素e插入到L3中i位置:\n");scanf("%d %d",&i,&e);ListInsert(L3,i,e);printf("\n");//向L1中插入元素output(L3);printf("\n(三)、线形链表的删除\n");printf("\n输入i,删除L3中i位置的元素并赋给e:\n");scanf("%d",&i);ListDelete(L3,i,a);printf("\n");//向L1删除中元素printf("\n输出被删除的元素e:%d\n",e);//输出被删除的元素output(L3);}学号:2009072304 姓名:朱学青 班级:20090202By 朱学青 11 (二)总结与心得经过这几周的上机实验,我觉得自己编程的能力又上了一个层面,回想以前的上机课,我总是照搬笔记或者书本,对那些密密麻麻的程序式,我总是觉得脑子里似懂非懂。