数据结构实验一顺序表的实现

数据结构实验一顺序表的实现
数据结构实验一顺序表的实现

数据结构实验一顺序表的实现

班级学号分数

一、实验目的:

1.熟悉线性表的基本运算在两种存储结构(顺序结构和链式结构)上的实现;

2.以线性表的各种操作的实现为重点;

3.通过本次学习帮助学生加深C语言的使用,掌握算法分析方法并对已经设计

出的算法进行分析,给出相应的结果。

二、实验要求:

编写实验程序,上机运行本程序,保存程序的运行结果,结合程序进行分析并写出实验报告。

三、实验容及分析:

1.顺序表的建立

建立一个含n个数据元素的顺序表并输出该表中各元素的值及顺序表的长度。

程序如下:

头文件SqList.h的容如下:

#include

#include

#define LIST_INIT_SIZE 100

#define LISTINCREMENT 10

#define TRUE 1

#define FALSE 0

#define OK 1

#define ERROR 0

#define INFEASIBLE -1

#define OVERFLOW -2

typedef int ElemType;

typedef int Status;

typedef struct{

ElemType *elem;

int length;

int listsize;

}SqList;

Status InitList_Sq(SqList *L)

{

L->elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));

if(!L->elem) return(OVERFLOW);

L->length=0;

L->listsize=LIST_INIT_SIZE;

return OK;

}

Status CreatList_Sq(SqList *L,int n)

