您好,欢迎来到九壹网。
搜索
您的当前位置:首页湘潭大学 数据结构实验1 实验报告 源代码 线性表基本操作

湘潭大学 数据结构实验1 实验报告 源代码 线性表基本操作

来源:九壹网
“数据结构和算法II”课程实验报告

实验名称:线性表的存储结构定义及基本操作

班级 姓名 学号 实验日期: 实验机时:2 学时 实验成绩:

-------------------------------------------------------------------------------

一.实验目的:

1. 掌握线性表的逻辑特征

2. 掌握线性表顺序存储结构的特点,熟练掌握顺序表的基本运算 3. 熟练掌握线性表的链式存储结构定义及基本操作 4. 理解循环链表和双链表的特点和基本运算

5. 加深对栈结构的理解,培养解决实际问题的编程能力。

6. 加深对顺序存储数据结构的理解和链式存储数据结构的理解,逐步培养解决

实际问题的编程能力 二.实验内容: (1)基本实验内容:

建立顺序表,完成顺序表的基本操作:初始化、插入、删除、逆转、输出、销毁, 置空表、求表长、查找元素、判线性表是否为空;

建立单链表,完成链表(带表头结点)的基本操作:建立链表、插入、删除、查找、输出;其它基本操作还有销毁链表、将链表置为空表、求链表的长度、获取某位置结点的内容、搜索结点。 (2)扩展实验内容:

查前驱元素、查后继元素、顺序表合并,两个有序单链表的合并操作等。 三.程序及注释: 1. 顺序表:

#include #include #define TRUE 1

#define FALSE 0 #define OK 1 #define ERROR 0 #define OVERFLOW -2 #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10 typedef int status ; typedef int ElemType ; typedef struct{ ElemType *elem;

int length,listsize;}SqList; status InitList(SqList &L)//初始化

{L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType)); if(!L.elem) exit(OVERFLOW); L.listsize=LIST_INIT_SIZE; L.length=0; return OK;}

status Build(SqList &L)//建立表 {int i,n;

