顺序表的定义及基本操作和单链表的定义及基本操作

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构实验报告壹
题目一:顺序表的定义及基本操作题目二:单链表的定义及基本操作
班级:信息一班
姓名:
学号:
得分:____ (满分2.5分)
线性表
#include<iostream.h>
#define OVERFLOW -2
#define OK 1
#define ERROR 0
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef int ElemType;
typedef int status;
typedef struct
{
ElemType *elem;
int length;
int listsize;
}sqlist;
status lnitlist_sq(sqlist &L)
{
L.elem=new ElemType[LIST_INIT_SIZE];
if(!L.elem)
cout<<OVERFLOW;
L.length=0;
L.listsize=LIST_INIT_SIZE;
return OK;
}
int LocateElem(sqlist L, ElemType e)
{
int *p ;
p=L.elem; int i=1;
while(i<=L.length && *p++!=e) i++;
return i<=L.length ? i : 0;
}
status GetElem(sqlist L, int i, ElemType &e) {
if(i<1||i>L.length) return ERROR; //i非法
e=*(L.elem + i - 1);
return OK;
}
status ListInsert(sqlist &L, int i, ElemType e) {
//前插操作
int *newbase,*q,*p;
if(i<1||i>L.length+1) return ERROR; // i非法
if(L.length>=L.listsize)
{ //需要扩展数组
newbase=new ElemType[L.listsize+LISTINCREMENT];
if(!newbase)
cout<<OVERFLOW;
L.elem=newbase;
L.listsize+=LISTINCREMENT;
} //end if
q=L.elem+i-1; //令q指向ai
for( p=L.elem+L.length-1; p>=q; p--)
*(p+1)=*p; //右移一位
*q=e; //将e放入第i个元素的位置上
++L.length;
return OK;
} //ListInsert
status ListDelete(sqlist &L, int i, ElemType &e)
{
//删除顺序表的第i 个元素,用e返回被删元素的值int *p;
if(i<1||i>L.length) return ERROR; //i非法
p=&(L.elem[i-1]); //令指针p指向ai
e=*p;
for(++p; p<=L.elem+L.length-1; ++p)
*(p-1)=*p; //ai+1…an左移一位
--L.length ; //表的长度减1
return e;
} //ListDelete
status DestroyList(sqlist &L)
{
delete []L.elem;
return OK;
}
void ListTraverse(sqlist L)
{
if(L.length)
{
for(int i=0;i<L.length;i++)
{
cout<<L.elem[i]<<"\t";
}
}
else cout<<"此顺序表为空!"<<endl;
}
void main()
{
int m,n;
sqlist a;
lnitlist_sq(a);
cout<<"线性表初始长度:"<<a.length<<endl;
cout<<"请输入线性表的10个元素:"<<endl;
for(int i=0;i<10;i++,a.length++)
cin>>a.elem[i] ;
cout<<"线性表当前长度:"<<a.length<<endl;
cout<<"调用遍历函数"<<endl; ListTraverse(a );
cout<<"调用定位函数"<<endl;
cout<<LocateElem(a,9)<<endl;
cout<<"调用读表元函数"<<endl;
cout<<GetElem(a, 5, m)<<endl;
cout<<"在第五个元素前插入8"<<endl;
cout<<ListInsert(a, 5, 8)<<endl;
ListTraverse(a );cout<<endl;
cout<<"删除第五个元素并返回"<<endl;
cout<<ListDelete(a, 5, n)<<endl;
ListTraverse(a );cout<<endl;
cout<<"销毁线性表"<<DestroyList(a)<<endl;
}
单链表
#include<iostream.h>
#define OVERFLOW -2
#define OK 1
#define ERROR 0
#define LIST_INIT_SIZE 10
typedef int status;
typedef struct LNode {
int data ;
struct LNode *next ;
} LNode, *LinkList;
status InitList ( LinkList &L )
{
//L是带头结点的单链表的头指针
L=new LNode[LIST_INIT_SIZE]; //申请头结点
if(!L)
cout<<OVERFLOW;
L->next=NULL;
return OK;
}
status GetElem (LinkList L, int i, int &e)
{
//L是带头结点的单链表,读L的第i个元素,用e返回其值LNode *p;int j;
p=L->next; j=1; //指针p指向a1
while(p && j<i)
{p=p->next; j++;} //指针p右移i-1次
if(!p||j>i)return ERROR; //i非法!p--i太大,j>i--i太小
e=p->data;
return e;
} //GetElem
status ListLength ( LinkList L )
{
// L是带头结点的单链表
int n;LNode *p;
p=L->next; n=0;
while(p) {n++; p=p->next;}
cout<<n;
return OK;
} //ListLength O(n)
status ListInsert( LinkList &L, int i, int e )
{
// L是带头结点的单链表,在ai之前插入新结点e
LNode *s;LNode *p;int j;
p=L; j=0; //p指向头结点,j是计数器
while(p && j<i-1){ p=p->next; j++; } //令p指向ai-1
if (!p || j>i-1) return ERROR; //i非法
s=new LNode[LIST_INIT_SIZE+2];
s->data=e;
s->next=p->next; p->next=s; //修改指针
return OK;
} // ListInsert
status ListDelete( LinkList &L, int i, int &e )
{
// L是带头结点的单链表,删除ai,用参数e返回被删结点的值LNode *q,*p;int j;
p=L; j=0; //p指向头结点,j是计数器
while(p && j<i-1){p=p->next; j++;} //p指向ai-1 if (!(p->next) || j>i-1) return ERROR; // i非法
q=p->next; e=q->data;
p->next=q->next; delete(q); //修改指针
return OK;
} // ListInsert O(n)
int LocateElem(LinkList L, int e)
{
LNode *p;
p=L->next ;int i=1;
while(i && p->data!=e){ i++;*p++;}
return i;
}
void main()
{
int m,n ;
LinkList a;
LNode s1, s2, s3, s4, s5;
InitList (a );
a->next=&s1 ;
s1.next=&s2 ;
s2.next=&s3;
s3.next=&s4;
s4.next=&s5;
cout<<"请输入5个元素:"<<endl;
cin>>s1.data>>s2.data>>s3.data>>s4.data>>s5.data; cout<<"执行读表元操作"<<endl;
cout<<GetElem (a, 3, m)<<endl;
cout<<"执行插入操作"<<endl;
cout<<ListInsert(a, 3, 8 ) <<endl;
cout<<"执行删除操作"<<endl;
cout<<ListDelete( a, 3, n )<<endl;
cout<<"执行定位操作"<<endl;
cout<<LocateElem( a, 3)<<endl;
}。

相关文档
最新文档