{

int i;

printf("输入%d个整数:\n",n);

for(i=0;i

scanf("\n%d",&L->elem[i]);

return OK;

}

//以下是整个源程序:

#include

#include"SqList.h"

int main()

{

int i,n;

SqList a;

SqList *l = &a;

if(InitList_Sq(l)==-2) printf("分配失败");

printf("\n输入要建立的线性表l的长度n:");//输入线性表得长度scanf("%d",&n);

l->length=n;

printf("线性表的长度是:%d\n",l->length);

CreatList_Sq(l,n);//生成线性表

printf("输出线性表l中的元素值:");//输出线性表中的元素

for(i=0;ilength;i++)

printf("%7d",l->elem[i]);

getchar();

}

程序的运行结果:

2.顺序表的插入

利用前面的实验先建立一个顺序表L,然后再第i个位置插入元素,通过对比插入元素前后的线性表发生的变化,判断插入操作是否正确。

参考程序:

#include

#include

#include"SqList.h"

Status ListInsert_Sq(SqList *L,int i,ElemType e)

{

//在线性表L中的第i个位置前插入一个值为e的元素

//i的取值围:1<=i<=ListLength_Sq(L)

ElemType *newbase,*q,*p;

if(i<1||i>L->length+1) return ERROR;//i值不合法

if(L->length>=L->listsize){ //当前存储空间已满,增加分配量

newbase=(ElemType*)realloc(L->elem,

(L->listsize+LISTINCREMENT)*sizeof(ElemType));

if(!newbase) return (OVERFLOW); //存储分配失败

L->elem=newbase; //新基址

L->length=+LISTINCREMENT; //增加存储容量

}//if

q=&(L->elem[i-1]); //q为插入位置

for(p=&(L->elem[L->length-1]);p>=q;--p) *(p+1)=*p;

//插入位置及以后的元素右移

*q=e; //插入e

++L->length; //表长增1

return OK;

}//ListInsert_Sq

int main()

{

int n,i,x;

SqList *L,a;

L=&a;

InitList_Sq(L);

printf("\n输入要建立的线性表L得长度:");

scanf("%d",&n);

L->length=n;

CreatList_Sq(L,n);

printf("\n插入元素之前线性表L的长度是:%d",L->length);

printf("\n插入元素之前线性表L中的元素是:");

for(i=0;ilength;i++)

printf("%5d",L->elem[i]);

printf("\n输入要插入元素的位置:");

scanf("%d",&i);

printf("\n输入要插入的元素的值:");

scanf("\n %d",&x);

if(ListInsert_Sq(L,i,x)>0)

{

printf("\n插入元素之后线性表L的长度是: %d ",L->length);

printf("\n插入元素之后线性表L的元素是:\n");

for(i=0;ilength;i++)

printf("%5d", L->elem[i]);

}//if

else

printf("不能插入这个元素!\n");

getchar();

}

运行结果:

4.单链表的实现

新建链表,生成一个有一定结点的链表,并且顺序输出。程序代码:

#include"stdio.h"

#include"stdlib.h"

#include"string.h"

#define null 0

#define MAX 100 //最多元素个数

#define LENGTH sizeof(struct Node)

typedef int Elem ; //数据元素类型

//单链表实现线性表

struct Node

{

Elem data; //数据域

struct Node *next; //指针域

};

typedef struct Node NODE;

typedef struct Node *LINKLIST;

//初始化链表,产生一个空链表

LINKLIST InitList()

//返回空链表的头指针

{

LINKLIST head;

head=null;

return head;

}

//新建链表,生成一个有一定结点的链表

LINKLIST CreateList()

//返回新链表的首地址(指针)

{

LINKLIST head=null,p,q;

int n,i;

Elem temp;

do{

printf("请输入要建的结点数:");

scanf("%d",&n);

if(n<1 || n>MAX)

printf("对不起!请输入的数在1-%d之间,请重新输入。\n",MAX);

}while(n<1 || n>MAX);

for(i=0;i

{

p=(LINKLIST)malloc(LENGTH); //开辟新结点空间

printf("请输入第%d结点数据:",i+1);

scanf("%d",&temp); //输入结点数据

p->data=temp;

if(head==null) //如果head指向空,则p结点为第一个结点

{

head=q=p;

p->next=null;

}

else //不是第一个结点,则结点放到结尾并且,尾指针后移

{

p->next=null;

q->next=p;

q=p;

}

}

return head; //返回新链表的首地址(指针)

}

//遍历打印链表

int printList(LINKLIST h)

//返回打印结果,0表示无数据,1表示成功打印完成

{

LINKLIST pt=h;

if(pt==null) //没有数据直接返回

{

printf("对不起,没有数据!");

return 0;

}

while(pt) //结点不为空就打印结点容

{

printf("%d ",pt->data);

pt=pt->next;

}

printf("\n");

return 1;

}

//求的链表的长度

int ListLength(LINKLIST h)

//求的链表长度,返回链表长度,若链表为空则返回0

{

LINKLIST pt=h;

int len=0; //初始化计数器为0

while(pt)

{

len++;

pt=pt->next;

}

return len; //返回链表长度

}

/*

//向链表链表尾部添加结点,无输入

LINKLIST AddNode(LINKLIST h,Elem e)

{

LINKLIST head,pt,p;

pt=head=h; //指向起始结点

p=(LINKLIST)malloc(LENGTH); //开辟结点空间

p->data=e; //向结点数据赋值

p->next=null; //结点后继指向空

if(pt==null) //若链表为空,直接作为第一个结点head=p;

else //若不为空,将结点插在最后

{

while(pt->next)

{

pt=pt->next;

}

pt->next=p;

}

return head; //返回头结点指针

}

*/

/*

//向链表链表尾部添加结点,有输入

LINKLIST AddNode(LINKLIST h)

{

LINKLIST head,pt,p;

pt=head=h; //指向起始结点

p=(LINKLIST)malloc(LENGTH); //开辟结点空间

printf("请输入要添加的数据:");

scanf("%d",&p->data);

p->next=null; //结点后继指向空

if(pt==null) //若链表为空,直接作为第一个结点

head=p;

else //若不为空,将结点插在最后

{

while(pt->next)

{

pt=pt->next;

}

pt->next=p;

}

return head; //返回头结点指针

}

*/

//将结点插入到链表的指定位置

LINKLIST AddNode(LINKLIST h,int i,Elem e)

//插入位置i,0

{

LINKLIST head,pt,p;

int j;

pt=head=h;

if(i<1) //插入位置错误(i<1),输出信息并结束程序{

printf("程序出错,请检查参数!");

exit(1);

数据结构实验报告全集

数据结构实验报告全集 实验一线性表基本操作和简单程序 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始终指向生成的单链表的最后一个节点

数据结构顺序表真题

第二章复习题 本章重点掌握:线性结构特点,顺序存储结构和链式存储结构特点。 1.在顺序表中插入或删除一个元素,需要平均移动( 一半 )元素,具体移动的元素个数与( 插入或删除的位置 )有关。插入时平均 次数(n/2 ),删除时平均次数((n-1)/2 )。 2.有一个含头结点的循环链表,头指针为 head, 则其为空的条件是:( C ) A)head==NULL B)head->next==NULL C)head->next==head 3.在长度为 n 的顺序表的第 i 个位置上插入一个元素(1≤i≤n+1),元素的移动次数为:( A ) A) n – i + 1 B) n – i C) i D) i – 1 4.对于只在表的首、尾两端进行插入操作的线性表,宜采用的存储结构为( C ) A)顺序表B) 用头指针表示的循环单链表 C) 用尾指针表示的循环单链表D) 单链表 5.设单链表中结点的结构为(data, link)。已知指针 q 所指结点是指针 p 所指结点的直接前驱,若在*q 与*p 之间插入结点*s,则应执行下列哪一个操作?( B ) A)s->link = p->link;p->link = s;(B) q->link = s;s->link = p; (C) p->link = s->link;s->link = p;(D) p->link = s;s->link = q; 6.设单链表中结点的结构为(data, link)。已知指针 p 所指结点不是尾结点,若在*p 之后插入结点*s,则应执行下列哪一个操作?(B)

