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

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

实验日期2010.4.19 教师签字成绩

实验报告

【实验名称】第二章线性表的基本操作及应用

【实验目的】

(1)熟练掌握线性表的基本操作的实现;

(2)以线性表的各种操作(建立、插入、删除等)的实现为重点;

(3)通过本次实验加深对C语言的使用(特别是函数的参数调用、指针类型的应用和链表的建立等各种基本操作)。

【实验内容】

1.顺序表的基本操作(顺序表的插入、访问、删除操作)

#include

#include

#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;jlength;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

#include

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

{

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

{

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

{

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

#include

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

{

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

{

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

{

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

#include

#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

{

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

{

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

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

#include

#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

{

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

{

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

{

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

数据结构实验报告格式

《数据结构课程实验》大纲 一、《数据结构课程实验》的地位与作用 “数据结构”是计算机专业一门重要的专业技术基础课程,是计算机专业的一门核心的关键性课程。本课程较系统地介绍了软件设计中常用的数据结构以及相应的存储结构和实现算法,介绍了常用的多种查找和排序技术,并做了性能分析和比较,内容非常丰富。本课程的学习将为后续课程的学习以及软件设计水平的提高打下良好的基础。 由于以下原因,使得掌握这门课程具有较大的难度: (1)内容丰富,学习量大,给学习带来困难; (2)贯穿全书的动态链表存储结构和递归技术是学习中的重点也是难点; (3)所用到的技术多,而在此之前的各门课程中所介绍的专业性知识又不多,因而加大了学习难度; (4)隐含在各部分的技术和方法丰富,也是学习的重点和难点。 根据《数据结构课程》课程本身的技术特性,设置《数据结构课程实验》实践环节十分重要。通过实验实践内容的训练,突出构造性思维训练的特征, 目的是提高学生组织数据及编写大型程序的能力。实验学时为18。 二、《数据结构课程实验》的目的和要求 不少学生在解答习题尤其是算法设计题时,觉得无从下手,做起来特别费劲。实验中的内容和教科书的内容是密切相关的,解决题目要求所需的各种技术大多可从教科书中找到,只不过其出现的形式呈多样化,因此需要仔细体会,在反复实践的过程中才能掌握。 为了帮助学生更好地学习本课程,理解和掌握算法设计所需的技术,为整个专业学习打好基础,要求运用所学知识,上机解决一些典型问题,通过分析、设计、编码、调试等各环节的训练,使学生深刻理解、牢固掌握所用到的一些技术。数据结构中稍微复杂一些的算法设计中可能同时要用到多种技术和方法,如算法设计的构思方法,动态链表,算法的编码,递归技术,与特定问题相关的技术等,要求重点掌握线性链表、二叉树和树、图结构、数组结构相关算法的设计。在掌握基本算法的基础上,掌握分析、解决实际问题的能力。 三、《数据结构课程实验》内容 课程实验共18学时,要求完成以下六个题目: 实习一约瑟夫环问题(2学时)

C语言数据结构线性表的基本操作实验报告

实验一线性表的基本操作 一、实验目的与基本要求 1.掌握数据结构中的一些基本概念。数据、数据项、数据元素、数据类型和数据结构,以及它们之间的关系。 2.了解数据的逻辑结构和数据的存储结构之间的区别与联系;数据的运算与数据的逻辑结构的关系。 3.掌握顺序表和链表的基本操作:插入、删除、查找以及表的合并等运算。4.掌握运用C语言上机调试线性表的基本方法。 二、实验条件 1.硬件:一台微机 2.软件:操作系统和C语言系统 三、实验方法 确定存储结构后,上机调试实现线性表的基本运算。 四、实验内容 1.建立顺序表,基本操作包括:初始化,建立一个顺序存储的链表,输出顺序表,判断是否为空,取表中第i个元素,定位函数(返回第一个与x相等的元素位置),插入,删除。 2.建立单链表,基本操作包括:初始化,建立一个链式存储的链表,输出顺序表,判断是否为空,取表中第i个元素,定位函数(返回第一个与x相等的元素位置),插入,删除。 3.假设有两个按数据元素值非递减有序排列的线性表A和B,均以顺序表作为存储结构。编写算法将A表和B表归并成一个按元素值非递增有序(允许值相同)排列的线性表C。(可以利用将B中元素插入A中,或新建C表)4.假设有两个按数据元素值非递减有序排列的线性表A和B,均以单链表作为存储结构。编写算法将A表和B表归并成一个按元素值递减有序(即非递增有序,允许值相同)排列的线性表C。 五、附源程序及算法程序流程图 1.源程序 (1)源程序(实验要求1和3) #include #include #include #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10 typedef struct arr {

线性表实验报告

线性表实验报告 一、实验的目的要求 1、了解线性表的逻辑结构特性,以及这种结构特性在计算机内的两种存储结构。 2、掌握线性表的顺序存储结构的定义及其C语言实现。 3、掌握线性表的链式存储结构——单链表的定义及其C语言实现。 4、掌握线性表在顺序存储结构即顺序表中的各种基本操作。 5、掌握线性表在链式存储结构——单链表中的各种基本操作。 6、认真阅读和掌握实验的程序。 7、上机运行本程序。 8、保存和打印出程序的运行结果,并结合程序进行分析。 二、实验的主要内容 题目:请编制C语言,利用链式存储方式来实现线性表的创建、插入、删除和查找等操作。 具体地说,就是要根据键盘输入的数据建立一个单链表,并输出该单链表;然后根据屏幕 菜单的选择,可以进行数据的插入或删除,并在插入或删除数据后,再输出单链表;最后 在屏幕菜单中选择0,即可结束程序的运行。 三、解题思路分析 在链表中插入数据,不需要进行大量的数据移动,只需要找到插入点即可,可以采用后插入的算法,在插入点的后面添加结点。在链表中删除数据,先找到删除点,然后进行指针赋值操作。 四、程序清单 #include #include #include typedef int ElemType; typedef struct LNode {ElemType data; struct LNode *next; }LNode;

LNode *L; LNode *creat_L(); void out_L(LNode *L); void insert_L(LNode *L,int i,ElemType e); ElemType delete_L(LNode *L,ElemType e); int locat_L(LNode *L,ElemType e); void main() {int i,k,loc; ElemType e,x; char ch; do{printf("\n"); printf("\n 1.建立单链表"); printf("\n 2.插入元素"); printf("\n 3.删除元素"); printf("\n 4.查找元素"); printf("\n 0.结束程序运行"); printf("\n================================"); printf("\n 请输入您的选择(1,2,3,4,0)"); scanf("%d",&k); switch(k) {case 1:{L=creat_L(); out_L(L); }break; case 2:{printf("\n请输入插入位置:"); scanf("%d",&i); printf("\n请输入要插入元素的值:");

数据结构实验报告

数据结构实验报告 一.题目要求 1)编程实现二叉排序树,包括生成、插入,删除; 2)对二叉排序树进行先根、中根、和后根非递归遍历; 3)每次对树的修改操作和遍历操作的显示结果都需要在屏幕上用树的形状表示出来。 4)分别用二叉排序树和数组去存储一个班(50人以上)的成员信息(至少包括学号、姓名、成绩3项),对比查找效率,并说明在什么情况下二叉排序树效率高,为什么? 二.解决方案 对于前三个题目要求,我们用一个程序实现代码如下 #include #include #include #include "Stack.h"//栈的头文件,没有用上 typedefintElemType; //数据类型 typedefint Status; //返回值类型 //定义二叉树结构 typedefstructBiTNode{ ElemType data; //数据域 structBiTNode *lChild, *rChild;//左右子树域 }BiTNode, *BiTree; intInsertBST(BiTree&T,int key){//插入二叉树函数 if(T==NULL) { T = (BiTree)malloc(sizeof(BiTNode)); T->data=key; T->lChild=T->rChild=NULL; return 1; } else if(keydata){ InsertBST(T->lChild,key); } else if(key>T->data){ InsertBST(T->rChild,key); } else return 0; } BiTreeCreateBST(int a[],int n){//创建二叉树函数 BiTreebst=NULL; inti=0; while(i

数据结构_实验1_线性表的基本操作

实验1 线性表的基本操作 一、需求分析 目的: 掌握线性表运算与存储概念,并对线性表进行基本操作。 1.初始化线性表; 2.向链表中特定位置插入数据; 3.删除链表中特定的数据; 4.查找链表中的容; 5.销毁单链表释放空间; 二、概要设计 ●基础题 主要函数: 初始化线性表InitList(List* L,int ms) 向顺序表指定位置插入元素InsertList(List* L,int item,int rc)删除指定元素值的顺序表记录DeleteList1(List* L,int item) 删除指定位置的顺序表记录 DeleteList2(List* L,int rc) 查找顺序表中的元素 FindList(List L,int item) 输出顺序表元素OutputList(List L) 实验步骤: 1,初始化顺序表 2,调用插入函数 3,在顺序表中查找指定的元素 4,在顺序表中删除指定的元素 5,在顺序表中删除指定位置的元素 6,遍历并输出顺序表 ●提高题

要求以较高的效率实现删除线性表中元素值在x到y(x和y自定义)之间的所有元素 方法: 按顺序取出元素并与x、y比较,若小于x且大于y,则存进新表中。 编程实现将两个有序的线性表进行合并,要求同样的数据元素只出现一次。 方法: 分别按顺序取出L1,L2的元素并进行比较,若相等则将L1元素放进L中,否则将L 1,L2元素按顺序放进L。 本程序主要包含7个函数 主函数main() 初始化线性表InitList(List* L,int ms) 向顺序表指定位置插入元素InsertList(List* L,int item,int rc)删除指定元素值的顺序表记录DeleteList1(List* L,int item) 删除指定位置的顺序表记录 DeleteList2(List* L,int rc) 查找顺序表中的元素 FindList(List L,int item) 输出顺序表元素OutputList(List L) 提高题的程序 void Combine(List* L1,List* L2,List* L) void DeleteList3(List* L,int x,int y) 二、详细设计 初始化线性表InitList(List* L,int ms) void InitList(List* L,int ms) { L->list=(int*)malloc(LIST_INIT_SIZE*sizeof(int)); L->size=0; L->MAXSIZE=LIST_INIT_SIZE;

数据结构线性表实验报告

序号 数据结构实验报告 班级姓名同组者/ 成绩 日期 3.9指导教师 实验名称实验一线性表及其应用 一、实验目的 1、深刻理解线性表的逻辑特性及其顺序、链式存储方式的特点。 2、熟练掌握线性表的常用操作(建立、插入、删除、遍历等)在顺序、链式存储上的实现。 3、加深对C/C++等编程语言的相关知识点的理解(如结构体、指针、函数、引用参数等)。 二、实验内容 1、根据给定的整型数组,以尾插法建立一个单链表,并实现以下操作: ①查找:输入一个欲查找的整数,找到则显示第一个相匹配的整数在单链表中所处的位置,若不存在,则显示提示信息。 ②删除:输入一个欲删除的整数e ,若存在则在单链表中删除第一个值为 e 的元素。 ③插入:输入一个欲插入位置i 和欲插入元素e,将e 插入到第i 个整数之前(注意i 的合法性)。 A、算法思想 ①创建 head 为头结点指针,初始时head->next 为NULL ;tail 始终指向当前链表的最后一个元素,其初始时指向头结点;p 始终指向每次申请的新结点,修改p->data 为当前读入的整数;修改tail->next 为p ,修改tail 为p ;最后修改tail->next 为NULL ,。 ②插入 找到插入点的前驱(即第i-1 个结点)的指针p ;s 指向新申请的结点;修改s->data 为参数e,修改s->next 为p->next ,修改p->next 为s 。 ③查找 ……利用p进行遍历,直到节点的数据和所给的数据相同,输出节点的位置 ④删除 ……利用p进行遍历,并总是将p的前一节点的指针赋给pre,一旦找到,则删除节点并

退出循环,没有到话,反馈相关信息 B、算法源码 /* *线性表及其应用 */ #include using namespace std; typedef struct _LinkList { int elem; struct _LinkList* next; }LinkList; void InitList(LinkList *&link );//构造一个含有头结点的链表 bool InsertList(LinkList *&link,int i,int e);//在第i个位置之前插入包含元素e的新节点void GetTailPointer(LinkList *link,LinkList *&tail);//获得单链表尾结点指针 void AddList(LinkList *&link,int e);//根据将e以尾插法插入链表 void DisplayList(LinkList *link);//打印静态链表中的所有数据 void LocatedList(LinkList *link,int e);//查找e的位置 void DeleteList(LinkList *&link,int e);//删除所在节点 void MergeList(LinkList *linka,LinkList *linkb,LinkList *&linkc);//归并 void InitList(LinkList *&link )//构造一个含有头结点的链表 { LinkList *L,*head; head = (LinkList *)malloc(sizeof(LinkList)); head -> next = NULL; L = head; link = L; } void AddList(LinkList *&link,int e)//根据将e以尾插法插入链表 { LinkList *p =NULL; p =(LinkList *)malloc(sizeof(LinkList)); p -> elem = e; p->next = NULL; LinkList *tail = link;

数据结构实验一题目一线性表实验报告

北京邮电大学电信工程学院 数据结构实验报告 实验名称:实验1——线性表 学生姓名: 班级: 班内序号: 学号: 日期: 1.实验要求 1、实验目的:熟悉C++语言的基本编程方法,掌握集成编译环境的调试方法 学习指针、模板类、异常处理的使用 掌握线性表的操作的实现方法 学习使用线性表解决实际问题的能力 2、实验内容: 题目1: 线性表的基本功能: 1、构造:使用头插法、尾插法两种方法 2、插入:要求建立的链表按照关键字从小到大有序 3、删除 4、查找 5、获取链表长度 6、销毁 7、其他:可自行定义 编写测试main()函数测试线性表的正确性。 2. 程序分析 2.1 存储结构 带头结点的单链表

2.2 关键算法分析 1.头插法 a、伪代码实现:在堆中建立新结点 将x写入到新结点的数据域 修改新结点的指针域 修改头结点的指针域,将新结点加入链表中b、代码实现: Linklist::Linklist(int a[],int n)//头插法 {front=new Node; front->next=NULL; for(int i=n-1;i>=0;i--) {Node*s=new Node; s->data=a[i]; s->next=front->next; front->next=s; } } 2、尾插法

a、伪代码实现:a.在堆中建立新结点 b.将a[i]写入到新结点的数据域 c.将新结点加入到链表中 d.修改修改尾指针 b、代码实现: Linklist::Linklist(int a[],int n,int m)//尾插法 {front=new Node; Node*r=front; for(int i=0;idata=a[i]; r->next=s; r=s; } r->next=NULL; } 时间复杂度:O(n) 3、按位查找 a、伪代码实现: 初始化工作指针p和计数器j,p指向第一个结点,j=1 循环以下操作,直到p为空或者j等于1 b1:p指向下一个结点 b2:j加1 若p为空,说明第i个元素不存在,抛出异常 否则,说明p指向的元素就是所查找的元素,返回元素地址 b、代码实现 Node* Linklist::Get(int i)//得到指向第i个数的指针 {Node*p=front->next; int j=1; while(p&&j!=i)//p非空且j不等于i,指针后移 {p=p->next; j++;

数据结构实验报告全集

数据结构实验报告全集 实验一线性表基本操作和简单程序 1.实验目的 (1)掌握使用Visual C++ 6.0上机调试程序的基本方法; (2)掌握线性表的基本操作:初始化、插入、删除、取数据元素等运算在顺序存储结构和链表存储结构上的程序设计方法。 2.实验要求 (1)认真阅读和掌握和本实验相关的教材内容。 (2)认真阅读和掌握本章相关内容的程序。 (3)上机运行程序。 (4)保存和打印出程序的运行结果,并结合程序进行分析。 (5)按照你对线性表的操作需要,重新改写主程序并运行,打印出文件清单和运行结果 实验代码: 1)头文件模块 #include iostream.h>//头文件 #include//库头文件-----动态分配内存空间 typedef int elemtype;//定义数据域的类型 typedef struct linknode//定义结点类型 { elemtype data;//定义数据域 struct linknode *next;//定义结点指针 }nodetype; 2)创建单链表

nodetype *create()//建立单链表,由用户输入各结点data域之值,//以0表示输入结束 { elemtype d;//定义数据元素d nodetype *h=NULL,*s,*t;//定义结点指针 int i=1; cout<<"建立一个单链表"<> d; if(d==0) break;//以0表示输入结束 if(i==1)//建立第一个结点 { h=(nodetype*)malloc(sizeof(nodetype));//表示指针h h->data=d;h->next=NULL;t=h;//h是头指针 } else//建立其余结点 { s=(nodetype*) malloc(sizeof(nodetype)); s->data=d;s->next=NULL;t->next=s; t=s;//t始终指向生成的单链表的最后一个节点

线性表逆置(顺序表)实验报告

实验一:线性表逆置(顺序表)实验报告 (一)问题的描述: 实现顺序表的逆置算法 (二)数据结构的设计: 顺序表是线性表的顺序存储形式,因此设计如下数据类型表示线性表: typedef struct { ElemType *elem; /* 存储空间基址*/ int length; /* 当前长度*/ int listsize; /* 当前分配的存储容量(以sizeof(ElemType)为单位) */ }SqList; (三)函数功能、参数说明及概要设计: 1.函数Status InitList(SqList *L) 功能说明:实现顺序表L的初始化 算法设计:为顺序表分配一块大小为LIST_INIT_SIZE的储存空间 2.函数int ListLength(SqList L) 功能说明:返回顺序表L长度 算法设计:返回顺序表中的length变量 3.函数Status ListInsert(SqList *L,int i,ElemType e) 功能说明:将元素e插入到顺序表L中的第i个节点 算法设计:判断顺序表是否已满,已满则加空间,未满则继续,将元素e插入到第i个元素之前,并将后面的元素依次往后移 4.函数Status ListTraverse(SqList L,void(*vi)(ElemType*)) 功能说明:依次对L的每个数据元素调用函数vi() 算法设计:依次对L的每个数据元素调用函数vi() 5.函数void Exchange(SqList *L) 功能说明:实现顺序表L的逆置 算法设计:用for循环将顺序表L中的第i个元素依次与第(i+length)个元素交换6.函数void print(ElemType *c) 功能说明:打印元素c 算法设计:打印元素c 2. (四)具体程序的实现

数据结构实验报告模板

2009级数据结构实验报告 实验名称:约瑟夫问题 学生姓名:李凯 班级:21班 班内序号:06 学号:09210609 日期:2010年11月5日 1.实验要求 1)功能描述:有n个人围城一个圆圈,给任意一个正整数m,从第一个人开始依次报数,数到m时则第m个人出列,重复进行,直到所有人均出列为止。请输出n个人的出列顺序。 2)输入描述:从源文件中读取。 输出描述:依次从显示屏上输出出列顺序。 2. 程序分析 1)存储结构的选择 单循环链表 2)链表的ADT定义 ADT List{ 数据对象:D={a i|a i∈ElemSet,i=1,2,3,…n,n≧0} 数据关系:R={< a i-1, a i>| a i-1 ,a i∈D,i=1,2,3,4….,n} 基本操作: ListInit(&L);//构造一个空的单链表表L ListEmpty(L); //判断单链表L是否是空表,若是,则返回1,否则返回0. ListLength(L); //求单链表L的长度 GetElem(L,i);//返回链表L中第i个数据元素的值; ListSort(LinkList&List) //单链表排序 ListClear(&L); //将单链表L中的所有元素删除,使单链表变为空表 ListDestroy(&L);//将单链表销毁 }ADT List 其他函数: 主函数; 结点类; 约瑟夫函数 2.1 存储结构

[内容要求] 1、存储结构:顺序表、单链表或其他存储结构,需要画示意图,可参考书上P59 页图2-9 2.2 关键算法分析 结点类: template class CirList;//声明单链表类 template class ListNode{//结点类定义; friend class CirList;//声明链表类LinkList为友元类; Type data;//结点的数据域; ListNode*next;//结点的指针域; public: ListNode():next(NULL){}//默认构造函数; ListNode(const Type &e):data(e),next(NULL){}//构造函数 Type & GetNodeData(){return data;}//返回结点的数据值; ListNode*GetNodePtr(){return next;}//返回结点的指针域的值; void SetNodeData(Type&e){data=e;}//设置结点的数据值; void SetNodePtr(ListNode*ptr){next=ptr;} //设置结点的指针值; }; 单循环链表类: templateclass CirList { ListNode*head;//循环链表头指针 public: CirList(){head=new ListNode();head->next=head;}//构造函数,建立带头节点的空循环链表 ~CirList(){CirListClear();delete head;}//析构函数,删除循环链表 void Clear();//将线性链表置为空表 void AddElem(Type &e);//添加元素 ListNode *GetElem(int i)const;//返回单链表第i个结点的地址 void CirListClear();//将循环链表置为空表 int Length()const;//求线性链表的长度 ListNode*ListNextElem(ListNode*p=NULL);//返回循环链表p指针指向节点的直接后继,若不输入参数,则返回头指针 ListNode*CirListRemove(ListNode*p);//在循环链表中删除p指针指向节点的直接后继,且将其地址通过函数值返回 CirList&operator=(CirList&List);//重载赋

数据结构线性表实验报告

《数据结构》实验报告 专业: 学号: 姓名: 实验二线性表 【实验目的】 1.熟悉VC环境,学习如何使用C语言实现线性表的两种存储结构。 2.通过编程、上机调试,进一步理解线性表的基本概念,东运用C语言实现线性表基本操作。 3.熟练掌握线性表的综合应用问题。 【实验内容】 1、一个线性表有n个元素(n-MAXSIZE.MAXSIZE指线性表的最大长度),且递增有。现有一元素x要插入到线性表的适当位置上,并保持线性表原有的顺序不变。设计程序实现。要求:采用顺序存储表示实现;采用链式存储表示方法实现:比较两种方法的优劣。 2.从单链表中删除指定的元素x,若x在单链表中不存在,给出提示信息。 要求: ①指定的值x由键盘输入; ②程序能处理空链表的情况。 3.设有头结点的单链表,编程对表中的任意值只保留一个结点,删除其余值相同的结点。 要求: ①该算法用函数(非主函数)实现; ②在主函数中调用创建链表的函数创建一个单链表,并调用该函数,验证算法的正确性。LinkedList Exchange(LinkedList HEAD,p) //HEAD是单链表头结点的指针,p是链表中的一个结点。本算法将p所指结点与其后 继结点交换。 (q=head->next;//q是工作指针,指向链表中当前待处理结点。 pre=head;//pre是前驱结点指针,指向q的前驱。 while(q'=null &&q1=p)(pre=q;q=q->next;]/未到p结点,后移指针。 if(p->next==null)printf(“p无后继结点\n”);/p是链表中最后一个结点,无后继。 else/处理p和后继结点交换 (q=p->next;//暂存p的后继。 pre->next=q://p前驱结点的后继指向p的后继。 p->next=q->next;//p的后继指向原p后继的后继。 q->next=p://原p后继的后继指针指向p。} }//算法结束。 4.已知非空单链表第一个结点由head指出,请写一算法,交换p所指结点与其下一个结点在链表中的位置。 要求:

《数据结构》实验一 线性表及其应用

实验一线性表及其应用 一、实验目的 1.熟悉C语言的上机环境,进一步掌握C语言的结构特点。 2.掌握线性表的顺序存储结构的定义及C语言实现。 3.掌握线性表的链式存储结构——单链表的定义及C语言实现。 4.掌握线性表在顺序存储结构即顺序表中的各种基本操作。 5.掌握线性表在链式存储结构——单链表中的各种基本操作。 二、实验内容 1.顺序线性表的建立、插入及删除。 2.链式线性表的建立、插入及删除。 三、实验步骤 1.建立含n个数据元素的顺序表并输出该表中各元素的值及顺序表的长度。 2.利用前面的实验先建立一个顺序表L={21,23,14,5,56,17,31},然后在第i个位置插入元素68。 3.建立一个带头结点的单链表,结点的值域为整型数据。要求将用户输入的数据按尾插入法来建立相应单链表。 四、实现提示 1.由于C语言的数组类型也有随机存取的特点,一维数组的机内表示就是顺序结构。因此,可用C语言的一维数组实现线性表的顺序存储。 在此,我们利用C语言的结构体类型定义顺序表: #define MAXSIZE 1024 typedef int elemtype; /* 线性表中存放整型元素*/ typedef struct { elemtype vec[MAXSIZE]; int len; /* 顺序表的长度*/ }sequenlist; 将此结构定义放在一个头文件sqlist.h里,可避免在后面的参考程序中代码重复书写,另外在该头文件里给出顺序表的建立及常量的定义。 2. 注意如何取到第i个元素,在插入过程中注意溢出情况以及数组的下标与位序(顺序表中元素的次序)的区别。 3.单链表的结点结构除数据域外,还含有一个指针域。用C语言描述结点结构如下: typedef int elemtype; typedef struct node

线性表实验报告

一.实验名称 1.线性表基本操作; 2.处理约瑟夫环问题 二.试验目的: 1.熟悉C语言的上机环境,掌握C语言的基本结构。 2.定义单链表的结点类型。 3.熟悉对单链表的一些基本操作和具体的函数定义。 4.通过单链表的定义掌握线性表的链式存储结构的特点。 5.熟悉对单链表的一些其它操作。 三.实验内容 1.编制一个演示单链表初始化、建立、遍历、求长度、查询、插入、删除等操作的程序。 2.编制一个能求解除约瑟夫环问题答案的程序。 实验一线性表表的基本操作问题描述: 1. 实现单链表的定义和基本操作。该程序包括单链表结构类型以及对单链表操作 的具体的函数定义 程序中的单链表(带头结点)结点为结构类型,结点值为整型。 /* 定义DataType为int类型*/ typedef int DataType; /* 单链表的结点类型*/ typedef struct LNode {DataType data; struct LNode *next; }LNode,*LinkedList; LinkedList LinkedListInit() //初始化单链表 void LinkedListClear(LinkedList L) //清空单链表 int LinkedListEmpty(LinkedList L)//检查单链表是否为空 void LinkedListTraverse(LinkedList L)//遍历单链表 int LinkedListLength(LinkedList L)//求单链表的长度 /* 从单链表表中查找元素*/ LinkedList LinkedListGet(LinkedList L,int i) /* 从单链表表中查找与给定元素值相同的元素在链表中的位置*/ int LinkedListLocate(LinkedList L, DataType x) void LinkedListInsert(LinkedList L,int i,DataType x) //向单链表中插入元素 /* 从单链表中删除元素*/ void LinkedListDel(LinkedList L,DataType x)

数据结构实验报告及心得体会

2011~2012第一学期数据结构实验报告 班级:信管一班 学号:201051018 姓名:史孟晨

实验报告题目及要求 一、实验题目 设某班级有M(6)名学生,本学期共开设N(3)门课程,要求实现并修改如下程序(算法)。 1. 输入学生的学号、姓名和 N 门课程的成绩(输入提示和输出显示使用汉字系统), 输出实验结果。(15分) 2. 计算每个学生本学期 N 门课程的总分,输出总分和N门课程成绩排在前 3 名学 生的学号、姓名和成绩。 3. 按学生总分和 N 门课程成绩关键字升序排列名次,总分相同者同名次。 二、实验要求 1.修改算法。将奇偶排序算法升序改为降序。(15分) 2.用选择排序、冒泡排序、插入排序分别替换奇偶排序算法,并将升序算法修改为降序算法;。(45分)) 3.编译、链接以上算法,按要求写出实验报告(25)。 4. 修改后算法的所有语句必须加下划线,没做修改语句保持按原样不动。 5.用A4纸打印输出实验报告。 三、实验报告说明 实验数据可自定义,每种排序算法数据要求均不重复。 (1) 实验题目:《N门课程学生成绩名次排序算法实现》; (2) 实验目的:掌握各种排序算法的基本思想、实验方法和验证算法的准确性; (3) 实验要求:对算法进行上机编译、链接、运行; (4) 实验环境(Windows XP-sp3,Visual c++); (5) 实验算法(给出四种排序算法修改后的全部清单); (6) 实验结果(四种排序算法模拟运行后的实验结果); (7) 实验体会(文字说明本实验成功或不足之处)。

三、实验源程序(算法) Score.c #include "stdio.h" #include "string.h" #define M 6 #define N 3 struct student { char name[10]; int number; int score[N+1]; /*score[N]为总分,score[0]-score[2]为学科成绩*/ }stu[M]; void changesort(struct student a[],int n,int j) {int flag=1,i; struct student temp; while(flag) { flag=0; for(i=1;ia[i+1].score[j]) { temp=a[i]; a[i]=a[i+1]; a[i+1]=temp; flag=1; } for(i=0;ia[i+1].score[j]) { temp=a[i]; a[i]=a[i+1]; a[i+1]=temp; flag=1;

数据结构实验一题目一线性表实验报告

数据结构实验报告 实验名称:实验1——线性表 学生姓名: 班级: 班内序号: 学号: 日期: 1.实验要求 1、实验目的:熟悉C++语言的基本编程方法,掌握集成编译环境的调试方法 学习指针、模板类、异常处理的使用 掌握线性表的操作的实现方法 学习使用线性表解决实际问题的能力 2、实验内容: 题目1: 线性表的基本功能: 1、构造:使用头插法、尾插法两种方法 2、插入:要求建立的链表按照关键字从小到大有序 3、删除 4、查找 5、获取链表长度 6、销毁 7、其他:可自行定义 编写测试main()函数测试线性表的正确性。 2. 程序分析 存储结构 带头结点的单链表

关键算法分析 1.头插法 a、伪代码实现:在堆中建立新结点 将x写入到新结点的数据域 修改新结点的指针域 修改头结点的指针域,将新结点加入链表中 b、代码实现: Linklist::Linklist(int a[],int n)

堆中建立新结点 b.将a[i]写入到新结点的数据域 c.将新结点加入到链表中 d.修改修改尾指针 b、代码实现: Linklist::Linklist(int a[],int n,int m)取链表长度函数 a、伪代码实现:判断该链表是否为空链表,如果是,输出长度0 如果不是空链表,新建立一个temp指针,初始化整形数n为0 将temp指针指向头结点 判断temp指针指向的结点的next域是否为空,如果不是,n加一,否 则return n 使temp指针逐个后移,重复d操作,直到temp指针指向的结点的next 域为0,返回n b 、代码实现 void Linklist::Getlength()Linklist(); cout<

数据结构线性表实验报告

实验报告 实验一线性表 实验目的: 1.理解线性表的逻辑结构特性; 2.熟练掌握线性表的顺序存储结构的描述方法,以及在该存储结构下的基本操作;并能灵活运用; 3.熟练掌握线性表的链表存储结构的描述方法,以及在该存储结构下的基本操作;并能灵活运用; 4.掌握双向链表和循环链表的的描述方法,以及在该存储结构下的基本操作。 实验原理: 线性表顺序存储结构下的基本算法; 线性表链式存储结构下的基本算法; 实验内容: 2-21设计单循环链表,要求: (1)单循环链表抽象数据类型包括初始化操作、求数据元素个数操作、插入操作、删除操作、取消数据元素操作和判非空操作。 (2)设计一个测试主函数,实际运行验证所设计单循环链表的正确性。 2-22 .设计一个有序顺序表,要求: (1)有序顺序表的操作集合有如下操作:初始化、求数据元素个数、插入、删除和取数据元素。有序顺序表与顺序表的主要区别是:有序顺序表中的数据元素按数据元素值非递减有序。 (2)设计一个测试主函数,实际运行验证所设计有序顺序表的正确性。 (3)设计合并函数ListMerge(L1,L2,L3),功能是把有序顺序表L1和L2中的数据元素合并到L3,要求L3中的数据元素依然保持有序。并设计一个主函数,验证该合并函数的正确性。 程序代码: 2-21(1)头文件LinList.h如下: typedef struct node { DataType data; struct node *next; }SLNode; /*(1)初始化ListInitiate(SLNode * * head)*/ void ListInitiate(SLNode * * head) { /*如果有内存空间,申请头结点空间并使头指针head指向头结点*/ if((*head=(SLNode *)malloc(sizeof(SLNode)))==NULL)exit(1);

数据结构实验报告图实验

图实验 一,邻接矩阵的实现 1.实验目的 (1)掌握图的逻辑结构 (2)掌握图的邻接矩阵的存储结构 (3)验证图的邻接矩阵存储及其遍历操作的实现 2.实验内容 (1)建立无向图的邻接矩阵存储 (2)进行深度优先遍历 (3)进行广度优先遍历 3.设计与编码 #ifndef MGraph_H #define MGraph_H const int MaxSize = 10; template class MGraph { public: MGraph(DataType a[], int n, int e); ~MGraph(){ } void DFSTraverse(int v); void BFSTraverse(int v); private: DataType vertex[MaxSize]; int arc[MaxSize][MaxSize]; int vertexNum, arcNum; }; #endif #include using namespace std; #include "" extern int visited[MaxSize]; template MGraph::MGraph(DataType a[], int n, int e) { int i, j, k; vertexNum = n, arcNum = e; for(i = 0; i < vertexNum; i++) vertex[i] = a[i]; for(i = 0;i < vertexNum; i++) for(j = 0; j < vertexNum; j++) arc[i][j] = 0;

数据结构线性表的应用实验报告

实验报告 课程名称____数据结构上机实验__________ 实验项目______线性表的应用____________实验仪器________PC机___________________ 系别_____电子信息与通信学院___ 专业________ ___ 班级/学号______ __ 学生姓名______ ___________ 实验日期_______________________ 成绩_______________________ 指导教师_______________________

实验一.线性表的应用 1.实验目的:掌握线性链表的存储、运算及应用。利用链 表实现一元多项式计算。 2.实验内容: 1)编写函数,实现用链表结构建立多项式; 2)编写函数,实现多项式的加法运算; 3)编写函数,实现多项式的显示; 4)测试:编写主函数,它定义并建立两个多项式,显示 两个多项式,然后将它们相加并显示结果。变换测试用的多项式,检查程序的执行结果。 选做内容:修改程序,选择实现以下功能: 5)多项式求值:编写一个函数,根据给定的x值计算并 返回多项式f(x)的值。测试该函数(从终端输入一个x的值,调用该函数并显示返回结果)。 6)多项式相减:编写一个函数,求两个多项式相减的多 项式。 7)多项式相乘:编写一个函数,求两个多项式的乘积多 项式。 3.算法说明: 1)多项式的建立、显示和相加算法见讲义。可修改显示 函数,使输出的多项式更符合表达规范。

2)多项式减法:同次项的系数相减(缺项的系数是0)。 例如a(x)=-5x2+2x+3,b(x)= -4x3+3x,则a(x)-b(x) =4x3-5x2-x+3。提示:a(x)-b(x) = a(x)+(-b(x))。 3)多项式乘法:两个多项式的相乘是“系数相乘,指数 相加”。算法思想是用一个多项式中的各项分别与另 一个多项式相乘,形成多个多项式,再将它们累加在 一起。例如,a(x)=-5x2+2x+3,b(x)=-4x3+3x,则 a(x)*b(x) = (-4x3)*(-5x2+2x+3)+(3x)*(-5x2+2x+3) = (20x5-8x4-12x3) + (-15x3+6x2+9x) = 20x5-8x4-27x3+6x2+9x。 4.实验步骤: 根据实验报告的要求,我对文件夹里的C文件进行了丰 富和修改,步骤如下: 链表结构建立多项式: typedef struct polynode { float coef; //系数 int exp; //指数 struct polynode *next; //下一结点指针 } PNode; 编写函数,实现多项式的加法运算; PNode * PolyAdd (PNode *f1, PNode *f2) //实现加法功能。

相关文档
最新文档