文档库 最新最全的文档下载
当前位置:文档库 › 数据结构顺序表与单链表的建立

数据结构顺序表与单链表的建立

数据结构顺序表与单链表的建立
数据结构顺序表与单链表的建立

封面:

安徽大学

网络工程

数据结构顺序表与单链表的建立

——2012/4/7

一实验目的

1.熟练掌握线性表的基本操作在顺序存储和链式存储上的实现。

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

3.通过本章实验加深对c语言的使用(特别是函数的参数调用、指针类型的应用

和链表的建立等各种基本操作)。

二实验内容

1. 顺序表的基本操作的实现.包括:

(1).顺序表的类型定义;

(2).创建一个元素为1,10,9,5的顺序表;

(3) .向(2)中表的指定位置插入一个元素;

(4).删除(3)中顺序表中指定位置的元素;

(5).依次输出(2)~(4)顺序表中的元素.

2. 链表的基本操作的实现.包括:

(1).链表的类型定义;

(2).创建一个元素为5,-4,9,10,3的链表;

(3) .向(2)表中指定位置插入一个元素;

(4).删除(3)表中指定位置的元素;

(5).依次输出(2)~(4)表中的元素.

三、实验步骤

1.本实验用到的数据结构

(1)逻辑结构:线性结构

(2)存储结构;顺序存储结构,链式存储结构

2.各程序的功能和算法设计思想

程序一// 数据结构实验.cpp : 定义控制台应用程序的入口点。

//

#include"stdafx.h"

#include

#include

#include

# define OK 1

# define ERROR 0

# define OVERFLOW -2

# define LISTINITSIZE 100

# define LISTINCREMENT 10

typedef int status;

typedef struct {

int * elem;

int length;

int listsize;

}sqlist;

void Initlist (sqlist *l)

{

(*l).elem= (int*)malloc(LISTINITSIZE * sizeof(int));

if(!(*l).elem)

exit (OVERFLOW);

(*l).length=0;

(*l).listsize=LISTINITSIZE;

}

status ListInsert (sqlist *l, int i, int h)

{

int *newbase,*q,*p;

if (i<1|| i>(*l).length+1)

{

printf("插入位置不合法!\n");

return ERROR;

}

if ((*l).length>= (*l).listsize)

{

newbase = (int *)realloc((*l).elem , ((*l).listsize + LISTINCREMENT) * sizeof(int));

if (! newbase)

exit (OVERFLOW);

(*l).elem = newbase;

(*l).listsize+=LISTINCREMENT;

}

q =(*l).elem + i-1;

for (p=(*l).elem + (*l).length-1;p>=q;--p)

{

*(p+1)=*p;

}

*q=h;

++(*l).length;

return OK;

}

status Getelem(sqlist l, int i,int *e)

{

if (i<1||(i>l.length))

{

printf("输入位置不合法!\n");

return ERROR;

}

*e= *(l.elem +i-1);

printf("第%d个元素的值是:%d\n",i,*e);

printf("\n");

return OK;

}

status ListDelete(sqlist *l, int i)

{

int *p,*q;

if (i<1||i>((*l).length))

{

printf("删除元素位置不合法!\n");

return ERROR;

}

p = (*l).elem+i-1;

printf("删除第%d个元素%d\n",i,*p);

q= (*l).elem+ (*l).length-1;

for (++p;p<=q;++p)

*(p-1)=*p;

(*l).length--;

return OK;

}

void ListTraverse(sqlist l)

{

int *p;

int i ;

p= l.elem;

for ( i=1; i<=l.length; i++)

printf("%d\n",*p++);

printf("\n");

}

void main()

{

int n,i,j,k,e,h,m=1;

sqlist la;

Initlist(&la);

printf("请输入顺序表的长度n\n");

scanf ("%d",&n);

printf("请输入%d个数据\n",n);

for (j =1;j<=n;j++)

{

scanf("%d",&e);

ListInsert(&la,j,e);

}

printf("输出各元素\n");

printf ("la=");

ListTraverse(la);

fflush(stdin);

printf("\n");

printf ("请依次输入插入元素的位置i,插入元素的值h\n");

scanf("%d",&i);

scanf("%d",&h);

printf("在第%d个元素前面插入元素%d\n",i,h);

ListInsert(&la,i,h);

printf("输出各元素\n");

printf("la=");

ListTraverse(la);

fflush(stdin);

printf("\n");

while(m)

{

printf ("请输入查找元素的位置k\n");

scanf ("%d",&k);

if (Getelem(la,k,&e))

m=0;

fflush(stdin);

}

printf("请输入删除元素的位置\n");

scanf ("j=%d",&j);

printf ("删除的第%d各元素是\n",j);

ListDelete(&la,j);

printf("la=");

ListTraverse(la);

printf("\n");

}