A)s->link = p;p->link = s;(B) s->link = p->link;p->link = s; (C) s->link = p->link;p = s;(D) p->link = s;s->link = p; 7.设单链表中结点的结构为(data, link)。若想摘除结点*p 的直接后继,则应执行下列哪一个操作?(A) (A) p->link = p->link->link; (B) p = p->link;p->link = p->link->link; (C) p->link = p->link;(D) p = p->link->link; 8.设单循环链表中结点的结构为(data, link),且 rear 是指向非空的 带表头结点的单循环链表的尾结点的指针。若想删除链表第一个结点,则应执行下列哪一个操作?(D) (A)s = rear;rear = rear->link;delete s; (B)rear = rear->link;delete rear; (C)rear = rear->link->link;delete rear; (D)s = rear->link->link;rear->link->link = s->link; delete s; (rear 指向尾结点,rear->link->link 指向第一个结点,第一个结点变为原来的第二个结点) 9.设双向循环链表中结点的结构为(data, lLink, rLink),且不带表头 结点。若想在指针 p 所指结点之后插入指针 s 所指结点,则应执 行下列哪一个操作?( D )

数据结构实验报告——顺序表链表的实现

课程名称:数据结构任课教师: 实验题目:线性表的基本操作 实验环境: Visual C++ 6.0 实验目的: 1、掌握线性表的定义; 2、掌握线性表的基本操作,如建立、查找、插入和删除等。 实验内容: 定义一个包含学生信息(学号,姓名,成绩)的的顺表序和链表,使其具有如下功能: (1)根据指定学生个数,逐个输入学生信息; (2)逐个显示学生表中所有学生的相关信息;

(3)根据姓名进行查找,返回此学生的学号和成绩;

