
二、实验内容和要求
三、源代码
1)顺序表的代码
2)单链表的代码
四、测试结果
1)顺序表的测试结果
2)单链表的测试结果
五、心得体会
实验一 线性表的基本操作及其应用
一、实验目的
1、帮助读者复习C++语言程序设计中的知识。
2、熟悉线性表的逻辑结构。
3、熟悉线性表的基本运算在两种存储结构上的实现。
4、掌握顺序表的存储结构形式及其描述和基本运算的实现。
5、熟练掌握动态链表结构及有关算法的设计
二、实验内容
题目一:顺序表的基本操作
[问题描述]
实现顺序表的建立、求长度,取元素、修改元素、插入、删除等顺序表的基本操作。
[基本要求]
(1)依次从键盘读入数据,建立带头结点的顺序表;
(2)输出顺序表中的数据元素
(3)求顺序表的长度;
(4)根据指定条件能够取元素和修改元素;
(5)实现在指定位置插入和删除元素的功能。
(6)根据算法,将两个有序的顺序表合并成一个有序顺序表。
[测试数据] 由学生任意指定。
题目二:单链表的基本操作
[问题描述]
实现带头结点的单链表的建立、求长度,取元素、修改元素、插入、删除等单链表的基本操作。
[基本要求]
(1)依次从键盘读入数据,建立带头结点的单链表;
(2)输出单链表中的数据元素
(3)求单链表的长度;
(4)根据指定条件能够取元素和修改元素;
(5)实现在指定位置插入和删除元素的功能。
(6)根据算法,将两个有序的单链表合并成一个有序单链表。
[测试数据]
由学生任意指定。
三、源代码
(一)顺序表的基本操作
#include using namespace std; #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef int Status; typedef int ElemType; #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10 typedef struct { //结构体 ElemType *elem; int length; int listsize; }SqList; SqList Lx; Status InitList_Sq(SqList &L) //分配空间 { L.elem=new ElemType[LIST_INIT_SIZE]; if(!L.elem)exit(OVERFLOW); L.length =0; L.listsize=LIST_INIT_SIZE; return OK; } Status ListInsert(SqList &L,int i,ElemType e) //插入新元素 { int *q,*p;ElemType *newbase; if(i<1 || i>L.length+1) return ERROR; if(L.length>=L.listsize) { newbase=new ElemType[L.listsize+LISTINCREMENT]; if(!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; return OK; } Status Listlength(SqList L) //长度 { int *p=L.elem; //判断线形表是否存在 while(p) { return (L.length); } } Status GetElem(SqList L, int i,ElemType &e) //取元素 { if(i<1 || i>L.length) return ERROR; else { e=L.elem[i-1]; return e; } } void MergeList(SqList La,SqList Lb,SqList &Lc) //合并 { ElemType ai,bj; InitList_Sq(Lc); int i=1,j=1,k=0; int La_len,Lb_len; La_len=Listlength(La); Lb_len=Listlength(Lb); while((i<=La_len)&&(j<=Lb_len)) { GetElem(La,i,ai);GetElem(Lb,j,bj); if(ai<=bj) { ListInsert(Lc,++k,ai);++i; } else { ListInsert(Lc,++k,bj);++j; } } while(i<=La_len) { GetElem(La,i++,ai); ListInsert(Lc,++k,ai); } while(j<=Lb_len) { GetElem(Lb,j++,bj); ListInsert(Lc,++k,bj); } } void show(SqList L,int i) //显示 { int j;ElemType k; cout<<"顺序表显示如下:"< cout< if(j==i-1 && i>0) { k=L.elem[j]; cout< void create(SqList &L,int n) //输入元素 { int e; for(int i=0;i L.elem[i]=e; L.length=i+1; } } Status ListDelete_Sq(SqList &L,int i,ElemType &e) //删除 { ElemType *p, *q; if(i<1 || i>L.length) return ERROR; p=&(L.elem[i-1]); e=*p; q=L.elem+L.length-1; for(++p;p<=q;++p) *(p-1)=*p; --L.length; return OK; } Status Listxiugei(SqList &L,int i,ElemType &e) //修改 { if(i<1 || i>L.length) return ERROR; else { L.elem[i-1]=e; return OK; } } void shuru(SqList &L1) //顺序表的创建 { int a; InitList_Sq(L1); cout<<"请输入顺序表的长度:"; cin>>a; cout<<"请输入顺序表的元素(共"< create(L1,a); show(L1,a); } void chaxun(SqList &L1) //取第i个位置的元素 { int j;ElemType e1; cout<<"请选择所要取出元素的位置:"; cin>>j; while(j<0||j>Listlength(L1)) { cout<<"输入有误,请重新输入"< cin>>j; } GetElem(L1,j,e1); cout<<"取出的元素为:"< { int a; int j; ElemType e1; a=L1.length; cout<<"请选择所要修改元素的位置:"; cin>>j; while(j<0||j>Listlength(L1)) { cout<<"输入有误,请重新输入"< cin>>j; } cout<<"要修改成的元素:"; cin>>e1; Listxiugei(L1,j,e1); cout<<"修改后的顺序表数据:"< } void shanchu(SqList &L1) //删除顺序表里的元素 { int a; int j; ElemType e1; a=L1.length; cout<<"请选择所要删除元素的位置:"; cin>>j; while(j<0||j>Listlength(L1)) { cout<<"输入有误,请重新输入"< cin>>j; } ListDelete_Sq(L1,j,e1); cout<<"修改后的顺序表数据:"< } void charu(SqList &L1) //插入元素到顺序表里 { int a; int j; ElemType e1; a=L1.length; cout<<"请选择所要插入元素的位置:"; cin>>j; while(j<0||j>Listlength(L1)) { cout<<"输入有误,请重新输入"< cin>>j; } cout<<"要插入的元素:"; cin>>e1; ListInsert(L1,j,e1);