printf(\"请输入元素个数n和n个元素\\n\"); scanf(\"%d\

if(n>LIST_INIT_SIZE)//如果n大于当前空间

{L.elem=(ElemType *)realloc(L.elem,(n+LISTINCREMENT)*sizeof(ElemType)); if(!L.elem) exit(OVERFLOW); L.listsize=n+LISTINCREMENT;} for(i=0;ivoid Print(SqList &L)//输出表中元素和长度 {int i;

for(i=0;iprintf(\"\\n长度为:%d\\n\\n\void Tips()//提示函数

{printf(\"请选择你的想要的操作:\\n\"); printf(\"<1> 输出顺序表及顺序表的长度\\n\"); printf(\"<2> 删除值为x的结点\\n\"); printf(\"<3> 删除给定位置i的结点\\n\"); printf(\"<4> 将顺序表逆置\\n\"); printf(\"<5> 将顺序表按升序排序\\n\");

printf(\"<6> 将x插入到顺序表的适当位置上\\n\"); printf(\"<7> 将两个有序表合并\\n\"); printf(\"<0> 退出\\n\\n\");}

status ListDelete1(SqList &L,int x)//删除值为X的元素 {int i;

for(i=0;ifor(i++;istatus ListDelete2(SqList &L,int x)//删除第X个元素 {int i;

if(x<0||x>=L.length) return ERROR;

for(i=x+1;ivoid Inverse(SqList &L)//逆置函数 {int i,t;

for(i=0;i*(L.elem+i)=*(L.elem+L.length-i-1); *(L.elem+L.length-i-1)=t;}} void Sort(SqList &L)//冒泡排序(升序) {int i,j,t;

for(i=1;i*(L.elem+j+1)) {t=*(L.elem+j);

*(L.elem+j)=*(L.elem+j+1); *(L.elem+j+1)=t;}} printf(\"已按升序排列\\n\\n\");}

status ListInsert(SqList &L,int x)//将X插入,使仍然有序 {int i,k;

if(L.length>=L.listsize)

{L.elem=(ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType)); if(!L.elem) exit(OVERFLOW); L.listsize+=LISTINCREMENT;} for(i=0;iif(x<*(L.elem+i)) break; k=i;

for(i=L.length;i>k;i--) *(L.elem+i)=*(L.elem+i-1); *(L.elem+k)=x; L.length++; return OK;}

status Merger(SqList &L,SqList &Lb)//合并两个线性表 {int i,j,k; SqList Lc; InitList(Lc);

if(Lc.listsize{Lc.elem=(ElemType *)realloc(Lc.elem,(L.length+Lb.length+LISTINCREMENT)*sizeof(ElemType)); if(!L.elem) exit(OVERFLOW);

Lc.listsize=L.length+Lb.length+LISTINCREMENT;} i=j=k=0;

while(i{*(Lc.elem+k)=*(Lb.elem+j); k++;j++;}} while(i{*(Lc.elem+k)=*(L.elem+i); k++;i++;} while(j{*(Lc.elem+k)=*(Lb.elem+j); k++;j++;}

Lc.length=L.length+Lb.length; L=Lc; return OK;} int main() {int op,x,flag; SqList L,Lb; InitList(L); Build(L); Tips();

scanf(\"%d\ while(op) {switch(op) {case 1: Print(L);

break; case 2:

printf(\"请输入要删除的数据X:\\n\"); scanf(\"%d\ flag=ListDelete1(L,x); if(flag)

printf(\"删除成功!!\\n\\n\"); else

printf(\"元素不存在,删除失败!!\\n\\n\"); break; case 3:

printf(\"请输入要删除的位置i:\\n\"); scanf(\"%d\

flag=ListDelete2(L,x-1);//第i个元素对应的下标为i-1 if(flag)

printf(\"删除成功!!\\n\\n\"); else

printf(\"元素不存在,删除失败!!\\n\\n\"); break; case 4: Inverse(L); break; case 5: Sort(L); break; case 6:

printf(\"请输入要插入的数据X:\\n\"); scanf(\"%d\

flag=ListInsert(L,x); if(flag)

printf(\"插入成功!!\\n\\n\"); else

printf(\"插入失败!!\\n\\n\"); break; case 7:

printf(\"请输入Lb的内容:\\n\"); InitList(Lb); Build(Lb); flag=Merger(L,Lb); if(flag)

printf(\"合并成功!!\\n\\n\"); break;} Tips();

scanf(\"%d\

return 0;}

2. 单链表

typedef int ElementType; #ifndef _List_H #define _List_H struct Node;

typedef struct Node *PtrToNode; typedef PtrToNode List; typedef PtrToNode Position; List MakeEmpty( List L ); int IsEmpty( List L );

int IsLast( Position P, List L ); Position Find( ElementType X, List L ); void Delete( ElementType X, List L );

Position FindPrevious( ElementType X, List L ); void Insert( ElementType X, List L, Position P ); void DeleteList( List L ); Position Header( List L ); Position First( List L ); Position Advance( Position P ); ElementType Retrieve( Position P ); #endif

#include #include

#define Error( Str ) FatalError( Str )

#define FatalError( Str ) fprintf( stderr, \"%s\\n\struct Node

{ElementType Element; Position Next;};

List MakeEmpty( List L ) //创建空链表 {if( L != NULL ) DeleteList( L );

L = malloc( sizeof( struct Node ) ); if( L == NULL )

FatalError( \"Out of memory!\" ); L->Next = NULL; return L;}

int IsEmpty( List L )//判断链表是否为空 {return L->Next == NULL;} int IsLast( Position P, List L ) {return P->Next == NULL;}

Position Find( ElementType X, List L )//精确查找函数 {Position P;

int n=1; P = L->Next;

while( P != NULL && P->Element != X ) {P = P->Next;n++;} if(P==NULL)

printf(\"查找的成员不存在!!\\n\\n\"); else

printf(\"查找的成员位于链表第%d位\\n\\n\void Delete( ElementType X, List L )//精确删除函数 {Position P, TmpCell; P = FindPrevious( X, L ); if( !IsLast( P, L ) ) {TmpCell=P->Next;

P->Next=TmpCell->Next;

free( TmpCell );}}

Position FindPrevious( ElementType X, List L )//前驱查找函数 {Position P; P = L;

while( P->Next != NULL && P->Next->Element != X ) P = P->Next; return P;}

void Insert( ElementType X, List L, Position P )//元素插入函数 {Position TmpCell;

TmpCell = malloc( sizeof( struct Node ) ); if( TmpCell == NULL )

FatalError( \"Out of space\" ); TmpCell->Element = X; TmpCell->Next = P->Next; P->Next = TmpCell;}

void DeleteList( List L )//清空链表函数 {Position P, Tmp; P = L->Next; L->Next = NULL; while( P != NULL ) {Tmp = P->Next; free( P ); P = Tmp;} if(IsEmpty(L))

printf(\"链表清空成功!\\n\\n\");}

Position Header( List L )//表头调用函数 {return L;}

Position First( List L )//首元素调用函数 {return L->Next;}

Position Advance( Position P )//元素递进函数

{return P->Next;}

void show(List L)//显示链表函数 {if(!IsEmpty(L)) {Position p; p=First(L);

printf(\"当前链表成员如下:\\n\"); while(p!=NULL)

{printf(\"%d \

if(Advance(p)) p=Advance(p); else

{printf(\"\\n\\n\");break;}}}

else

printf(\"当前链表为空!!\\n\\n\"); } void join(List L) //插入函数调用函数 {int x,n,i;

Position p=Header(L);

printf(\"请输入需要插入的成员:\\n\"); scanf(\"%d\

printf(\"需要将成员插入到第几位呢?\\n\"); scanf(\"%d\ for(i=1;iNext;} Insert(x,L,p); show(L);}

void find(List L)//查找函数调用函数 {printf(\"请输入需要查找的成员:\\n\"); int x;

scanf(\"%d\ Find(x,L);}

void count(List L)//链表长度统计函数 {Position p; p=First(L); int n=0; while(p!=NULL) {n++;

if(Advance(p)) p=Advance(p); else break;}

printf(\"当前链表长度为:%d\\n\\n\void direction(List L)//位置访问函数 {int n,i;

Position p=Header(L);

printf(\"请输入n的值:\\n\"); scanf(\"%d\ for(i=0;iNext;}

printf(\"第%d位成员为:%d\\n\\n\void change(List L)//修改元素函数 {printf(\"请输入n的值:\\n\"); int x,n,i; scanf(\"%d\

printf(\"请输入修改后的值:\\n\"); scanf(\"%d\ Position p=Header(L); for(i=0;iNext;} p->Element=x; show(L);}

void deletion(List L)//删除函数调用函数 {printf(\"你要删除的成员是:\\n\"); int x;

scanf(\"%d\ Delete(x,L); show(L);} void main() { List L;

L=MakeEmpty(NULL);

printf(\"请输入需要插入的成员个数:\\n\"); int n;

scanf(\"%d\

printf(\"请输入需要插入的成员以空格隔开:\\n\"); int i;

Position p; p=Header(L); for(i=0;iscanf(\"%d\Insert(x,L,p); p=Advance(p);}

show(L);

printf(\"请选择需要进行的操作:\\n 1.计算链表长度\\n 2.取第n个位置成员\\n 3.修改第n个位置成员\\n 4.在第n位插入新成员\\n 5.删除成员\\n 6.搜索成员\\n 7.销毁链表\\n 8.退出\\n你输入的选项是:\"); scanf(\"%d\

while(n!=8) {switch(n)

{case 1:count(L);break;

case 2:direction(L);break; case 3:change(L);break; case 4:join(L);break; case 5:deletion(L);break; case 6:find(L);break; case 7:DeleteList(L);break;}

printf(\"请选择需要进行的操作:\\n 1.计算链表长度\\n 2.取第n个位置成员\\n 3.修改第n个位置成员\\n 4.在第n位插

入新成员\\n 5.删除成员\\n 6.搜索成员\\n 7.销毁链表\\n 8.退出\\n你输入的选项是:\"); scanf(\"%d\

四.运行结果: 1.顺序表:

3. 单链表:

五.实验心得:

通过这次写实验报告,我深切的理解了这门课的本质。刚开始学这门课时,当时还不清楚这门课程的目的,现在,我真正的理解了:数据结构像是身体的骨骼,而C是填充这骨骼的肉体,二者相结合才能使整个程序更加完整,健全。数据结构是个框架,模型,抽象数据类型中列举了各种操作,而所用的C语言,将各种操作描述出来构成算法。数据结构+算法=程序设计。 这次的实验报告,让我受益匪浅,不仅有知识方面的,还有生活和精神上的。总之,我会继续我的兴趣编程,相信在编程的过程中,能不断的提高自己。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 91gzw.com 版权所有 湘ICP备2023023988号-2

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务