(4)根据指定的位置可返回相应的学生信息(学号,姓名,成绩); (5)给定一个学生信息,插入到表中指定的位置; int createStLink(struct Node *head,struct Node *stu) { struct Node *p6,*p7,*p8; p7=head; p6=stu; if(head==NULL) { head=p6;p6->next=NULL; } else { //如果链表为空则在头结点创建信息while(p6->num > p7->num && p7->next!=NULL)

{ p8=p7; p7=p7->next; } if(p6->num<=p7->num) { if(head==p7) head=p6; else p8->next=p6; p6->next=p7; } else { p7->next=p6;p6->next=NULL; } } N++; return 1; } int main() { struct Node *H,*stud; char M; int num1; H=initlist(); (6)删除指定位置的学生记录;

《数据结构》实验1实验报告

南京工程学院实验报告 <班级>_<学号>_<实验X>.RAR文件形式交付指导老师。 一、实验目的 1. 掌握查找的不同方法,并能用高级语言实现查找算法; 2. 熟练掌握二叉排序树的构造和查找方法。 3. 了解静态查找表及哈希表查找方法。 二、实验内容 设计一个算法读入一串整数,然后构造二叉排序树,进行查找。 三、实验步骤 1. 从空的二叉树开始,每输入一个结点数据,就建立一个新结点插入到当前已生成的二叉排序树中。 2. 在二叉排序树中查找某一结点。 3.用其它查找算法进行排序。

四、程序主要语句及作用 程序1的主要代码 public class BinarySearchTreeNode //二叉查找树结点 { public int key; public BinarySearchTreeNode left; public BinarySearchTreeNode right; public BinarySearchTreeNode(int nodeValue) { key = nodeValue; left = null; right = null; } public void InsertNode(BinarySearchTreeNode node)//插入结点 { if (node.key > this.key) { if (this.right == null) { this.right = node; return; } else this.right.InsertNode(node); } else { if (this.left == null) { this.left = node; return; } else this.left.InsertNode(node); } } public bool SearchKey(int searchValue) { if (this.key == searchValue) return true; if (searchValue > this.key) { if (this.right == null) return false; else return this.right.SearchKey(searchValue); } else { if (this.left == null) return false; else return this.left.SearchKey(searchValue); }

数据结构- 顺序表的基本操作的实现-课程设计-实验报告

顺序表的基本操作的实现 一、实验目的 1、掌握使用VC++上机调试顺序表的基本方法; 2、掌握顺序表的基本操作:建立、插入、删除等运算。 二、实验仪器 安装VC++软件的计算机。 三、实验原理 利用线性表的特性以及顺序存储结构特点对线性表进行相关的基本操作四、实验内容 程序中演示了顺序表的创建、插入和删除。 程序如下: #include #include /*顺序表的定义:*/ #define ListSize 100 typedef struct { int data[ListSize]; /*向量data用于存放表结点*/ i nt length; /*当前的表长度*/ }SeqList; void main() { void CreateList(SeqList *L,int n); v oid PrintList(SeqList *L,int n); i nt LocateList(SeqList *L,int x); v oid InsertList(SeqList *L,int x,int i); v oid DeleteList(SeqList *L,int i); SeqList L;

i nt i,x; i nt n=10; L.length=0; c lrscr(); C reateList(&L,n); /*建立顺序表*/ P rintList(&L,n); /*打印建立后的顺序表*/ p rintf("INPUT THE RESEARCH ELEMENT"); s canf("%d",&x); i=LocateList(&L,x); p rintf("the research position is %d\n",i); /*顺序表查找*/ p rintf("input the position of insert:\n"); s canf("%d",&i); p rintf("input the value of insert\n"); s canf("%d",&x); I nsertList(&L,x,i); /*顺序表插入*/ P rintList(&L,n); /*打印插入后的顺序表*/ p rintf("input the position of delete\n"); s canf("%d",&i); D eleteList(&L,i); /*顺序表删除*/ P rintList(&L,n); /*打印删除后的顺序表*/ g etchar(); } /*顺序表的建立:*/ void CreateList(SeqList *L,int n) {int i; printf("please input n numbers\n"); for(i=1;i<=n;i++) scanf("%d",&L->data[i]); L->length=n;

数据结构实验总结报告

数据结构实验总结报告 一、调试过程中遇到哪些问题? (1)在二叉树的调试中,从广义表生成二叉树的模块花了较多时间调试。 由于一开始设计的广义表的字符串表示没有思考清晰,处理只有一个孩子的节点时发生了混乱。调试之初不以为是设计的问题,从而在代码上花了不少时间调试。 目前的设计是: Tree = Identifier(Node,Node) Node = Identifier | () | Tree Identifier = ASCII Character 例子:a(b((),f),c(d,e)) 这样便消除了歧义,保证只有一个孩子的节点和叶节点的处理中不存在问题。 (2)Huffman树的调试花了较长时间。Huffman编码本身并不难处理,麻烦的是输入输出。①Huffman编码后的文件是按位存储的,因此需要位运算。 ②文件结尾要刷新缓冲区,这里容易引发边界错误。 在实际编程时,首先编写了屏幕输入输出(用0、1表示二进制位)的版本,然后再加入二进制文件的读写模块。主要调试时间在后者。 二、要让演示版压缩程序具有实用性,哪些地方有待改进? (1)压缩文件的最后一字节问题。 压缩文件的最后一字节不一定对齐到字节边界,因此可能有几个多余的0,而这些多余的0可能恰好构成一个Huffman编码。解码程序无法获知这个编码是否属于源文件的一部分。因此有的文件解压后末尾可能出现一个多余的字节。 解决方案: ①在压缩文件头部写入源文件的总长度(字节数)。需要四个字节来存储这个信息(假定文件长度不超过4GB)。 ②增加第257个字符(在一个字节的0~255之外)用于EOF。对于较长的文件,

会造成较大的损耗。 ③在压缩文件头写入源文件的总长度%256的值,需要一个字节。由于最后一个字节存在或不存在会影响文件总长%256的值,因此可以根据这个值判断整个压缩文件的最后一字节末尾的0是否在源文件中存在。 (2)压缩程序的效率问题。 在编写压缩解压程序时 ①编写了屏幕输入输出的版本 ②将输入输出语句用位运算封装成一次一个字节的文件输入输出版本 ③为提高输入输出效率,减少系统调用次数,增加了8KB的输入输出缓存窗口 这样一来,每写一位二进制位,就要在内部进行两次函数调用。如果将这些代码合并起来,再针对位运算进行一些优化,显然不利于代码的可读性,但对程序的执行速度将有一定提高。 (3)程序界面更加人性化。 Huffman Tree Demo (C) 2011-12-16 boj Usage: huffman [-c file] [-u file] output_file -c Compress file. e.g. huffman -c test.txt test.huff -u Uncompress file. e.g. huffman -u test.huff test.txt 目前的程序提示如上所示。如果要求实用性,可以考虑加入其他人性化的功能。 三、调研常用的压缩算法,对这些算法进行比较分析 (一)无损压缩算法 ①RLE RLE又叫Run Length Encoding,是一个针对无损压缩的非常简单的算法。它用重复字节和重复的次数来简单描述来代替重复的字节。尽管简单并且对于通常的压缩非常低效,但它有的时候却非常有用(例如,JPEG就使用它)。 变体1:重复次数+字符 文本字符串:A A A B B B C C C C D D D D,编码后得到:3 A 3 B 4 C 4 D。

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

数据结构实现顺序表的各种基本运算(20210215233821)

实现顺序表的各种基本运算 一、实验目的 了解顺序表的结构特点及有关概念,掌握顺序表的各种基本操作算法思想及其实现。 二、实验内容 编写一个程序,实现顺序表的各种基本运算: 1、初始化顺序表; 2 、顺序表的插入; 3、顺序表的输出; 4 、求顺序表的长度 5 、判断顺序表是否为空; 6 、输出顺序表的第i位置的个元素; 7 、在顺序表中查找一个给定元素在表中的位置; 8、顺序表的删除; 9 、释放顺序表 三、算法思想与算法描述简图

主函数main

四、实验步骤与算法实现 #in clude #in clude #defi ne MaxSize 50 typedef char ElemType; typedef struct {ElemType data[MaxSize]; in t le ngth; void In itList(SqList*&L)〃 初始化顺序表 L {L=(SqList*)malloc(sizeof(SqList)); L->le ngth=0; for(i=0;ile ngth;i++) prin tf("%c ",L->data[i]); } void DestroyList(SqList*&L)〃 {free(L); } int ListEmpty(SqList*L)〃 {retur n( L->le ngth==O); } int Listle ngth(SqList*L)〃 {return(L->le ngth); } void DispList(SqList*L)〃 {int i; 释放顺序表 L

数据结构顺序表的实现

实验3 顺序表 一、实验目的 1. 熟练掌握顺序表的类型定义和基本操作算法(以建立、插入、删除、遍历、排序和归并等操作为重点)的实现。 2. 通过实验加深对C语言的使用(特别是函数、数组、结构体和指针)。 3. 掌握模块化程序设计方法。 二、预备知识 1. 顺序表的类型定义 //线性表存储空间的初始分配量 #define LIST_Init_Size 100 //线性表存储空间的分配增量 #define LISTINCREMENT 10 typedef struct{ ElemType *elem; //存储区域基地址 int length; //当前有效长度 int listsize;//当前分配的存储容量 } SqList, *PSqList; 2. 顺序表的基本操作 1)初始化线性表InitList(&L) 该运算的结果是构造一个空的线性表L,为线性表分配存储空间用于存放数据元素。 2)销毁线性表DestroyList(&L ) 该运算的结果是释放线性表L占用的内存空间。 3)判定是否为空表ListEmpty(L)

该运算返回一个值表示L是否为空表。若L为空表,则返回1,否则返回0。4)求线性表的长度ListLength(L) 该运算返回顺序表L的长度。实际上只需返回length成员的值即可。 5)PriorElem( L, cur_e, &pre_e ) 该运算返回给定数据元素的前驱数据元素的值 6)NextElem( L, cur_e, &next_e ) 该运算返回给定数据元素的后继数据元素的值 7)输出线性表DispList(L) 该运算当线性表L不为空时,顺序输出L中各数据元素的值。 8)求某个数据元素值GetElem(L,i,&e) 该运算返回L中第i(1≤i≤ListLength(L))个元素的值,存放在e中。 8)按元素值查找LocateElem(L,e) 该运算顺序查找第1个值域与e相等的数据元素的序号。若这样的元素不存在,则返回值为0。 9)插入数据元素ListInsert(&L,i,e) 该运算在顺序表L的第i个位置(1≤i≤ListLength(L)+1)上插入新的元素e。10)删除数据元素ListDelete(&L,i,&e) 该运算删除顺序表L的第i(1≤i≤ListLength(L))个元素。 11)清空线性表ClearList( &L ) 删除线性表L中的所有数据元素,但不释放已分配给线性表的存储空间。2. 两个有序表的归并算法 void MergeList(SqList La, SqList Lb, PSqList PLc) { InitList(PLc); // 构造空的线性表Lc i = j = 1; k = 1; La_len = ListLength(La); Lb_len = ListLength(Lb);

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

北京邮电大学电信工程学院 数据结构实验报告 实验名称:实验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、掌握线性表的定义; 2、掌握线性表的基本操作,如建立、查找、插入和删除等。 二、实验容 定义一个包含学生信息(学号,,成绩)的顺序表和链表(二选一),使其具有如下功能: (1) 根据指定学生个数,逐个输入学生信息; (2) 逐个显示学生表中所有学生的相关信息; (3) 根据进行查找,返回此学生的学号和成绩; (4) 根据指定的位置可返回相应的学生信息(学号,,成绩); (5) 给定一个学生信息,插入到表中指定的位置; (6) 删除指定位置的学生记录; (7) 统计表中学生个数。 三、实验环境 Visual C++ 四、程序分析与实验结果 #include #include #include #include #define OK 1 #define ERROR 0 #define OVERFLOW -2

typedef int Status; // 定义函数返回值类型 typedef struct { char num[10]; // 学号 char name[20]; // double grade; // 成绩 }student; typedef student ElemType; typedef struct LNode { ElemType data; // 数据域 struct LNode *next; //指针域 }LNode,*LinkList; Status InitList(LinkList &L) // 构造空链表L { L=(struct LNode*)malloc(sizeof(struct LNode)); L->next=NULL; return OK;

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

哈尔滨工业大学计算机科学与技术学院 实验报告 课程名称:数据结构与算法 课程类型:必修 实验项目名称:线性表实验 实验题目:算术表达式求值 班级: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. 实验题目:顺序表的操作 2.实验目的和要求: 1)了解顺 序表的基本概念、顺序表结构的定义及在顺序表上的基本操作(插入、 删除、查找以及线性表合并 )。 2)通过在 Turbo C ( WinTc ,或 visual stdio6 )实现以上操作的 C 语言 代码。 3)提前了解实验相关的知识(尤其是 C 语 言)。 3.实验内容:(二选一) 1) 顺序表的插入算法, 删除算法, 顺序表的合并算法 2) 与线性表应用相关的实例( 自己选择具体实例) 4.部分参考实验代码: ⑴ 顺序表结构的定义: #include #define MAXLEN 255 typedef int ElemType; typedef struct { ElemType elem[MAXLEN]; int length; }sqList; ⑵ 顺序表前插(在第i 号元素前插入一个新的元素) int ListInsert(sqList *la,int i,int x) { int j; if(i<0||i>la-> length +1) { printf( “ n the value of i is wrong! ” ); return 0; } if(la-> length +1>=MAXLEN) { printf( “ n overflow! ” ); return 0; }