功能:建立一个线性顺序结构,能够实现初始化顺序表,查找元素,插入元素,删除元素和输出顺序表等。

算法设计思想:单独建立具有初始化,插入,删除,查找,输出功能的函数,其后按照合理的顺序构建一个主函数。

调试情况如下:

输入/输出要求

输入数据:

数据类型:有符号整型((signed)int )

值域范围:-32768~32767

程序二// shuju2.cpp : 定义控制台应用程序的入口点。//

// shuju2.cpp : 定义控制台应用程序的入口点。

//

#include"stdafx.h"

#include

#include

#include

# define OK 1

# define ERROR 0

typedef int status;

typedef struct LNode{

int data;

struct LNode *next;

}Lnode,*Linklist;

void Createlist(Linklist *l,int n){

int i;

Linklist p;

*l=(Linklist) malloc(sizeof(Lnode));

(*l)->next=NULL;

printf("请输入%d个元素\n",n);

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

p=(Linklist) malloc(sizeof(Lnode));

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

p->next=(*l)->next;

(*l)->next=p;

}

}

status Getelem(Linklist *l,int i, int *e){

int j=1;

Linklist p;

p=(*l)->next;

while (p && j

p=p->next;

++j;

}

if(!p||j>i){

printf("第%d个元素不存在\n",i);

return ERROR;

}

*e=p->data;

printf("第%d个元素是%d\n",i,*e);

return OK;

}

status Listinsert(Linklist l,int i,int e){

int j=0;

p=l;

while(p&&j

p=p->next;

++j;

}

if(!p||j>i-1)

{

printf("插入位置不合法\n");

return ERROR;

}

s=(Linklist) malloc (sizeof(Lnode));

s->data = e;

s->next=p->next;

p->next=s;

return OK;

}

status ListDelete(Linklist l,int i){ int j=0,h;

Linklist p,q;

p=l;

while(p->next&& j

{

p=p->next;

++j;

}

if (!(p->next)||j>i-1)

{

printf("删除位置不合法\n");

return ERROR;

}

q=p->next;

p->next=q->next;

h=q->data;

printf("删除的元素是%d",h);

free(q);

return OK;

}

void ListTraverse(Linklist l){

Linklist p;

p=l->next;

while(p){

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

p=p->next;

}

}

void main (){

int i,j,n,k,e,m=1;

printf("请输入单链表的长度\n");

scanf("%d",&n);

printf("逆位序建表\n");

Createlist(&la,n);

printf("输出各元素\n");

printf("la=");

ListTraverse(la);

fflush(stdin);

printf("\n");

while(m){

printf("请输入查找元素的位置k\n");

scanf("%d",&k);

if(Getelem(&la,k,&e))

m=0;

fflush(stdin);

printf("\n");

}

m=1;

while(m){

printf("请输入要插入元素的位置i及数值e\n");

scanf("%d",&i);

scanf("%d",&e);

if(Listinsert(la,i,e))

m=0;

printf("输出各元素\n");

printf("la=");

ListTraverse(la);

fflush(stdin);

printf("\n");

}

m=1;

while(m){

printf("请输入删除元素的位置j\n");

scanf("%d",&j);

if(ListDelete(la,j))

m=0;

printf("输出各元素\n");

printf("la=");

ListTraverse(la);

printf("\n");

}

}

功能:建立一个单链表,能够实现初始化单链表,查询,删除,插入以及输出个功能。

算法设计思想:利用逆序的方法构建一个Createlist子函数,再分别建立具有插入,查询,删除,输出功能的

子函数,最后建立一个main函数按一定顺序调用各个子函数,实现程序设计。

调试情况如下:

输入/输出要求

输出数据:

数据类型:有符号整型((signed)int )

值域范围:-32768~32767

实验总结:

(1)实验时碰到过函数指针调用错误,以及结构体类数据调用错误,如将(*L)的

形式写成L。缺乏部分数据类型定义也

常遇等……

(2)通过本次实验,加深了对函数指针调用和结构体内部成员调用的认识,进一步

熟悉了构建顺序表,单链表和删除,查

询,插入元素等方法。

(3)实验前应该编号基本的程序,尽量熟悉。

数据结构顺序表真题

第二章复习题 本章重点掌握:线性结构特点,顺序存储结构和链式存储结构特点。 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)删除指定位置的学生记录;

