搜档网
当前位置:搜档网 › 实验1__线性表的应用

实验1__线性表的应用

实验1__线性表的应用
实验1__线性表的应用

实验一线性表的应用

一、实验教学目的

1、熟悉将算法转换成程序代码的过程。

2、了解顺序表的逻辑结构特性,熟练掌握顺序表存储结构的C语言描述方法。

3、熟悉链表数据结构的定义和插入、删除等基本操作,会使用链表的基本操作解决一些实际问题

二、实验教学内容

1、实验题目

(1)用C语言数组实现顺序表,并在顺序表上实现:①在第3个位置插入666;

②将第8个元素删除;③在顺序表中查找值为65的元素。

(2)已知有两个多项式Pn(x)和Qm(x),基于链表设计算法实现Pn(x)+Qm(x)运算,而且不重新开辟存储空间。

⑶基于链表编程实现多项式乘法运算

2、实验要求:

(1)要求用静态分配的一维数组和动态分配的一维数组来完成实验题目。分析静态分配的一维数组和动态分配的一维数组在顺序表基本操作实现上的共同点和区别。

(2)熟悉链表及其运算的实现。

①自己编写实现函数;

②对所编写的算法进行时间复杂度分析。

⑶实验⑴、⑵必做,实验⑶选做。

3、实验预备知识

(1)复习C语言相关知识(如:结构体、用typedef自定义类型、函数)。

(2)阅读顺序表与链表的类型定义和相应的插入、删除、查找等基本操作。

4、实验环境

(1)一台运行 Windows 2000/XP 操作系统的计算机。

(2)选用turbo c、visual c++、delphi、c++ builder 或visual basic等任何一种语言。

5、实验说明

(1)顺序存储定义

#define MAXSIZE 100/*表中元素的最大个数*/

typedef int datatype; /*元素类型*/

typedef struct

{datatype data[MAXSIZE]; /*静态线性表*/

int last; /*表的实际长度*/

}seqlist; /*顺序表的类型名*/

(2)建立顺序表时可利用随机函数自动产生数据。

(3)注意问题

①插入、删除时元素的移动原因、方向及先后顺序。

②不同的函数形参与实参的传递关系。

(4)链表类型定义

typedef int datatype;/*元素类型*/

typedef struct node

{datatype data;

struct node *next;

}lnode,*linklist;/*单链表的类型定义*/

(5)为了算法实现简单,最好采用带头结点的单向链表。

(6)注意问题

①重点理解链式存储的特点及指针的含义。

②注意比较顺序存储与链式存储的各自特点。

③注意比较带头结点、无头结点链表实现插入、删除算法时的区别。

④单向链表的操作是数据结构的基础,一定要注意对这部分的常见算法的理解。

三、实验内容和实验步骤:(由学生填写)

四、实验用测试数据和相关结果分析:(由学生填写)

五、实验总结:(由学生填写)

六、程序参考模板

/*一、顺序表运算实验*/

#include"stdio.h"

#include"stdlib.h"

#define MAXSIZE 100

typedef int datatype;

typedef struct

{datatype data[MAXSIZE];

int last;

}seqlist; /*顺序表类型定义*/

void create_seqlist(seqlist *l,int n)/*输入n个整数,建立一个顺序表L*/