. for(j=la-> length;j>=i;j--) la->list[j+1]=la->list[j]; la->list[i]=x; la-> length ++; return 1; } ⑶ 顺序表删除 int ListDelete(sqList *la,int i) { if(i<0||i>la-> length ) { printf( “ return 0; n”); } for(i;i length;i++) la->list[i-1]=la->list[i]; la-> length --; return 1; } 5.附录:实验预备知识: ⑴ 复习 C 语言中数组的用法。 ⑵ 了解线性表和顺序表的概念,顺序表的定义方法; 线性表是n 个数据元素的有限序列,至于每个数据元素的具体含义,在不同的情况下各不相同。 顺序表是线性表的顺序存储表示,是用一组地址连续的存储单元依次存储线性表的数据元素。 在 C 语言中,顺序表是用数组来实现的。 ⑶ 掌握线性表在顺序存储结构上实现基本操作:查找、插入、删除和 合并的算法。 在实现这些算法的时候,要注意判断输入数据的合法性,除此之外还要要注意以下内容: 在实现查找的时候,首先要判断该顺序表是否为空,其次要判断查找后的结果(查到时输出查到的数据,未查到时给出未查到提 示)。 在实现插入的时候,首先要判断该顺序表是否为满,如为满则报错 (此时要注意:顺序表是用数组来实现的,它不能随机分配空 间);如不为满,则需判断要插入的位置是否合法(例如:如果 一个线性表的元素只有10 个,而要在第0 个元素前插入或在第 11 个元素后插入就为不合法)。其次要注意是前插还是后插,两

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

