实 验 报 告
课程名称: 实验名称: 姓 名: 专 业: 班 级: 学 号:
数据结构
线性表的顺序实现和链式实现
计算机科学与技术
计算机科学与技术学院
实验教学中心
2016 年 11月 29日
哈尔滨理工大学计算机科学与技术学院实验教学中心 实验报告
实验项目名称:线性表的顺序实现和链式实现
一、实验目的
1.理解顺序表的结构特点及有关概念,掌握顺序表建立、插入、删除的基本操作算法。 2.理解单链表的结构特点及有关概念,掌握单链表建立、插入、删除的基本操作算法。
二、实验内容
1.顺序表操作内容
1.1建立n个元素的顺序表,实现顺序表建立的基本操作。 1.2在指定位置插入一个元素,实现顺序表插入的基本操作。
1.3在顺序表中删除指定位置上的元素,实现顺序表的删除的基本操作。
2.链式表操作内容
2.1建立一个包括头结点和3个结点的(4,2,1)的单链表,实现单链表建立的基本操作。 2.2在已建好的单链表中的指定位置(x=2)插入一个结点3,实现单链表插入的基本操作。 2.3在一个包括头结点和4个结点的(4,3,2,1)的单链表的指定位置删除一个结点,实现单链表删除的基本操作。
三、实验用设备仪器及材料
计算机及CodeBlocks编程软件。
四、实验原理
利用C语言实现
五、实验操作步骤
1.顺序表的实现及操作代码 #include #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10 #define OK 1 #define ERROR -1 #define OVERFLOW -2 typedef int ElemType; typedef int Status; typedef struct 哈尔滨理工大学计算机科学与技术学院实验教学中心 实验报告 { ElemType *elem; int length; int listsize; } SqList; 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; } Status ListInsert_Sq(SqList &L,int i,ElemType e) { if(i<1||i>L.length+1) return ERROR; if(L.length>=L.listsize) { ElemType *newbase=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType)); if(!newbase)exit(OVERFLOW); L.elem=newbase; L.listsize += LISTINCREMENT; } ElemType *q=&(L.elem[i-1]); for(ElemType *p=&(L.elem[L.length-1]); p>=q; --p) *(p+1)=*p; *q=e; ++L.length; return OK; } Status ListDelete_Sq(SqList &L,int i,ElemType &e) { if(i<1||i>L.length+1) return ERROR; ElemType *p=&L.elem[i-1]; e=*p; ElemType *q=L.elem+L.length-1; for(++p;p<=q;++p) *(p-1)=*p; --L.length; return OK; } Status LocateElem_Sq(SqList L,ElemType e, Status(*compare)(ElemType,ElemType)) { int i=1; 哈尔滨理工大学计算机科学与技术学院实验教学中心 实验报告 ElemType *p=L.elem; while(i<=L.length&&!(*compare)(*p++,e))++i; if(i<=L.length) return i; else return 0; } Status compare(ElemType a,ElemType b) { if(a==b) return OK; else return 0; } void MergeList_Sq(SqList La,SqList Lb,SqList&Lc) { ElemType *pa=La.elem,*pb=Lb.elem,*pc; Lc.listsize=Lc.length=La.length+Lb.length; Lc.elem=(ElemType*)malloc(Lc.listsize*sizeof(ElemType)); if(!Lc.elem)exit(OVERFLOW); ElemType *pa_last=La.elem+La.length-1; ElemType *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++; } } void ClearList_Sq(SqList &L) { if(L.length!=0) L.length=0; } void DestoryList_Sq(SqList &L) { if(L.elem!=0) free(L.elem); L.elem=NULL; } void ListSort_Sq(SqList &L,int Sta,int End) { 哈尔滨理工大学计算机科学与技术学院实验教学中心 实验报告 ElemType tmp; for(int i=Sta-1;i tmp=L.elem[i]; L.elem[i]=L.elem[j]; L.elem[j]=tmp; } } } } void prin(SqList &L) { printf(\"当前线性表元素依次是:\\n\"); for(int i=0;i printf(\"\\n\\n\"); } int main() { int n,m,t; SqList L; InitList_Sq(L); printf(\"请输入要建立线性表的大小n:\\n\"); scanf(\"%d\ printf(\"请依次输入线性表元素:\\n\"); for(int i=1;i<=n;i++) { scanf(\"%d\ ListInsert_Sq(L,i,m); } while(true) { printf(\"请选择操作(输入0退出操作):\\n1、排序元素; 2插入元素;\\n\"); scanf(\"%d\ if(t==0)break; else if(t==1) { int Sta,End; 、删除元素; 3、 哈尔滨理工大学计算机科学与技术学院实验教学中心 实验报告 printf(\"请输入要排序元素的起始终止位置:\\n\"); scanf(\"%d%d\ ListSort_Sq(L,Sta,End); prin(L); } else if(t==2) { int loc,val; printf(\"请输入要删除元素的位置:\\n\"); scanf(\"%d\ ListDelete_Sq(L,loc,val); printf(\"删除元素的值:%d\\n\ prin(L); } else if(t==3) { int loc,val; printf(\"请输入要插入元素的位置及元素值:\\n\"); scanf(\"%d%d\ ListInsert_Sq(L,loc,val); prin(L); } } return 0; } 2.链式表的实现及操作 #include #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10 #define OK 1 #define ERROR -1 #define OVERFLOW -2 typedef int ElemType; typedef int Status; typedef struct LNode{ ElemType data; struct LNode *next; }LNode,*LinkList; Status GetElem_L(LinkList L,int i,ElemType &e) { LNode *p=L->next; int j=1; while(p&&j哈尔滨理工大学计算机科学与技术学院实验教学中心 实验报告 p=p->next;j++; } if(!p||j>i) return ERROR; e=p->data; return OK; } Status ListInsert_L(LinkList &L,int i,ElemType e) { LNode *p=L; int j=0; while(p&&j if(!p||j>i-1) { return ERROR; } LNode *s=(LinkList)malloc(sizeof(LNode)); s->data=e; s->next=p->next; p->next=s; return OK; } Status ListDelete_L(LinkList &L,int i,ElemType &e) { LNode *p=L; int j=0; while(p->next&&j if(!p->next||j>i-1) return ERROR; LNode *q=p->next; p->next=q->next; e=q->data; free(q); return OK; } void CreateList_L(LinkList &L,int n) { L=(LinkList)malloc(sizeof(LNode)); L->next=NULL; LNode *q; 哈尔滨理工大学计算机科学与技术学院实验教学中心 实验报告 q=L; for(int i=n;i>0;i--) { LNode *p=(LinkList)malloc(sizeof(LNode)); scanf(\"%d\ q->next=p; p->next=NULL; q=p; } } void MergeList_L(LinkList &La,LinkList &Lb,LinkList &Lc) { LNode *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(pb); } } void prin(LinkList &L) { LNode *p=L->next; printf(\"当前线性表的元素依次是:\\n\"); while(p) { printf(\"%d \ p=p->next; } printf(\"\\n\\n\"); } int main() { int n,t; LinkList L; printf(\"请输入要建立线性表的大小n:\\n\"); scanf(\"%d\ 哈尔滨理工大学计算机科学与技术学院实验教学中心 实验报告 printf(\"请依次输入每个元素的值:\\n\"); CreateList_L(L,n); while(true) { printf(\"请选择操作(输入0退出操作):\\n1、删除元素; 2、插入元素;\\n\"); scanf(\"%d\ if(t==0)break; else if(t==1) { int loc,val; printf(\"请输入要删除元素的位置:\\n\"); scanf(\"%d\ ListDelete_L(L,loc,val); printf(\"删除元素的值:%d\\n\ prin(L); } else if(t==2) { int loc,val; printf(\"请输入要插入元素的位置及元素值:\\n\"); scanf(\"%d%d\ ListInsert_L(L,loc,val); prin(L); } } return 0; } 哈尔滨理工大学计算机科学与技术学院实验教学中心 实验报告 六、实验结果分析 1.顺序表代码运行截图 2.链式表代码运行截图 因篇幅问题不能全部显示,请点此查看更多更全内容