{

int i;

l->last=n;

for(i=0;i

l->data[i]= rand()%100;

}

void print_seqlist(seqlist l)/*输出顺序表L中各元素的值*/

{

int i=0;

for(i=0;i

printf("%d ",l.data[i]);

printf("\n");

}

void insert_seqlist(seqlist *l,int i,datatype x)/*在顺序表L的第i个位置插入元素x*/ {

int j;

for(j=l->last-1;j>=i;j--)

l->data[j+1]=l->data[j];

l->data[i]=x;

l->last+=1;

}

void delete_seqlist(seqlist *l,int i)/*删除顺序表L中第i个元素*/

{

int j;

for(j=i;jlast;j++)

l->data[j]=l->data[j+1];

l->last-=1;

}

int locate_seqlist(seqlist l,datatype x)/*在顺序表L中查找其值等于x的元素*/ {

int i=0;

while(i<=https://www.sodocs.net/doc/19147623.html,st&&l.data[i]!=x)

i++;

if(i>https://www.sodocs.net/doc/19147623.html,st ) return -1;

else return i;

}

void main()

{seqlist l;int i;

create_seqlist(&l,10);

print_seqlist(l); /*第1步*/

insert_seqlist(&l,3,666);

print_seqlist(l); /*第2步*/

delete_seqlist(&l,8);

print_seqlist(l); /*第3步*/

i=locate_seqlist(l,64);

if(i==-1)printf("have not this element\n");

else printf("the location is:%d\n",i+1); /*第4步*/

}

/*二、多项式求和

/*多项式求和运算实验程序*/

#include

#include

#define LEN sizeof(struct pnode)

//定义链表结点类型

struct pnode

{

float coef;

int exp;

struct pnode *next;

};

int n;

struct pnode *creat()

{

struct pnode *head,*p1,*p2;

p1=(struct pnode *)malloc(LEN);

p2=(struct pnode *)malloc(LEN);

head=(struct pnode *)malloc(LEN);

head->coef=0.0;

head->exp=-1;

n=0;

printf("请按递减顺序输入多项式的系数与指数对(以“0,-1”为结束标志):\n");

scanf("%f,%d",&p1->coef,&p1->exp);

while (p1->exp!=-1)

{

n=n+1;

if(n==1)head->next=p1;

else p2->next=p1;

p2=p1;

p1=(struct pnode *)malloc(LEN);

scanf("%f,%d",&p1->coef,&p1->exp);

}

p2->next=head;

return(head);

}

//编写两多项式求和的函数

struct pnode *POLYADD(A,B)

struct pnode *A,*B;

{

//请补充完成

}

//打印输出多项式

void print(struct pnode *head)

{

struct pnode *p;

//printf("\n该多项式为:\n\n",n);

p=head->next;

if(head->next!=NULL)

do

{

if(p->exp==0)printf("%f",p->coef);

else if (p->exp==1)printf("%fX",p->coef);

else

printf("%fX^%d",p->coef,p->exp);

if (p->next->coef>0)

printf("+");

p=p->next;

}

while(p!=head);

printf("\n\n");

}

//主函数

main()

{

struct pnode *A,*B,*C;

//将多项式A以链表形式存放

A=creat();

printf(" A 多项式为:\n\n");

print(A);

//将多项式A以链表形式存放

B=creat();

printf("B 多项式为:\n\n");

print(B);

//多项式A、B求和

C=POL YADD(A,B);

printf("A多项式与B多项式的和为:\n\n");

print(C);

system("pause");

}

三、多项式乘积运算实验

/*多项式乘积运算实验程序*/

#define NULL 0

#include

#include

typedef struct term{

float coef;

int expn;

struct term *next;}term,*polynomial;

term *creat(int n)

{term *head, *p,*q;

int i;

float s;

head=(polynomial)malloc(sizeof(term));

head->next=NULL;head->coef=0.0;head->expn=-1; q=head;

for(i=n;i>0;i--){

p=(polynomial)malloc(sizeof(term));

scanf("%f,%d",&s,&p->expn);

p->coef=s;

p->next=q->next;q->next=p;q=p;}

return(head);}

void print(polynomial head)

{term *p;

p=head->next;

printf("%f*x^%d",p->coef,p->expn);

p=p->next;

while(p)

{if(p->coef>0)

printf("+%f*x^%d",p->coef,p->expn);

else if(p->coef<0)

printf("%f*x^%d",p->coef,p->expn);

p=p->next;}

}

polynomial reverse(polynomial l) {polynomial p,q;

p=l->next;l->next=NULL;

while(p)

{q=p->next;

p->next=l->next;l->next=p;p=q;}

return(l);}

polynomial *multiply(polynomial f,polynomial g) {

//请自己编程补充

}

main()

{ polynomial f,g,h;

int n,m;

printf("n=");

scanf("%d",&n);

f=creat(n);

printf("m=");

scanf("%d",&m);

g=creat(m);

h=multiply(f,g);

print(h);

}

线性表实验报告

线性表实验报告 一、实验的目的要求 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请输入要插入元素的值:");

数据结构实验报告 实验一 线性表链式存储运算的算法实现

昆明理工大学信息工程与自动化学院学生实验报告 (201 —201 学年第一学期) 课程名称:数据结构开课实验室:年月日年级、专业、班学号姓名成绩 实验项目名称线性表链式存储运算的算法实现指导教师 教 师 评语教师签名: 年月日 一.实验内容: 线性表链式存储运算的算法实现,实现链表的建立、链表的数据插入、链表的数据删除、链表的数据输出。 二.实验目的: 1.掌握线性表链式存储结构的C语言描述及运算算法的实现; 2.分析算法的空间复杂度和插入和删除的时间复杂度; 3.总结比较线性表顺序存储存储与链式存储的各自特点。 三.主要程序代码分析: LinkList creatListR1() //用尾插入法建立带头结点的单链表 { char *ch=new char(); LinkList head=(LinkList)malloc(sizeof(ListNode)); //生成头结点*head ListNode *s,*r,*pp; r=head; //尾指针初值指向头结点 r->next=NULL; scanf("%s",ch); //读入第一个结点的值 while(strcmp(ch,"#")!=0) { //输入#结束

pp=LocateNode(head,ch); if(pp==NULL) { s=(ListNode *)malloc(sizeof(ListNode)); //生成新的结点*s strcpy(s->data,ch); r->next=s; //新结点插入表尾 r=s; //尾指针r指向新的表尾 r->next=NULL; } scanf("%s",ch); //读入下一个结点的值 } return head; //返回表头指针 } int Insert(ListNode *head) //链表的插入 { ListNode *in,*p,*q; int wh; in=(ListNode *)malloc(sizeof(ListNode));in->next=NULL; //生成新结点p=(ListNode *)malloc(sizeof(ListNode));p->next=NULL; q=(ListNode *)malloc(sizeof(ListNode));q->next=NULL; scanf("%s",in->data); //输入插入的数据 scanf("%d",&wh); //输入插入数据的位置 for(p=head;wh>0;p=p->next,wh--); q=p->next; p->next=in; in->next=q; } void DeleteList(LinkList head,char *key) //链表的删除 { ListNode *p,*r,*q=head; p=LocateNode(head,key); //按key值查找结点的 if(p==NULL) exit(0); //若没有找到结点,退出 while(q->next!=p) //p为要删除的结点,q为p的前结点q=q->next; r=q->next; q->next=r->next; free(r); //释放结点*r } 四.程序运行结果:

实验一 线性表的基本操作实现及其应用

实验一线性表的基本操作实现及其应用 一、实验目的 1、熟练掌握线性表的基本操作在两种存储结构上的实现。 2、会用线性链表解决简单的实际问题。 二、实验内容 题目一、该程序的功能是实现单链表的定义和操作。该程序包括单链表结构类型以及对单链表操作的具体的函数定义和主函数。其中,程序中的单链表(带头结点)结点为结构类型,结点值为整型。单链表操作的选择以菜单形式出现,如下所示: please input the operation: 1.初始化 2.清空 3.求链表长度 4.检查链表是否为空 5.检查链表是否为满 6.遍历链表(设为输出元素) 7.从链表中查找元素 8.从链表中查找与给定元素值相同的元素在表中的位置 9.向链表中插入元素 10. 从链表中删除元素 其他键退出。。。。。 其中黑体部分必做 题目二、约瑟夫环问题: 设编号为1,2,3,……,n的n(n>0)个人按顺时针方向围坐一圈,每个人持有一个正整数密码。开始时任选一个正整数做为报数上限m,从第一个人开始顺时针方向自1起顺序报数,报到m时停止报数,报m的人出列,将他的密码作为新的m值,从他的下一个人开始重新从1报数。如此下去,直到所有人全部出列为止。令n最大值取30。要求设计一个程序模拟此过程,求出出列编号序列。 struct node (一)

1.进入选择界面后,先选择7,进行插入: 2.选择4,进行遍历,结果为: 3.选择2,得出当前链表长度.

4.选择3,得出当前链表为. 5.选择分别选择5、6进行测试.

6.选择8,分别按位置和元素值删除. 7.选择9,或非1-8的字符,程序结束.

完整版信管实验报告(线性表基本操作)

管理学院信管专业12(1)班学号3112004734 姓名钟臻华协作者:无教师评定_________________ 实验题目线性表的基本操作 实验评分表

实验报告 一、实验目的与要求 1.本实验通过对线性表各种操作的算法设计,理解和掌握线性表的概 念、存储结构及操作要求,体会顺序和链式两种存储结构的特点; 2.根据操作的不同要求,选择合适的存储结构,设计并实现算法,对 算法进行时间复杂度分析,从而达到掌握数据结构的研究方法、算法设计和分析方法的目的。 二、实验内容 1.分别用顺序表、单链表、单循环链表实现约瑟夫问题的求解,并分 析基于不同存储结构算法的时间复杂度。如果采用顺序表实现时,每个元素出环并不执行删除操作,而将相应位置元素值设置为空,但计数时必须跳过值为空的元素,实现这种算法,并分析执行效率。 1.顺序表的不删除出环元素算法实现 public class Josephus3{ public Josephus3(int number,int start,int distance){//创建约瑟夫环并求解,参数指定环长度,起始位置,计数 //采用线性顺序表存储约瑟夫环的元素,元素类型是字符串,构造方法参数指定顺序表的容量 S eqList list=new SeqList(number); S tring a=new String("null"); f or(int i=0;i

实验1 线性表及其应用

实验1 线性表及其应用 题目1 顺序表的建立与基本操作 一、实验目的 1. 通过实验,掌握include命令及头文件的使用 2. 通过实验,掌握顺序表的建立与输出 3. 通过实验,掌握顺序表的基本操作 二、实验内容 1. 练习顺序表的建立与输出 2. 练习顺序表的基本操作 三、实验前的准备 1. 理解并掌握顺序表的存储结构、基本操作 2. 复习include命令的使用 3. 预习实习指导书,并准备相关的程序清单 四、实验步骤与方法 (1)建立自己的工作目录 (2)在当前文件夹下建立函数结果状态代码的定义文件Status.h(课本p10(1)预定义常量和类型)和数据结构数据文件SqList.h(内容包括顺序表的描述、顺序表建立、顺序表的查询、插入、删除与输出等功能。) (3)理解并运行下列程序: #include #include #include "Status.h" #include "SqList.h" void main() { SqList a; int i, k; InitList_Sq(a); printf("please input the data ,end of -99\n"); k = 0; scanf("%d",&i); while (i != -99) { a.elem[k] = i; k++; scanf("%d",&i); } a.length = k; printf("\n output the data:"); for (i = 0; i<=a.length-1; i++) printf("%d ",a.elem[i]); printf("\n"); } (4)编写算法,通过调用SqList.h中的相关函数,完成顺序表中指定位置数据的输出、元素的插入和删除 题目2 链表的操作

数据结构_实验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;

实验1__线性表的应用

实验一线性表的应用 一、实验教学目的 1、熟悉将算法转换成程序代码的过程。 2、了解顺序表的逻辑结构特性,熟练掌握顺序表存储结构的C语言描述方法。 3、熟悉链表数据结构的定义和插入、删除等基本操作,会使用链表的基本操作解决一些实际问题 二、实验教学内容 1、实验题目 (1)用C语言数组实现顺序表,并在顺序表上实现:①在第3个位置插入666; ②将第8个元素删除;③在顺序表中查找值为65的元素。 (2)已知有两个多项式Pn(x)和Qm(x),基于链表设计算法实现Pn(x)+Qm(x)运算,而且不重新开辟存储空间。 ⑶基于链表编程实现多项式乘法运算 2、实验要求: (1)要求用静态分配的一维数组和动态分配的一维数组来完成实验题目。分析静态分配的一维数组和动态分配的一维数组在顺序表基本操作实现上的共同点和区别。 (2)熟悉链表及其运算的实现。 ①自己编写实现函数; ②对所编写的算法进行时间复杂度分析。 ⑶实验⑴、⑵必做,实验⑶选做。 3、实验预备知识 (1)复习C语言相关知识(如:结构体、用typedef自定义类型、函数)。 (2)阅读顺序表与链表的类型定义和相应的插入、删除、查找等基本操作。 4、实验环境

(1)一台运行 Windows 2000/XP 操作系统的计算机。 (2)选用turbo c、visual c++、delphi、c++ builder 或visual basic等任何一种语言。 5、实验说明 (1)顺序存储定义 #define MAXSIZE 100/*表中元素的最大个数*/ typedef int datatype; /*元素类型*/ typedef struct {datatype data[MAXSIZE]; /*静态线性表*/ int last; /*表的实际长度*/ }seqlist; /*顺序表的类型名*/ (2)建立顺序表时可利用随机函数自动产生数据。 (3)注意问题 ①插入、删除时元素的移动原因、方向及先后顺序。 ②不同的函数形参与实参的传递关系。 (4)链表类型定义 typedef int datatype;/*元素类型*/ typedef struct node {datatype data; struct node *next; }lnode,*linklist;/*单链表的类型定义*/ (5)为了算法实现简单,最好采用带头结点的单向链表。 (6)注意问题 ①重点理解链式存储的特点及指针的含义。 ②注意比较顺序存储与链式存储的各自特点。 ③注意比较带头结点、无头结点链表实现插入、删除算法时的区别。 ④单向链表的操作是数据结构的基础,一定要注意对这部分的常见算法的理解。 三、实验内容和实验步骤:(由学生填写) 四、实验用测试数据和相关结果分析:(由学生填写) 五、实验总结:(由学生填写) 六、程序参考模板

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

数据结构实验报告 实验名称:实验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.实验要求 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++;

实验一线性表与应用(I)

姓名学号

ElemType data; //待插入元素 SqList L; //定义SqList类型变量 InitList_Sq(L); //初始化顺序表 printf("※1. 请输入所需建立的线性表的长度:"); scanf_s("%d", &LIST_MAX); printf("※2. 请录入数据:"); for (i = 0; i

201560140140--袁若飞--实验1:线性表的基本操作及其应用

数据结构 实验1:线性表的基本操作及其应用 班级:RB软工移151 学号:201560140140 姓名:袁若飞

实验一线性表 一、实验目的 1、帮助读者复习C++语言程序设计中的知识。 2、熟悉线性表的逻辑结构。 3、熟悉线性表的基本运算在两种存储结构上的实现,其中以熟悉链表的操作为侧重点。 二、实验内容 本次实验提供4个题目,每个题目都标有难度系数,*越多难度越大,题目一、二是必做题。题目三、题目四选作。 三、实验准备知识 1、请简述线性表的基本特性和线性表的几种基本操作的机制 ①答:线性表的基本特性是:对线性表中某个元素ai来说,称其前面的元素ai-1为ai的直接前驱,称其后前面的元素ai+1为ai的直接后继。显然,线性表中每个元素最多有一个直接前驱和一个直接后继。 ②答:线性表的几种基本操作的机制有六个: (1)初始化线性表initial_List(L)——建立线性表的初始结构,即建空表。这也是各种结构都可能要用的运算。 (2)求表长度List_length(L)——即求表中的元素个数。 (3)按序号取元素get_element(L,i)——取出表中序号为i的元素。(4)按值查询List_locate(L,x)——取出指定值为x的元素,若存在该元素,则返回其地址;否则,返回一个能指示其不存在的地址值或标记。 (5)插入元素List_insert(L,i,x)——在表L的第i个位置上插入值为x的元素。显然,若表中的元素个数为n,则插入序号i应满足1<=i<=n+1。(6)删除元素List_delete(L,i)——删除表L中序号为i的元素,显然,待删除元素的序号应满足1<=i<=n。 2、掌握线性表的逻辑结构。 3、掌握线性表的链式存储结构。 4、熟练掌握线性表的插入、删除等操作。

哈工大 数据结构 实验一 线性表的实验

哈尔滨工业大学计算机科学与技术学院 实验报告 课程名称:数据结构与算法 课程类型:必修 实验项目名称:线性表实验 实验题目:算术表达式求值 班级:0903201 学号:1090320110 姓名:王岳

一、实验目的 二、实验要求及实验环境 三、设计思想(本程序中的用到的所有数据类型的定义,主程序的流程图及各程序模块之间的调用关系) 1.逻辑设计 2.物理设计 四、测试结果 五、系统不足与经验体会 六、附录:源代码(带注释) #include using namespace std; template class stack{ private: elementtype ss[512]; int top; public: stack() { this -> top =0; } void null() { this -> top =0; } bool empty() { if (this -> top ==0) return true; else return false; } elementtype pop() { if (this -> empty()) printf("error:empty!!!\n");

else { this -> top--; return this -> ss[this -> top + 1]; } } void push(elementtype x) { if (this -> top == 511) printf("error:full!!!\n"); else { this -> top++; this -> ss[this -> top] = x; } } }; void change(int &i,int &j,double *a,char *input,stack &s){//change front to back char o,p; bool fu=true; while(true){ o=cin.peek(); if((o<'('||o>'9')&&o!='\n') {o=getchar();fu=false; continue;} else if(o>='0'&&o<='9') {scanf("%lf",&a[i]); input[j]=i+'0';i++;j++; } else if(o=='(') {o=getchar();s.push(o);fu=true;continue;} else if(o==')') { o=getchar(); for(;!s.empty();){ input[j]=s.pop();j++; if(input[j-1]=='(') {j--;break;} } } else if(o=='*'||o=='/'){ o=getchar(); for(;!s.empty();){ p=s.pop(); if(p=='*'||p=='/') {input[j]=p;j++;} else {s.push(p);break;} } s.push(o); } else if(o=='+'||o=='-'){ o=getchar(); if(fu) {a[i]=0;input[j]=i+'0';i++;j++;} for(;!s.empty();){ p=s.pop(); if(p!='(') {input[j]=p;j++;} else {s.push(p);break;}

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

实验一线性表及其应用 一、实验目的 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. 熟悉C/C++语言上机环境; 2. 掌握线性表的基本操作:查找、插入、删除等运算在顺序存储、链式存储结构上的运算。 二、实验环境 1. 装有Visual C++6.0的计算机。 2. 本次实验共计2学时。 三、实验内容 1. 建立顺序表,基本操作包括:初始化、建立顺序表、输出顺序表、判断是否为空、取表中第i个元素、查找、插入和删除。并在主函数中完成对各种函数的测试。 2. 设有两个非递增有序的线性表A和B,均已顺序表作为存储结构。编写算法实现将A表和B表合并成一个非递增有序排列的线性表(可将线性表B插入线性表A中,或重新创建线性表C)。 3. 建立单链表,基本操作包括:初始化、判断是否为空、取表中第i个元素、查找、插入和删除。并在主函数中完成对各种函数的测试。 四、源程序 #include #include #include #define MaxSize 50 typedef char ElemType; //-------存储结构---------- typedef struct { ElemType elem[MaxSize]; //存放顺序表中的元素 int length; //存放顺序表的长度 } SqList; //-------初始化线性表---------- void InitList(SqList *&L) //初始化线性表,构造一个空的线性表,并将长度设置为0 { L=(SqList *)malloc(sizeof(SqList)); L->length=0;

实验1线性表及其应用

实验1 线性表及其应用 实验性质:验证性 实验学时:2学时 一、实验目的 1.掌握线性表的顺序存储结构在计算机的表示方法及其基本操作的实现; 2.掌握线性表的链式存储结构在计算机的表示方法及其基本操作的实现; 3.能够利用线性表结构对实际问题进行分析建模,利用计算机求解。 二、实验预备知识 1.复习C/C++语言相关知识(如:结构体的定义、typedef的使用、函数的定义、调用 及参数传递方式); 2.阅读并掌握顺序表与链表的类型定义及其查找、插入、删除等基本操作。 三、实验内容 1.理解并分别用顺序表、链表的操作运行下列程序: #include using namespace std; #include "Status.h" typedef int ElemType; #include "SqList.h" //用#include "LinkList.h"替换 void main() { SqList L; //用LinkList L;替换,与#include "LinkList.h"配合 int n,i; ElemType e; InitList(L); cout<<"\nL="; ListTraverse(L); cout<<"\n请设置将向线性表L中输入的元素个数:"; cin>>n; CreateList(L,n); cout<<"\nL="; ListTraverse(L); cout<<"\nL的表长为:"<>i; if(GetElem(L,i,e)) cout<<"\n第"<>e; if(i=LocateElem(L,e)) cout<<"\n元素"<

贵州大学数据结构实验1-线性表及应用

实验一线性表及应用 一、实验目的 1.复习C语言的上机环境,掌握C语言的基本结构; 2.会定义线性表的顺序存储结构和链表的存储结构; 3.熟悉对顺序表的一些基本操作和具体的函数定义。 4.掌握顺序表和单链表的存储结构及相关运算 5.掌握顺序表和单链表的基本应用 二、实验硬软件环境 硬件环境:赛扬433以上CPU,10GB以上硬盘,64MB以上内存 软件环境:DOS+Turbo C 2.0 或Borland C++ 3.1以上 Windowx 9X+VC++ 5.0以上 三、实验要求 1.认真阅读和掌握本实验内容所给的全部程序。 2.保存和打印出程序运行结果,并结合程序进行分析。 3.按照你对顺序表操作的需要,屏幕考贝运行结果到实验报告中。 4.撰写实验报告并准时上交 四、注意事项 在做第一次“数据结构”课程实验之前,要在硬盘上建立好自己的工作目录,专门用来存储你所做的实验程序及相关信息,以后每次做实验都采用这个目录。 本实验设计完全由老师设计,版权限本班同学使用,勿外传。 实验材料下载到本机后,请用winrar软件释放到你的电脑磁盘的“数据结构实验(张三)”文件夹中,形成如上图的文件夹结构。 上交实验报告时,请把“实验一”的所有内容(含实验报告)用winrar打包成.rar文件后一并交上来。上传名字为“实验一(张三).rar”

五、基本理论 线性表:线性表(linear list)是这样的数据对象,其实例形式为: (e1 , e2 ,... en ),其中n 是有穷自然数。e 是表中的元素,n 是表的长度。元素 i 可以被视为原子,因为它们本身的结构与线性表的结构无关。当n = 0 时,表为空;当n > 0时,e1是第一个元素,e n是最后一个元素,可以认为e l优先于e2,e 优先于e3,如此等等。除了这种优先关系之外,在线性表中不再有其他的结构。2 基本操作: ? 创建一个线性表。 ? 确定线性表是否为空。 ? 确定线性表的长度。 ? 查找第k个元素。 ? 查找指定的元素。 ? 删除第k个元素。 ? 在第k个元素之后/之前插入一个新元素。 线性表ADT(图1): 图1 线性表抽象数据类型 顺序表: 采用数组来表示一个对象的实例,数组中的每个位置被称之为单元(cell)或节点(node),每个数组单元应该足够大,以便能够容纳数据对象实例中的任意一个元素。在某些情况下,每个实例可分别用一个独立的数组来描述,而在其他情况下,可能要使用一个数组来描述几个实例。实例中每个元素在数组中的位置可以用一个数学公式来指明。 假定使用一个数组来描述表,需要把表中的每个元素映射到数组的具体位置上。第一个元素在什么地方?第二个元素在什么地方?在公式化描述中,可用一个数学公式来确定每个元素的位置。一个简单的映射公式如下: location(i)= i - 1 (式1-1) 式1-1表明第i个元素的存储位置在数组的第i-1个位置;

实验1线性表基本操作

实验1 线性表基本操作 实验目的 1.熟悉C语言的上机环境,掌握C语言的基本结构。 2.定义单链表的结点类型。 3.熟悉对单链表的一些基本操作和具体的函数定义。 4.通过单链表的定义掌握线性表的链式存储结构的特点。 5.熟悉对单链表的一些其它操作 实验内容 1. 实现单链表的定义和操作。该程序包括单链表结构类型以及对单链表操作的具体的函数定义 2. 约瑟夫环问题:任给正整数N和K,按下述方法可以得到1,2, …,n的一个置换,将数字1,2,…,n环形排列,按顺时针方向自1开始报数,报到K时输出该位置上的数字,并使其出列。然后从他在顺时针方向的下一个数字继续报数,如此下去,直到所有的数字全部出列为止。例如N=10,K=3,则正确的出列顺序应为3,6,9,2,7,1,8,5,10,4。 3. 试单链表实现一个简单的电子通讯本管理软件,要求能查找联系地址,增加和删除联系人。联系方式假定包括姓名、电话和地址。 4.实现集合数据类型。 实验要求 1.上机前要做好准备工作,包括程序框图、数据结构以及算法。 2.按时实验 3.服从实验室老师的安排 4.独立实验,有问题可以讨论,但不得翻版。 5.遵守实验室的各项纪律。 实验报告要求:详细见指导书 1.报告内容: 一、实验名称、实验目的 二、实验内容 主要包括问题描述、基本要求等。 三、分析与设计 1、需求分析数据结构描述(抽象数据类型) 2、功能模块的划分 3、存储结构(主要的类型及变量说明) 4、主要算法描述(PDL/流程图) 四、调试过程 1、测试数据设计 2、测试结果分析 3、使用说明 五、总结 1、调试过程中遇到的主要问题及解决过程 2、对设计和编码的讨论和分析 3、体会和收获。 六、附录:源程序代码(另附) 源程序代码电子版命名格式要求:

实验一 线性表操作实验题目

实验一线性表操作 实验目的: (1)掌握在顺序、链式存储结构上实现线性表的各种基本运算。 (2)重点掌握单链表的基本操作及应用。 (3)学会综合运用C语言中函数、指针、结构体等知识进行编程。 本次实验中,下列实验项目选做一。 1、顺序表的综合操作 [问题描述] 设计算法,实现线性结构上的顺序表的建立以及元素的查找、插入、删除等操作。 [基本要求及提示] (1)从键盘输入10个整数,建立顺序表。 (2)从键盘输入1个整数,在顺序表中查找该结点的位置。若找到,输出结点的位置;若找不到,则显示“找不到”。 (3)从键盘输入2个整数,一个表示欲插入的位置i,另一个表示欲插入的数值x,将x插入在对应位置上,输出顺序表所有结点值,观察输出结果。 (4)从键盘输入1个整数,表示欲删除结点的位置,输出顺序表所有结点值,观察输出结果。 (5)要求程序通过一个主菜单进行控制,在主菜单界面通过选择菜单项的序号来调用各功能函数。 2、线性表的逆置 [问题描述] (1)以顺序存储结构实现线性表的就地逆置。 (2)以链式存储结构实现线性表的就地逆置。 注:线性表的就地逆置就是在原表的存储空间内将线性表(a1,a2,a3,…,an)逆置为(an,an-1,…,a2,a1)。 [基本要求及提示] (1)从键盘输入10个整数,建立顺序表。 (2)实现顺序表逆置,并将结果输出。 (3)从键盘输入10个整数,建立链表。 (4)实现链表逆置,并将结果输出。 (5)要求程序通过一个主菜单进行控制,在主菜单界面通过选择菜单项的序号来调用各功能函数。也可以将顺序表和链表上的操作分开,做成两个程序。 3、线性表的元素分类 [问题描述] 已知线性表中元素均为正整数,设计算法将其调整为前后两部分,前边均为奇数,后边均为偶数。即实现线性表的元素的分类。 [基本要求及提示] (6)从键盘输入10个整数,建立顺序表。

实验一 线性表的操作及应用

实验一线性表的操作及应用 1.实验目的 掌握线性表的创建、插入、删除、检索、求长度、销毁等操作链式存储结构上的实现。 掌握单链表表逆置的程序实现方法。 2.实验环境 Visual C++ 6.0 4.实验报告内容 (1)给出单链表的存储结构定义。 (2)给出在链式存储结构上实现线性表的插入操作的基本设计思想,并用C语言实现。 (3)给出在链式存储结构上实现线性表的删除操作的基本设计思想,并用C语言实现。 (4)给出在链式存储结构上实现线性表的查找值为e操作的基本设计思想,并用C语言实现。 5.实验报告要求 (1)字迹清晰; (2)代码格式符合规范,有缩进,关键之处有注释; (3)实验心得体会和问题建议要根据实际情况填写,不得为空。 代码: #include #include typedef int DataType; typedef struct node{ DataType data; /*每个元素数据信息*/ struct node *next; /*存放后继元素的地址*/ } LNode, *LinkList; LinkList Creat_LinkList(void ) { /*创建空单链表,入口参数:无;返回值:单链表的头指针,0代表创建失败,非0表成功*/ LinkList H; H=(LinkList)malloc(sizeof(LNode)); if (H) /*确认创建头结点创建是否成功,若成功,修改单链表头结点的指针

域为0表空表*/ H->next=NULL; return H; } void Destroy_LinkList(LinkList H) { /*销毁单链表,入口参数:单链表头指针的地址,出口参数:无*/ LinkList p,q; p=H; /*释放单链表的所有结点*/ q=p->next; p->next=q->next; delete q; H=NULL; /*将头指针变为零表示单链表不存在*/ } int Length_LinkList (LinkList H) { /* 求单链表表长,入口参数:单链表头指针,出口参数:表长,-1表示单链表不存在。*/ LinkList p=H; /* p指向头结点*/ int count= -1; /*H带头结点所以从-1开始*/ p=p->next; while(p) { count++;

相关主题