数据结构线性表的基本操作及应用实验报告

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

实验日期2010.4.19 教师签字成绩
实验报告
【实验名称】第二章线性表的基本操作及应用
【实验目的】
(1)熟练掌握线性表的基本操作的实现;
(2)以线性表的各种操作(建立、插入、删除等)的实现为重点;
(3)通过本次实验加深对C语言的使用(特别是函数的参数调用、指针类型的应用和链表的建立等各种基本操作)。

【实验内容】
1.顺序表的基本操作(顺序表的插入、访问、删除操作)
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -1
typedef int ElemType;
typedef int Status;
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef struct{
ElemType *elem;
int length;
int listsize;
}SqList;
Status InitList_Sq(SqList *L){
int i,n;
L->elem = (ElemType * )malloc(LIST_INIT_SIZE*sizeof(ElemType));
if (! L->elem) exit (OVERFLOW);
printf("您希望您的顺序表有几个元素: ");
scanf("%d",&n);
printf("\n");
printf("输入您的%d个元素,以构建顺序表: \n",n);
for(i=1;i<=n;i++)
scanf("%d",&L->elem[i-1]);
L->length = n;
L->listsize = LIST_INIT_SIZE;
return OK;
}//InitList_Sq
Status PrintList_Sq(SqList L){
int i;
printf("顺序表中的元素为:");
for (i=1;i<=L.length;i++)
printf("%d ",L.elem[i-1]);
printf("\n");
return OK;
}//PrintList_Sq
int ListInsert_Sq(SqList* L,int i,ElemType x) //对顺序表进行插入操作{int j;
if (L->length==L->listsize)
{printf("\t\t\t顺序表已满");return 0;}
else
{
if (i<1||i>L->length)
{printf("\t\t\t位置不合法");return 0;}
else
{
for(j=L->length-1;j>=i-1;--j)
L->elem[j+1]=L->elem[j];
L->elem[i-1]=x;
L->length++;
return 1;
}
}
}
int ListDelete_Sq(SqList* L,int i) //对顺序表进行删除操作
{int j;
if (i<1||i>L->length)
{printf("\t\t\t不存在第i个元素");return 0;}
else
{
for (j=i-1;j<L->length;j++)
{
L->elem[j]=L->elem[j+1];
}
L->length--;
return 1;
}
}
int LocateElem(SqList *L, int i) {
if(i<1||i>L->length)return ERROR;
else return L->elem[i-1];
}
int scan()
{
int choose;
printf("选择要执行的基本操作:\n1.插入元素;2.删除元素;3.访问元素.\n");
printf("输入其他值退出程序……\n");
scanf("%d",&choose);
return(choose);
}
void main(){
SqList L;
ElemType e;
int i;
int quit=0;
if (InitList_Sq(&L)==OVERFLOW)
printf("分配失败,退出程序!");
printf("输出程序中的元素\n");
PrintList_Sq(L);
while(!quit)
switch(scan()){
case 1:printf("\n请输入你所需要插入的位置和你要插入的元素:");
printf("\n请输入i和e的值:");
scanf("%d%d",&i,&e);
if (ListInsert_Sq(&L,i,e)==OK) PrintList_Sq(L);break;
case 2:printf("\n请输入你所需要删除元素的位置:");
scanf("%d",&i);
if(ListDelete_Sq(&L,i)==OK) PrintList_Sq(L);break;
case 3:printf("请输入所要查找元素的位置:\n");
scanf("%d",&i);
if(LocateElem(&L,i))
printf("该位置元素的值为:%d!\n",LocateElem(&L,i));
else printf("该位置的元素不存在!\n");break;
default:quit=1;
printf("操作结束!");
printf("\n");
}
}
2.单向链表的基本操作(单向链表的插入、删除、查找以及并
表操作)
#include<stdio.h>
#include<malloc.h>
typedef int ElemType;
#define OK 1
#define ERROR 0
#define flag 0
typedef struct LNode
{
ElemType data;
struct LNode *next;
} LNode,*LinkList;
LinkList InitLinkList()
{
LinkList L;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
return L;
}
LinkList LocateLinkList(LinkList L,int i)
{
LinkList p;
int j;
p=L->next;
j=1;
while(p!=NULL&&j<i)
{
p=p->next; j++;
}
if (j==i)
return p;
else return NULL;
}
void LinkListInsert(LinkList L, int i, ElemType e)//插入元素
{
LinkList p,s;
int j;
j=1;
p=L;
while(p&&j<i)
{
p=p->next;
j++;
}
if(p==NULL||j>i)
printf("插入位置不正确\n");
else {s=(LNode *)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
printf("%d已插入到链表中\n",e);
}
}
void LinkListDelete(LinkList L,int i) //删除元素{
LinkList p,q;
int j;
j=1;
p=L;
while(p->next&&j<i)
{
p=p->next;
j++;
}
if(p->next==NULL)
printf("删除位置不正确\n");
else
{
q=p->next;
p->next=q->next;
free(q);
printf("第%d个元素已从链表中删除\n",i);
}
}
LinkList CreatLinkList( )//建立单向链表
{
LinkList L=InitLinkList(),p,r;
ElemType e;
r=L;
printf("请依次输入链表中的元素,输入0结束\n"); scanf("%d",&e);
while (e!=flag)
{
p=(LinkList)malloc(sizeof(LNode));
p->data=e;
r->next=p;
r=p;
scanf("%d",&e);
}
r->next=NULL;
return L;
}
int LinkListLength(LinkList L)
{
LinkList p;
int j;
p=L->next;
j=0;
while(p!=NULL)
{
j++;
p=p->next;
}
return j;
}
void LinkListPrint(LinkList L)
{
LinkList p;
p=L->next;
if(p==NULL) printf("单链表为空表\n");
else
{
printf("链表中的元素为:\n");
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
}
printf("\n");
}
void Mergelist_L(LinkList La,LinkList Lb,LinkList Lc) {
LNode *pa,*pb,*pc,*p;
pa=La->next;pb=Lb->next;
Lc=La;
pc=Lc;
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;
p=Lc->next;
printf("合并结果:");
while(p) {printf("%4d",p->data);p=p->next;}
free(Lb);
}
int scan()
{int d;
printf("请选择你所要执行的单向链表的基本操作:\n1.插入元素;2.删除元素;3.访问元素;4.两个单向链表的合并.\n");
printf("其他键退出程序……");
printf("\n");
scanf("%d",&d);
return(d);
}
void main()
{ LinkList La,Lb,Lc;
int quit=0;
int i,locate;
ElemType e;
LinkList L,p;
L=CreatLinkList();
while(!quit)
switch(scan())
{
case 1:
printf("请输入插入元素的位置和值(中间以空格或回车分隔):\n");
scanf("%d%d",&i,&e);
LinkListInsert(L,i,e);
LinkListPrint(L);
break;
case 2:
if(LinkListLength(L)==0)
printf("链表已经为空,不能删除\n\n");
else
{
printf("请输入待删除元素的位置:\n");
scanf("%d",&i);
LinkListDelete(L,i);
}
LinkListPrint(L);
break;
case 3:
printf("请输入待查询元素在链表中的位置:");
scanf("%d",&i);
p=LocateLinkList(L,i);
if(p)
printf("链表中第%d个元素的值为:%d\n",i,p->data);
else
printf("查询位置不正确\n\n");
break;
case 4:La=CreatLinkList();Lb=CreatLinkList();Mergelist_L( La, Lb, Lc);
printf("\n");
break;
default:quit=1;
printf("操作结束!");
printf("\n");
}
}
3.单向循环链表的基本操作(单向链表的插入、删除、查找操
作)
#include<stdio.h>
#include<malloc.h>
typedef int ElemType;
#define OK 1
#define ERROR 0
#define flag 0
typedef struct LNode
{
ElemType data;
struct LNode *next;
} LNode,*LinkList;
LinkList InitLinkList()
{
LinkList L;
L=(LinkList)malloc(sizeof(LNode));
L->next=L;
return L;
}
LinkList LocateLinkList(LinkList L,int i)
{
LinkList p;
int j;
p=L->next;
j=1;
while(p!=L&&j<i)
{
p=p->next; j++;
}
if (j==i)
return p;
else return NULL;
}
void LinkListInsert(LinkList L, int i, ElemType e)//插入元素{
LinkList p,s;
int j;
j=1;
p=L;
while(p->next!=L&&j<i)
{
p=p->next;
j++;
}
if(p==L||j>i)
printf("插入位置不正确\n");
else {s=(LNode *)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
printf("%d已插入到链表中\n",e);
}
}
void LinkListDelete(LinkList L,int i) //删除元素
{
LinkList p,q;
int j;
j=1;
p=L;
while(p->next!=L&&j<i)
{
p=p->next;
j++;
}
if(p->next==L)
printf("删除位置不正确\n");
else
{
q=p->next;
p->next=q->next;
free(q);
printf("第%d个元素已从链表中删除\n",i);
}
}
LinkList CreatLinkList( )//建立单向链表
{
LinkList L=InitLinkList(),p,r;
ElemType e;
r=L;
printf("请依次输入链表中的元素,输入0结束\n"); scanf("%d",&e);
while (e!=flag)
{
p=(LinkList)malloc(sizeof(LNode));
p->data=e;
r->next=p;
r=p;
scanf("%d",&e);
}
r->next=L;
return L;
}
int LinkListLength(LinkList L)
{
LinkList p;
int j;
p=L->next;
j=0;
while(p!=L)
{
j++;
p=p->next;
}
return j;
}
void LinkListPrint(LinkList L)
{
LinkList p;
p=L->next;
printf("链表中的元素为:\n");
while(p!=L)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
int scan()
{
int d;
printf("请选择你所要执行的单向链表的基本操作:\n1.插入元素;2.删除元素;3.访问元素.\n");
printf("其他键退出程序……");
printf("\n");
scanf("%d",&d);
return(d);
}
void main()
{
int quit=0;
int i;
ElemType e;
LinkList L,p;
L=CreatLinkList();
while(!quit)
switch(scan())
{
case 1:
printf("请输入插入元素的位置和值(中间以空格或回车分隔):\n");
scanf("%d%d",&i,&e);
LinkListInsert(L,i,e);
LinkListPrint(L);
break;
case 2:
if(LinkListLength(L)==0)
printf("链表已经为空,不能删除\n\n");
else
{
printf("请输入待删除元素的位置:\n");
scanf("%d",&i);
LinkListDelete(L,i);
}
LinkListPrint(L);
break;
case 3:
printf("请输入待查询元素在链表中的位置:");
scanf("%d",&i);
p=LocateLinkList(L,i);
if(p)
printf("链表中第%d个元素的值为:%d\n",i,p->data);
else
printf("查询位置不正确\n\n");
break;
default:quit=1;
printf("操作结束!");
printf("\n");
}
}
4.双向链表的基本操作(双向链表的插入、删除、查找以及并
表操作)
#include<stdio.h>
#include<malloc.h>
#define flag 0
typedef int status;
typedef int ElemType;
typedef struct DuLNode{
ElemType data;
struct DuLNode *prior;
struct DuLNode *next;
}DuLNode,*DuLinkList;
DuLinkList InitDuLinkList()
{
DuLinkList L;
L=(DuLinkList)malloc(sizeof(DuLNode));
L->next=L->prior=NULL;
return L;
}
DuLinkList CreatDuLinkList(){
DuLinkList L=InitDuLinkList(),p,r;
ElemType e;
r=L;
printf("请依次输入链表中的元素,输入0结束\n");
scanf("%d",&e);
while (e!=flag)
{
p=(DuLinkList)malloc(sizeof(DuLNode));
p->data=e;
r->next=p;
p->prior=r->next;
r=p;
scanf("%d",&e);
}
r->next=NULL;
return L;
}
void ListInsert_DuL(DuLinkList L, int i, ElemType e){ DuLinkList p,s;
int j;
j=1;
p=L;
while(p&&j<i)
{
p=p->next;
j++;
}
if(p==NULL||j>i)
printf("插入位置不正确\n");
else {s=(DuLinkList)malloc(sizeof(DuLNode));
s->data=e;
s->next=p->next; p->next->prior=s;
s->prior=p; p->next=s;
printf("%d已插入到双向链表中\n",e); }
}
void ListDelete_DuL(DuLinkList L,int i) //删除元素{
DuLinkList p,q;
int j;
j=1;
p=L;
while(p->next&&j<i)
{
p=p->next;
j++;
}
if(p->next==NULL)
printf("删除位置不正确\n");
else
{
q=p->next;
p->next=q->next;q->next->prior=p;
free(q);
printf("第%d个元素已从链表中删除\n",i); }
}
void LinkListPrint_DuL(DuLinkList L)
{
DuLinkList p;
p=L->next;
if(p==NULL) printf("双链表为空表\n");
else
{
printf("链表中的元素为:\n");
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
}
printf("\n");
}
int DuLinkListLength(DuLinkList L)
{
DuLinkList p;
int j;
p=L->next;
j=0;
while(p!=NULL)
{
j++;
p=p->next;
}
return j;
}
DuLinkList LocateDuLinkList(DuLinkList L,int i) {
DuLinkList p;
int j;
p=L->next;
j=1;
while(p!=NULL&&j<i)
p=p->next; j++;
}
if (j==i)
return p;
else return NULL;
}
void Mergelist_L(DuLinkList La,DuLinkList Lb,DuLinkList Lc)
{
DuLNode *pa,*pb,*pc,*p;
pa=La->next;pb=Lb->next;
Lc=La;
pc=Lc;
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;
p=Lc->next;
printf("合并结果:");
while(p) {printf("%4d",p->data);p=p->next;}
free(Lb);
}
int scan()
{
int d;
printf("请选择你所要执行的双向链表的基本操作:\n1.插入元素;2.删除元素;3.访问元素;4.两个双向链表的合并.\n");
printf("其他键退出程序……");
printf("\n");
scanf("%d",&d);
return(d);
}
void main()
{
int quit=0;
int i;
ElemType e;
DuLinkList L,p;
DuLinkList La,Lb,Lc;
L=CreatDuLinkList();
while(!quit)
{switch(scan())
case 1:
printf("请输入插入元素的位置和值(中间以空格或回车分隔):\n");
scanf("%d%d",&i,&e);
ListInsert_DuL(L,i,e);
LinkListPrint_DuL(L);
break;
case 2:
if(DuLinkListLength(L)==0)
printf("链表已经为空,不能删除\n\n");
else
{
printf("请输入待删除元素的位置:\n");
scanf("%d",&i);
ListDelete_DuL(L,i);
}
LinkListPrint_DuL(L);
break;
case 3:
printf("请输入待查询元素在链表中的位置:");
scanf("%d",&i);
p=LocateDuLinkList(L,i);
if(p)
printf("链表中第%d个元素的值为:%d\n",i,p->data);
else
printf("查询位置不正确\n\n");
break;
case 4:La=CreatDuLinkList();Lb=CreatDuLinkList();Mergelist_L( La, Lb, Lc);
printf("\n");
break;
default:quit=1;
printf("操作结束!");
printf("\n");}
}
5.双向循环链表的基本操作(双向循环链表的插入、删除以及
访问操作)
#include<stdio.h>
#include<malloc.h>
#define flag 0
typedef int status;
typedef int ElemType;
typedef struct DuLNode{
ElemType data;
struct DuLNode *prior;
struct DuLNode *next;
}DuLNode,*DuLinkList;
DuLinkList InitDuLinkList()
{
DuLinkList L;
L=(DuLinkList)malloc(sizeof(DuLNode));
L->next=L; L->prior=L;
return L;
}
DuLinkList CreatDuLinkList(){
DuLinkList L=InitDuLinkList(),p,r;
ElemType e;
r=L;
printf("请依次输入链表中的元素,输入0结束\n"); scanf("%d",&e);
while (e!=flag)
{
p=(DuLinkList)malloc(sizeof(DuLNode));
p->data=e;
r->next=p;
p->prior=r->next;
r=p;
scanf("%d",&e);
}
r->next=L; L->prior=r;
return L;
}
void ListInsert_DuL(DuLinkList L, int i, ElemType e){ DuLinkList p,s;
int j;
j=1;
p=L;
while(j<i)
{
p=p->next;
j++;
}
if(j>i)
printf("插入位置不正确\n");
else {s=(DuLinkList)malloc(sizeof(DuLNode));
s->data=e;
s->next=p->next; p->next->prior=s;
s->prior=p; p->next=s;
printf("%d已插入到双向循环链表中\n",e); }
}
void ListDelete_DuL(DuLinkList L,int i) //删除元素{
DuLinkList p,q;
int j;
j=1;
p=L;
while(p->next!=L&&j<i)
{
p=p->next;
j++;
}
if(p->next==L)
printf("删除位置不正确\n");
else
{
q=p->next;
p->next=q->next;q->next->prior=p;
free(q);
printf("第%d个元素已从双向循环链表中删除\n",i); }
}
void LinkListPrint_DuL(DuLinkList L)
{
DuLinkList p;
p=L->next;
if(p->next==L) printf("双链表为空表\n");
else
{
printf("链表中的元素为:\n");
while(p!=L)
{
printf("%d ",p->data);
p=p->next;
}
}
printf("\n");
}
int DuLinkListLength(DuLinkList L)
{
DuLinkList p;
int j;
p=L->next;
j=0;
while(p->next!=L)
{
j++;
p=p->next;
}
return j;
}
DuLinkList LocateDuLinkList(DuLinkList L,int i)
{
DuLinkList p;
int j=1;
p=L->next;
while(p->next!=L&&j<i)
{
p=p->next; j++;
}
if (j==i)
return p;
else return NULL;
}
int scan()
{int d;
printf("请选择你所要执行的双向链表的基本操作:\n1.插入元素;2.删除元素;3.访问元素.\n");
printf("其他键退出程序……");
printf("\n");
scanf("%d",&d);
return(d);
}
void main()
{ int quit=0;
int i,locate;
ElemType e;
DuLinkList L,p;
L=CreatDuLinkList();
while(!quit)
switch(scan())
{
case 1:
printf("请输入插入元素的位置和值(中间以空格或回车分隔):\n");
scanf("%d%d",&i,&e);
ListInsert_DuL(L,i,e);
LinkListPrint_DuL(L);
break;
case 2:
if(DuLinkListLength(L)==0)
printf("链表已经为空,不能删除\n\n");
else
{
printf("请输入待删除元素的位置:\n");
scanf("%d",&i);
ListDelete_DuL(L,i);
}
LinkListPrint_DuL(L);
break;
case 3:
printf("请输入待查询元素在链表中的位置:");
scanf("%d",&i);
p=LocateDuLinkList(L,i);
if(p)
printf("链表中第%d个元素的值为:%d\n",i,p->data);
else
printf("查询位置不正确\n\n");
break;
default:quit=1;
printf("操作结束!");
printf("\n");
}
}
【小结讨论】
1.通过实验,我加深了对C的工作环境及其基本操作,进一步掌握了基本函数的调用以及使用方法。

2.通过实验我能初步建立一个顺序表并实现顺序表的各种操作,如:顺序表简单的操作,还有有序表的表里、出入、删除等常规算法,这些知识的储存为接下来的数据结构实际操作打下基础。

相关文档
最新文档