数据结构 单链表基本操作代码

实验一单链表 #include "stdio.h" #include "stdlib.h" typedef int ElemType; typedef struct LNode { ElemType data; struct LNode *next; }LNode,*LinkList; void creatLNode(LinkList &head) { int i,n; LNode *p; head=(LNode*)malloc(sizeof(LNode)); head->next=NULL; printf("请输入链表的元素个数:"); scanf("%d",&n); for(i=n;i>0;i--) { p=(LNode*)malloc(sizeof(LNode)); printf("第%d个元素:",i); scanf("%d",&p->data); p->next=head->next; head->next=p; } } void InsertLNode(LinkList &L) { LNode *p=L; int i,j=0,e; printf("请输入你要插入的位置(超过链表长度的默认插在最后!):"); scanf("%d",&i); printf("请输入你要插入的元素:"); scanf("%d",&e); while (p->next&&jnext; ++j; }

LNode *s; s=(LNode*)malloc(sizeof(LNode)); s->data=e; s->next=p->next; p->next=s; } int DeleteLNode(LinkList &L,int i,int &e) { LNode *p; p=L; LNode *q; int j=0; while (p->next&&jnext; ++j; } if(!(p->next)||j>i-1) { printf("删除位置不合理!\n"); return 0; } q=p->next; p->next=q->next; e=q->data; free(q); return e; } void DeleteCF(LinkList &L) { LNode *p,*s,*r; p=L->next; while(p!=NULL) { r=p; s=r->next; while(s!=NULL) { if(p->data==s->data) { r->next=s->next; s=s->next;

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

顺序表的基本操作的实现 一、实验目的 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;

数据结构 单链表详解

数据结构的概念: 数据的逻辑结构+ 数据的存储结构+ 数据的操作; 数据的数值:=====》数据===》数值型数据整形浮点数ASCII 非数值型数据图片声音视频字符 =====》数据元素=====》基本项组成(字段,域,属性)的记录。 数据的结构: 逻辑结构 ----》线性结构(线性表,栈,队列) ----》顺序结构 ----》链式结构 ----》非线性结构(树,二叉树,图) ----》顺序结构 ----》链式结构 存储结构 -----》顺序存储 -----》链式存储 -----》索引存储 -----》哈希存储==散列存储 数据的操作: 增 删 改 查 DS ====》数据结构===》DS = (D,R); 数据结构中算法: 1、定义:有穷规则的有序集合。 2、特性: 有穷性 确定性

输入 输出 3、算法效率的衡量 时间复杂度计算===》算法中可执行依据的频度之和,记为:T(n)。 是时间的一种估计值不是准确值。 计算结果的分析:1 将最终结果的多项式中常数项去掉 2 只保留所有多项式中最高阶的项 3 最后的最高阶项要去掉其常数项 时间复杂度的量级关系: 常量阶====》对数阶===》线性阶===》线性对数阶====》平方阶===》立方阶===》指数阶 以上关系可以根据曲线图来判断算法对时间复杂度的要求 空间复杂度计算====》算法执行过程中所占用的存储空间的量级,记为:D(n)。 计算方法是在运行过程中申请的动态内存的量级计算。 ///////////////////////////////////////////////////////////////////////////////////////////////// 线性表 顺序存储====》顺序表(数组) 链式存储====》单链表 特征:对于非空表,a0是表头没有前驱。 an-1 是表尾没有后继 ai的每个元素都有一个直接前驱和直接后继 基本操作:创建表=====》增加元素====》删除元素====》改变元素值====》查询元素 1、顺序表的操作 1.1 创建顺序表=====》定义个指定类型的数组====》int a[100] ={0};

数据结构实现顺序表的各种基本运算(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);

数据结构课程设计单链表操作

《数据结构课程设计》报告 题目:单链表操作 专业:计算机科学与技术 班级: 单链表操作 针对带头结点的单循环链表,编写实现以下操作的算法函数。

实现要求: ⑴单链表建立函数create:先输入数据到一维数组A[M]中,然后根据一维 数组A[M]建立一个单循环链表,使链表中个元素的次序与A[M]中各元素的次序相同,要求该函数的时间复杂度为O(m); ⑵定位查找函数Locate:在所建立的单循环链表中查找并返回值为key的 第1个元素的结点指针;若找不到,则返回NULL; ⑶求出该链表中值最大和次大的元素值,要求该算法的时间复杂度为O(m), 最大和次大的元素值通过指针变量带回,函数不需要返回值; ⑷将链表中所有值比key(值key通过形参传入)小的结点作为值为key的结 点前驱,所有值比key大的结点作为值为key的结点后继,并尽量保持原有结点之间的顺序,要求该算法的时间复杂度为O(m); ⑸设计一个菜单,具有上述处理要求和退出系统功能。 ⒈本人完成的工作: 一、定义结构体:LNode 二、编写以下函数: (1)建立单循环链表 (2)建立定位查找函数 (3)求出链表中最大和次大值 (4)将链表中的值和输入的Key比较,小的作为key前驱结点,大的作为key 的后继结点 三、设计具有上述处理要求和退出系统菜单 ⒉所采用的数据结构:单链表 数据结构的定义: typedef struct Node //定义结点的结构体 { DataType data; //数据域 struct Node *next; //指针域

}LNode; //结点的类型 ⒊所设计的函数 (1)Create(void) LNode *Create(void) //建立单循环链表,链表头结点head作为返回值{ int i,j,n,A[M]; //建立数组A【M】 LNode *head,*p,*move; head=(LNode*)malloc(sizeof(LNode)); //创建空单循环链表head->next=head; move=head; printf("请输入数组元素的个数:"); //输入数组 scanf("%d",&n); printf("请输入数组:"); for(i=0;idata=A[j]; p->next=move->next; move->next=p; move=move->next; } return head; //返回头指针

数据结构课程设计单链表

目录 1 选题背景 (2) 2 方案与论证 (3) 2.1 链表的概念和作用 (3) 2.3 算法的设计思想 (4) 2.4 相关图例 (5) 2.4.1 单链表的结点结构 (5) 2.4.2 算法流程图 (5) 3 实验结果 (6) 3.1 链表的建立 (6) 3.2 单链表的插入 (6) 3.3 单链表的输出 (7) 3.4 查找元素 (7) 3.5 单链表的删除 (8) 3.6 显示链表中的元素个数(计数) (9) 4 结果分析 (10) 4.1 单链表的结构 (10) 4.2 单链表的操作特点 (10) 4.2.1 顺链操作技术 (10) 4.2.2 指针保留技术 (10) 4.3 链表处理中的相关技术 (10) 5 设计体会及今后的改进意见 (11) 参考文献 (12) 附录代码: (13)

1 选题背景 陈火旺院士把计算机60多年的发展成就概括为五个“一”:开辟一个新时代----信息时代,形成一个新产业----信息产业,产生一个新科学----计算机科学与技术,开创一种新的科研方法----计算方法,开辟一种新文化----计算机文化,这一概括深刻影响了计算机对社会发展所产生的广泛而深远的影响。 数据结构和算法是计算机求解问题过程的两大基石。著名的计算机科学家P.Wegner指出,“在工业革命中其核心作用的是能量,而在计算机革命中其核心作用的是信息”。计算机科学就是“一种关于信息结构转换的科学”。信息结构(数据结构)是计算机科学研究的基本课题,数据结构又是算法研究的基础。

2 方案与论证 2.1 链表的概念和作用 链表是一种链式存储结构,链表属于线性表,采用链式存储结构,也是常用的动态存储方法。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。 以“结点的序列”表示线性表称作线性链表(单链表) 单链表是链式存取的结构,为找第 i 个数据元素,必须先找到第 i-1 个数据元素。 因此,查找第 i 个数据元素的基本操作为:移动指针,比较 j 和 i 单链表 1、链接存储方法 链接方式存储的线性表简称为链表(Linked List)。 链表的具体存储表示为: ① 用一组任意的存储单元来存放线性表的结点(这组存储单元既可以是连续的,也可以是不连续的) ② 链表中结点的逻辑次序和物理次序不一定相同。为了能正确表示结点间的逻辑关系,在存储每个结点值的同时,还必须存储指示其后继结点的地址(或位置)信息(称为指针(pointer)或链(link)) 注意: 链式存储是最常用的存储方式之一,它不仅可用来表示线性表,而且可用来表示各种非线性的数据结构。 2、链表的结点结构 ┌───┬───┐ │data │next │ └───┴───┘ data域--存放结点值的数据域 next域--存放结点的直接后继的地址(位置)的指针域(链域) 注意: ①链表通过每个结点的链域将线性表的n个结点按其逻辑顺序链接在一起的。 ②每个结点只有一个链域的链表称为单链表(Single Linked List)。

数据结构实验2.1顺序表

附页(实验2-1代码): 头文件“DEFINE2-1.h”: #define MaxSize 10 typedef struct { char data[MaxSize]; int length; }SqList; #include #include #include"DEFINE2-1.h" void InitList(SqList * &L) //初始化线性表 { L = (SqList*)malloc(sizeof(SqList)); //分配存放线性表的空间L->length = 0; //置空线性表长度为0 } bool ListInsert(SqList *&L, int i, char e) //插入数据元素 { int j; if (i<1 || i>L->length + 1) return false; //参数错误是返回false I--; //将顺序表逻辑序号转换为物理序号for (j = L->length; j>i; j--) //将data[i]及后面元素后移一个位置L->data[j] = L->data[j - 1]; L->data[i] = e; //插入元素e L->length++; //顺序表长度+1 return true; //成功插入返回true } void DispList(SqList *L) //输出线性表L { int i; for (i = 0; ilength; i++) //扫描顺序表输出各元素值printf("%3c", L->data[i]); printf("\n\n"); } int ListLength(SqList *L) //求线性表L的长度 { return (L->length); }

实验一数据结构顺序表的插入和删除

实验一顺序表的操作 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 个元素后插入就为不合法)。其次要注意是前插还是后插,两

数据结构单链表输入输出(c++)

#include template class link { public: T date; link *next; link(const T info, link *nextvalue=NULL) { date=info; next=nextvalue; } link(link *nextvalue) { next=nextvalue; } }; templateclass inklist{ private: link *head,*tail; link *setpos(const int p); public: inklist(); ~inklist(); bool append(const T value); bool insert(const int p,const T value); bool remove(const int p); void print(); }; template inklist::inklist() { head=tail=new link(NULL); } template inklist::~inklist() { link *tmp; while(head!=NULL) { tmp=head; head=head->next; delete tmp; }

} template link *inklist::setpos(int i) { int count=0; if(i==-1) return head; link *p=new link(head->next); while( p!=NULL && countnext; count++; } return p; } template bool inklist::insert(const int i,const T value) { link *p,*q; if((p=setpos(i-1))==NULL){ cout<<"非法插入点"<(value,p->next); p->next=q; if(p==tail) tail=q; return true;} template bool inklist::remove(const int i) { link *p,*q; if((p=setpos(i-1))==NULL||p==tail) { cout<<"非法删除点"; return false; } q=p->next; if(q==tail) { tail=p; p->next=NULL; delete q; }

数据结构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、帮助读者复习C++语言程序设计中的知识。 2、熟悉线性表的逻辑结构。 3、熟悉线性表的基本运算在两种存储结构上的实现,其中以熟悉链表的操作为侧重点。 二、实验内容 [问题描述] 实现带头结点的单链表的建立、求长度,取元素、修改元素、插入、删除等单链表的基本操作。 [基本要求] (1)依次从键盘读入数据,建立带头结点的单链表; (2)输出单链表中的数据元素 (3)求单链表的长度; (4)根据指定条件能够取元素和修改元素; (5)实现在指定位置插入和删除元素的功能。 三、算法设计 (1)建立带表头结点的单链表;首先输入结束标志,然后建立循环逐个输入数据,直到输入结束标志。 (2)输出单链表中所有结点的数据域值;首先获得表头结点地址,然后建立循环逐个输出数据,直到地址为空。 (3)输入x,y在第一个数据域值为x的结点之后插入结点y,若无结点x,则在表尾插入结点y;建立两个结构体指针,一个指向当前结点,另一个指向当前结点的上一结点,建立循环扫描链表。当当前结点指针域不为空且数据域等于x的时候,申请结点并给此结点数据域赋值为y,然后插入当前结点后面,退出函数;当当前结点指针域为空的时候,申请结点并给此结点数据域赋值为y,插入当前结点后面,退出函数。 (4)输入k,删除单链表中所有的结点k,并输出被删除结点的个数。建立三个结构体指针,一个指向当前结点,另一个指向当前结点的上一结点,最后一个备用;建立整形变量l=0;建立循环扫描链表。当当前结点指针域为空的时候,如果当前结点数据域等于k,删除此结点,l++,跳出循环,结束操作;如果当前结点数据域不等于k,跳出循环,结束操作。当当前结点指针域不为空的时候,如果当前结点数据域等于k,删除此结点,l++,继续循环操作;如果当前结点数据域不等于k,指针向后继续扫描。循环结束后函数返回变量l的值,l便是删除的结点的个数。

顺序表的应用数据结构实验报告记录

顺序表的应用数据结构实验报告记录

————————————————————————————————作者:————————————————————————————————日期:

大学数据结构实验报告 课程名称数据结构实验第(三)次实验实验名称顺序表的应用 学生姓名于歌专业班级学号 实验成绩指导老师(签名)日期2018年9月30日一、实验目的 1.学会定义线性表的顺序存储类型,实现C程序的基本结构,对线性表的一些基本操作和具体的函数定义。 2.掌握顺序表的基本操作,实现顺序表的插入、删除、查找以及求并集等运算。 3.掌握对多函数程序的输入、编辑、调试和运行过程。 二、实验要求 1.预习C语言中结构体的定义与基本操作方法。 2.对顺序表的每个基本操作用单独的函数实现。 3.编写完整程序完成下面的实验内容并上机运行。 4.整理并上交实验报告。 三、实验内容: 1.定义一个包含学生信息(学号,姓名,成绩)的顺序表,使其具有如下功能: (1)根据指定学生个数,逐个输入学生信息 (2)逐个显示学生表中所有学生的相关信息 (3)根据姓名进行查找,返回此学生的学号和成绩 (4)根据指定的位置可返回相应的学生信息(学号,姓名,成绩) (5)给定一个学生信息,插入到表中指定的位置 (6)删除指定位置的学生记录 (7)统计表中学生个数 四、实验设计 1.定义一个包含学生信息(学号,姓名,成绩)的顺序表,使其具有如下功能: (1)根据指定学生个数,逐个输入学生信息 for(count=0; count

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

数据结构实验报告-顺序表的创建、遍历及有序合并操作二、实验内容与步骤 实现顺序表的创建、遍历及有序合并操作,基本数据结构定义如下: 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");

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

数据结构实验一顺序表的实现 班级学号分数 一、实验目的: 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;ielem[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(); } 程序的运行结果:

数据结构实验一_顺序表的基本操作实验报告

实验一顺序表的基本操作 一、实验目的 掌握线性表的顺序表基本操作:建立、插入、删除、查找、合并、打印等运算。 二、实验要求包含有头文件和main函数; 1.格式正确,语句采用缩进格式; 2.设计子函数实现题目要求的功能; 3.编译、连接通过,熟练使用命令键; 4.运行结果正确,输入输出有提示,格式美观。 三、实验设备、材料和工具 1.奔腾2计算机或以上机型 2.turboc2,win-tc 四、实验内容和步骤 1. 建立一个含n个数据元素的顺序表并输出该表中各元素的值及顺序表的长度。 2. 往该顺序表中第i位置插入一个值为x的数据元素。 3. 从该顺序表中第j位置删除一个数据元素,由y返回。 4. 从该顺序表中查找一个值为e的数据元素,若找到则返回该数据元素的位置,否则返回“没有找到”。 五、程序 #include #include #define list_init_size 10 #define increment 2

typedef struct { int *elem; int length,listsize; }sqlist; //类型定义 void initlist_sq(sqlist &L) //初始化顺序表 { } void output(sqlist L) //输出顺序表 { } void insertlist(sqlist &L,int i, int x) //顺序表中插入x { } void deletelist(sqlist &L,int j, int y) //顺序表中删除y { } int locateelem(sqlist &L,int e) //顺序表中查找e { } void main() { } 【运行结果】 void initlist_sq(sqlist &L) //初始化顺序表 { L.elem=(int*)malloc(LIST_INIT_SIZE*sizeof(int)); if(!L.elem) exit (OVERFLOW);

相关文档
相关文档 最新文档