数据结构实验报告 实验名称:实验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<

数据结构C语言版 串的定长顺序存储表示和实现

#include #include #include #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define OVERFLOW -2 #define MAXSTRLEN 255 typedef int ElemType; typedef int Status; typedef unsigned char SString[MAXSTRLEN+1]; //串赋值操作 Status StrAssign(SString T,char chars[]){ // 生成一个其值等于chars的串T int i; if(strlen(chars)>MAXSTRLEN) return ERROR; T[0]=strlen(chars); for(i=0;i<=T[0];i++){ T[i+1]=chars[i];} return OK; }//StrAssign //输出串 void StrPrint(SString S){ int i; for(i=1;i<=S[0];i++){ printf("%c",S[i]); } printf("\n"); }//PrnStr //串复制操作 Status StrCopy(SString T,SString S){ // 由串S复制得串T int i; for(i=1;i<=S[0];i++) T[i]=S[i]; T[0]=S[0]; return OK; }//StrCopy //判空操作 Status StrEmpty(SString S){ if(S[0]==0) return OK;

数据结构实验报告一

数据结构实验报告 (实验名称) 1.实验目标 熟练掌握线性表的顺序存储结构和链式存储结构。 熟练掌握顺序表和链表的有关算法设计。 根据具体问题的需要,设计出合理的表示数据的顺序和链式结构,并设计相关算法。 2.实验内容和要求 内容: <1>在第i个结点前插入值为x的结点。 实验测试数据基本要求: 第一组数据:线性表长度n≥10,x=100, i分别为5,n,n+1,0,1,n+2 第二组数据:线性表长度n=0,x=100,i=5 <2>删除线性表中第i个元素结点。 实验测试数据基本要求: 第一组数据:线性表长度n≥10,i分别为5,n,1,n+1,0 第二组数据:线性表长度n=0, i=5 <3>在一个递增有序的线性表L中插入一个值为x的元素,并保持其递增有 序特性。 实验测试数据基本要求: 线性表元素为(10,20,30,40,50,60,70,80,90,100), x分别为25,85,110和8 <4>求两个递增有序线性表L1和L2中的公共元素,放入新的顺序表L3中。 实验测试数据基本要求: 第一组 第一个线性表元素为(1,3,6,10,15,16,17,18,19,20) 第二个线性表元素为(1,2,3,4,5,6,7,8,9,10,18,20,30)第二组 第一个线性表元素为(1,3,6,10,15,16,17,18,19,20) 第二个线性表元素为(2,4,5,7,8,9,12,22) 第三组 第一个线性表元素为() 第二个线性表元素为(1,2,3,4,5,6,7,8,9,10)

