赞
踩
实验题1-1:实现并验证顺序表的各种基本操作
目的:领会顺序表存储结构和掌握顺序表中的各种基本运算算法设计。
内容:
1.首先,创建文件sqlist.h。
a)定义顺序表的结构体类型;
b)定义并实现顺序表的基本运算(详见线性表ADT描述)。
2.然后,创建文件exp1-1.c,引用(#include)头文件sqlist.h,依次完成以下内容,对第一步中实现的顺序表进行测试。
(1)初始化顺序表L;
(2)采用尾插法依次插入元素a,b,c,d,e;
(3)输出顺序表L;
(4)输出顺序表L的长度;
(5)判断顺序表L是否为空;
(6)输出顺序表L的第3个元素;
(7)输出元素a的位置;
(8)在第4个元素位置上插入元素f;
(9)输出顺序表L;
(10)删除L的第3个元素;
(11)输出顺序表L;
(12)释放顺序表L。
//sqlist.h #include<stdio.h> #include<malloc.h> #define Maxsize 50 typedef int ElemType; typedef struct { ElemType data[Maxsize]; int length; }SqList; //初始化线性表 void InitList(SqList *&L) { L=(SqList * )malloc(sizeof(SqList)); L->length=0; } //销毁线性表 void DestroyList(SqList *&L) { free(L); } //判断线性表是否为空表 bool ListEmpty(SqList *L) { return(L->length==0); } //求线性表的长度 int ListLength(SqList *L) { return(L->length); } //输出线性表 void DispList(SqList *L) { for(int i=0;i<L->length;i++) printf("%d ",L->data[i]); printf("\n"); } //求线性表中的某个数据元素值 bool GetElem(SqList *L,int i,ElemType &e) { if(i<1||i>L->length) return false; e=L->data[i-1]; return true; } //按元素值查找 int LocateElem(SqList *L,ElemType e) { int i=0; while(i<L->length&&L->data[i]!=e) i++; if(i>=L->length) return 0; else return i+1; } //插入数据元素 bool ListInsert(SqList *&L,int i,ElemType e) { int j; if(i<1||i>L->length+1||L->length==Maxsize) return false; i--; for(j=L->length;j>i;j--) { L->data[j]=L->data[j-1]; } L->data[i]=e; L->length++; return true; } //删除数据元素 bool ListDelete(SqList *&L,int i,ElemType &e) { int j; if(i<1||i>L->length) return false; i--; e=L->data[i]; for(j=i;j<L->length-1;j++) { L->data[j]=L->data[j+1]; } L->length--; return true; } //exp1-1.cpp #include<stdio.h> #include"sqlist.h" int main() { SqList *l; int a=2,b=3,c=4,d=5,e=6,f=9,k=1; printf("测试:初始化顺序表l\n"); InitList(l); printf("初始化成功!\n"); printf("采用尾插法依次插入元素a,b,c,d,e\n"); ListInsert(l,k,a); k++; ListInsert(l,k,b); k++; ListInsert(l,k,c); k++; ListInsert(l,k,d); k++; ListInsert(l,k,e); k++; printf("输出插入后的顺序表l\n"); DispList(l); printf("输出顺序表的长度:%d\n",ListLength(l)); printf("判断顺序表是否为空\n"); if(ListEmpty(l)) printf("顺序表为空\n"); else printf("顺序表不为空\n"); int q; GetElem(l,3,q); printf("输出顺序表l的第三个元素:%d\n",q); printf("输出元素a的位置:%d\n",LocateElem(l,a)); printf("在第四个元素位置上插入元素f\n"); ListInsert(l,4,f); printf("输出插入后的顺序表l\n"); DispList(l); printf("删除l的第三个元素\n"); int w; ListDelete(l,3,w); printf("输出删除第三个元素后的顺序表l\n"); DispList(l); printf("销毁顺序表l\n"); DestroyList(l); return 0; }
运行结果:
实验题1-2:实现并验证单链表的各种基本操作
目的:领会单链表存储结构和掌握单链表中的各种基本运算算法设计。
内容:
1.首先,创建文件linklist.h。
a)定义单链表的结构体类型;
b)实现单链表存储结构的基本运算(详见线性表ADT描述)。
2.然后,创建文件exp1-2.c,引用(#include)头文件linklist.h,依次完成以下内容,对第一步中实现的单链表进行测试。
(1)初始化单链表h;
(2)采用尾插法依次插入元素a,b,c,d,e;
(3)输出单链表h;
(4)输出单链表h长度;
(5)判断单链表h是否为空;
(6)输出单链表h的第3个元素;
(7)输出元素a的位置;
(8)在第4个元素位置上插入元素f;
(9)输出单链表h;
(10)删除h的第3个元素;
(11)输出单链表h;
(12)释放单链表h。
//linklist.h #include<stdio.h> #include<malloc.h> typedef int ElemType; typedef struct LNode { ElemType data; struct LNode *next; }LinkNode; //初始化线性表 void InitList(LinkNode *&L) { L=(LinkNode *)malloc(sizeof(LinkNode)); L->next=NULL; } //销毁线性表 void DestroyList(LinkNode *&L) { LinkNode *pre=L,*p=L->next; while(p!=NULL) { free(pre); pre=p; p=pre->next; } free(pre); } //判断线性表是否为空表 bool ListEmpty(LinkNode *L) { return(L->next==NULL); } //求线性表的长度 int ListLength(LinkNode *L) { int n=0; LinkNode *p=L; while(p->next!=NULL) { n++; p=p->next; } return(n); } //输出线性表 void DispList(LinkNode *L) { LinkNode *p=L->next; while(p!=NULL) { printf("%d ",p->data); p=p->next; } printf("\n"); } //求线性表中的某个数据元素值 bool GetElem(LinkNode *L,int i,ElemType &e) { int j=0; LinkNode *p=L; if(i<=0) return false; while(j<i&&p!=NULL) { j++; p=p->next; } if(p==NULL) { return false; } else { e=p->data; return true; } } //按元素值查找 int LocateElem(LinkNode *L,ElemType e) { int i=1; LinkNode *p=L->next; while(p!=NULL&&p->data!=e) { p=p->next; i++; } if(p==NULL) return(0); else return(i); } //插入数据元素 bool ListInsert(LinkNode *&L,int i,ElemType e) { int j=0; LinkNode *p=L,*s; if(i<=0) return false; while(j<i-1&&p!=NULL) { j++; p=p->next; } if(p==NULL) return false; else { s=(LinkNode * )malloc(sizeof(LinkNode)); s->data=e; s->next=p->next; p->next=s; return true; } } //删除数据元素 bool ListDelete(LinkNode *&L,int i,ElemType &e) { int j=0; LinkNode *p=L,*q; if(i<=0) return false; while(j<i-1&&p!=NULL) { j++; p=p->next; } if(p==NULL) return false; else { q=p->next; if(q==NULL) return false; e=q->data; p->next=q->next; free(q); return true; } } //exp1-2.cpp #include<stdio.h> #include"linklist.h" int main() { LinkNode *h; int a=1,b=2,c=3,d=4,e=5,f=7,k=1; printf("测试:初始化单链表h\n"); InitList(h); //初始化单链表h printf("初始化成功!\n"); printf("采用尾插法依次插入数据元素a,b,c,d,e\n"); ListInsert(h,k,a); //插入数据元素a k++; ListInsert(h,k,b); //插入数据元素b k++; ListInsert(h,k,c); //插入数据元素c k++; ListInsert(h,k,d); //插入数据元素d k++; ListInsert(h,k,e); //插入数据元素e k++; printf("输出插入后的单链表h\n"); DispList(h); //输出单链表h printf("输出单链表h长度: %d\n",ListLength(h)); printf("判断单链表h是否为空:\n"); if(ListEmpty(h)) printf("结果:单链表h为空\n"); else printf("结果:单链表h不为空\n"); int q; GetElem(h,3,q); printf("输出单链表h的第三个元素:%d\n",q); printf("输出元素a的位置:%d\n",LocateElem(h,a)); printf("在第四个位置插入数据元素f\n"); ListInsert(h,4,f); printf("插入f后输出单链表\n"); DispList(h); int w; printf("删除单链表h的第三个元素:\n"); ListDelete(h,3,w); printf("删除后输出单链表h\n"); DispList(h); printf("销毁单链表!"); DestroyList(h); return 0; }
运行结果:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。