要求:每个题目分别用顺序存储和链式存储实现; 实验程序有较好可读性,各运算和变量的命名直观易懂,符合软件工程要求; 程序有适当的注释。 3.数据结构设计 顺序表结构,链表结构。 4.算法设计 (除书上给出的基本运算(这部分不必给出设计思想),其它实验内容要给出算法设计思想) 按顺序插入:首先插入一个元素,表长加一,用do,while循环整个顺序表,从最后一位开始,比x大的都向后移一位,在第一个小于x的后面停止遍历,吧x插在比x小的第一个数的后面。 寻找两个顺序表中相同的元素:运用嵌套循环,最外层循环遍历第一个表里面的元素为母元素,内部循环遍历第二个表为子元素。在子元素中查找与母元素相同的元素,改变第一个表里面的元素,把相同的放进去,最后删除表一中除了新放进来的元素。 5.运行和测试 顺序表: 1: 2:

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

实验一线性表及其应用 一、实验目的 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

数据结构实验报告-顺序表的创建、遍历及有序合并操作

数据结构实验报告-顺序表的创建、遍历及有序合并操作二、实验内容与步骤 实现顺序表的创建、遍历及有序合并操作,基本数据结构定义如下: typedef int ElemType; #define MAXSIZE 100 #define FALSE 0 #define TRUE 1 typedef struct {ElemType data[MAXSIZE]; int length; }seqlist; 创建顺序表,遍历顺序表 #include #include #define MAXSIZE 100 #define Icreament 20 #define FALSE 0

#define TRUE 1 typedef int ElemType; //用户自定义数据元素类型 // 顺序表结构体的定义 typedef struct { ElemType *elem; //顺序表的基地址 int length; //顺序表的当前长度 int listsize; //预设空间容量 }SqList; //线性表的顺序存储结构 SqList* InitList() //创建空的顺序表 { SqList* L = (SqList*)malloc(sizeof(SqList));//定义顺序表L if(!L) { printf("空间划分失败,程序退出\n"); return NULL; } L->elem=(ElemType *)malloc(MAXSIZE*sizeof(ElemType)); if(!L->elem) { printf("空间划分失败,程序退出\n");

相关文档
最新文档