数据结构实验报告一 顺序表与链表
一、实验目的
1、掌握线性表中元素的前驱、后续的概念。
2、掌握顺序表与链表的建立、插入元素、删除表中某元素的算法。
3、对线性表相应算法的时间复杂度进行分析。
4、理解顺序表、链表数据结构的特点(优缺点)。
二、实验内容和要求
1、阅读下面程序,在横线处填写函数的基本功能。并运行程序,写出结果。
#include<stdio.h>
#include<malloc.h>
#define ERROR 0
#define OK 1#define INIT_SIZE 5 /*初始分配的顺序表长度*/
#define INCREM 5 /*溢出时,顺序表长度的增量*/
typedef int ElemType; /*定义表元素的类型*/
typedef struct Sqlist{ElemType *slist; /*存储空间的基地址*/int length; /*顺序表的当前长度*/int listsize; /*当前分配的存储空间*/
}Sqlist;int InitList_sq(Sqlist *L); /*构造一个空的顺序表L*/
int CreateList_sq(Sqlist *L,int n); /*向顺序表首位置插入n个元素*/
int ListInsert_sq(Sqlist *L,int i,ElemType e);/*在顺序表第i个位置插入元素e*/
int PrintList_sq(Sqlist *L); /*输出顺序表的元素*/
int ListDelete_sq(Sqlist *L,int i); /*删除第i个元素*/
int ListLocate(Sqlist *L,ElemType e); /*查找值为e的元素*/int InitList_sq(Sqlist *L){L->slist=(ElemType*)malloc(INIT_SIZE*sizeof(ElemType));if(!L->slist) return ERROR; L->length=0; L->listsize=INIT_SIZE; return OK;
}/*InitList*/int CreateList_sq(Sqlist *L,int n){ElemType e;int i;for(i=0;i<n;i++){printf("input data %d",i+1);scanf("%d",&e);if(!ListInsert_sq(L,i+1,e))return ERROR;}return OK;
}/*CreateList*//*输出顺序表中的元素*/
int PrintList_sq(Sqlist *L){int i;for(i=1;i<=L->length;i++)printf("%5d",L->slist[i-1]);return OK;
}/*PrintList*/int ListInsert_sq(Sqlist *L,int i,ElemType e){int k;
if(i<1||i>L->length+1)
return ERROR;
if(L->length>=L->listsize){
L->slist=(ElemType*)realloc(L->slist,
(INIT_SIZE+INCREM)*sizeof(ElemType));if(!L->slist)
return ERROR;
L->listsize+=INCREM;
}for(k=L->length-1;k>=i-1;k--){ L->slist[k+1]= L->slist[k];}L->slist[i-1]=e; L->length++; return OK;
}/*ListInsert*//*在顺序表中删除第i个元素*/
int ListDelete_sq(Sqlist *L,int i){int j;if(i<1||i>L->length)return ERROR;for(j=i;j<L->length;j++)L->slist[j-1]=L->slist[j];L->length--;return OK;
}
/*在顺序表中查找指定值元素,返回其序号*/
int ListLocate(Sqlist *L,ElemType e){ ElemType *p;int i=1;p=L->slist;while(i<=L->length){if((*p++)!=e);elseprintf("%d ",i);++i;}printf("\n");return OK;
}int main(){Sqlist sl;int n,m,k,r,l;printf("please input n:"); /*输入顺序表的元素个数*/scanf("%d",&n);if(n>0){printf("\n1-Create Sqlist:\n");InitList_sq(&sl);CreateList_sq(&sl,n);printf("\n2-Print Sqlist:\n");PrintList_sq(&sl);printf("\nplease input insert location and data:(location,data)\n");scanf("%d,%d",&m,&k);ListInsert_sq(&sl,m,k);printf("\n3-Print Sqlist:\n");PrintList_sq(&sl);printf("\nplease input delete location:\n");scanf("%d",&r);ListDelete_sq(&sl,r);printf("\n4-Print Sqlist:\n");PrintList_sq(&sl);printf("\nplease input locate data:\n");scanf("%d",&l);ListLocate(&sl,l);printf("\n");}elseprintf("ERROR");return 0;
}
运行结果
算法分析
插入一次的时间复杂度为O(n)
2、为第1题补充删除和查找功能函数,并在主函数中补充代码验证算法的正确性。
删除算法代码:
int ListDelete_sq(Sqlist *L,int i){int j;if(i<1||i>L->length)return ERROR;for(j=i;j<L->length;j++)L->slist[j-1]=L->slist[j];L->length--;return OK;
}
运行结果
算法分析
删除操作一次时间复杂度为O(n)
查找算法代码:
int ListLocate(Sqlist *L,ElemType e){ ElemType *p;int i=1;p=L->slist;while(i<=L->length){if((*p++)!=e);elseprintf("%d ",i);++i;}printf("\n");return OK;
}
运行结果
算法分析
查找操作一次时间复杂度为O(n)
3、阅读下面程序,在横线处填写函数的基本功能。并运行程序,写出结果。
#include<stdio.h>
#include<malloc.h>
#define ERROR 0
#define OK 1
typedef int ElemType; /*定义表元素的类型*/
typedef struct LNode{ /*线性表的单链表存储*/ElemType data;struct LNode *next;
}LNode,*LinkList;LinkList CreateList(int n); /*建立带头结点的空链表并存入n个元素*/
void PrintList(LinkList L); /*输出带头结点单链表的所有元素*/
int GetElem(LinkList L,int i,ElemType *e); /*当带头结点的空链表第i个元素存在时赋值给e并返回OK,否则返回ERROR*/LinkList CreateList(int n){LNode *p,*q,*head;int i;head=(LinkList)malloc(sizeof(LNode)); head->next=NULL;p=head;for(i=0;i<n;i++){q=(LinkList)malloc(sizeof(LNode)); printf("input data %i:",i+1);scanf("%d",&q->data); /*输入元素值*/q->next=NULL; /*结点指针域置空*/p->next=q; /*新结点连在表末尾*/p=q;}return head;
}/*CreateList*/void PrintList(LinkList L){LNode *p;p=L->next; /*p指向单链表的第1个元素*/while(p!=NULL){printf("%5d",p->data);p=p->next;}
}/*PrintList*/int GetElem(LinkList L,int i,ElemType *e){LNode *p;int j=1;p=L->next;while(p&&j<i){ p=p->next;j++;}if(!p||j>i)return ERROR;
*e=p->data;
return OK;
}/*GetElem*/int InsertElem(LinkList L,int i,ElemType e){int j=0;LinkList p = L,s;while(p&&j<i-1){p=p->next;j++;}if(!p||j>i-1){printf("the node isn't exist\n");return ERROR;}s = (LinkList)malloc(sizeof(LNode));s->data = e;s->next = p->next;p->next = s;return OK;
}int DeleteElem(LinkList L,int i){int j=0;LinkList p = L,q;while(p->next&&j<i-1){p=p->next;j++;}if(!(p->next)||j>i-1){printf("the node is not exist\n");return ERROR;}q= p->next;p->next=q->next;free(q);return OK;
}int main(){int n,i,l,d;ElemType e;LinkList L=NULL; /*定义指向单链表的指针*/printf("please input n:"); /*输入单链表的元素个数*/scanf("%d",&n);if(n>0){printf("\n1-Create LinkList:\n");L=CreateList(n); printf("\n2-Print LinkList:\n");PrintList(L); printf("\n3-GetElem from LinkList:\n");printf("input i=");scanf("%d",&i);if(GetElem(L,i,&e)) printf("No%i is %d",i,e);elseprintf("not exists");printf("\n4-InsertElen to LinkList:\n");printf("input location and data=");scanf("%d%d",&l,&d);InsertElem(L,l,d);printf("\n5-Print LinkList:\n");PrintList(L);printf("\n6-DeleteElen from LinkList:\n");printf("input location=");scanf("%d",&l);DeleteElem(L,l);printf("\n7-Print LinkList:\n");PrintList(L);}elseprintf("ERROR");return 0;
}
运行结果
4、为第3题补充插入功能函数和删除功能函数。并在主函数中补充代码验证算法的正确性。
插入算法代码:
int InsertElem(LinkList L,int i,ElemType e){int j=0;LinkList p = L,s;while(p&&j<i-1){p=p->next;j++;}if(!p||j>i-1){printf("the node isn't exist\n");return ERROR;}s = (LinkList)malloc(sizeof(LNode));s->data = e;s->next = p->next;p->next = s;return OK;
}
运行结果
算法分析
插入的时间复杂度为O(n)其中查找的时间复杂度为O(n),插入的时间复杂度为O(1)
删除算法代码:
int DeleteElem(LinkList L,int i){int j=0;LinkList p = L,q;while(p->next&&j<i-1){p=p->next;j++;}if(!(p->next)||j>i-1){printf("the node is not exist\n");return ERROR;}q= p->next;p->next=q->next;free(q);return OK;
}
运行结果
算法分析
操作一次的时间复杂度是O(n)其中查找消耗的时间为O(n)删除的时间复杂度为O(1)
5、循环链表的应用(约瑟夫回环问题)
n个数据元素构成一个环,从环中任意位置开始计数,计到m将该元素从表中取出,重复上述过程,直至表中只剩下一个元素。
提示:用一个无头结点的循环单链表来实现n个元素的存储。
算法代码
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <malloc.h>
#define ERROR 0
#define OK 1
typedef int ElemType; /*定义表元素的类型*/
typedef struct LNode /*线性表的单链表存储*/
{ElemType data;struct LNode *next;
} LNode,*LinkList;LinkList CreateList(int n)
{LNode *p,*q,*head;int i;printf("输入初始的n个数据:\n");head=(LinkList)malloc(sizeof(LNode));p = head;printf("输入第1个数据:");scanf("%d",&head->data);for(i = 1; i < n; i++){q = (LinkList)malloc(sizeof(LNode));printf("输入第%d个数据:",i+1);scanf("%d",&q->data);p->next = q;p = q;}p->next = head;return head;
}/*CreateList*/int DeleteEem(LinkList L)
{LNode *temp = L,*fnode;while(temp->next != L){temp = temp->next;}fnode = temp;fnode->next = L->next;free(L);return OK;
}void go(LinkList L,int n,int m)
{int i,j;LNode *p = L;for(i = 1; i <= n - 1; i++){for(j = 0; j < m - 1; j++){p = p->next;}printf("第%d个取出的数据:%d\n",i,p->data);LNode *fnode = p;p = p->next;DeleteEem(fnode);}return ;
}int main()
{int n,m;LinkList L=NULL;printf("请输入总数据量n,以及一次循环的数量m:");scanf("%d%d",&n,&m);printf("\n");L = CreateList(n);printf("\n");go(L,n,m);printf("\n此时表中便只剩一个元素\n");return 0;
}
6、设一带头结点的单链表,设计算法将表中值相同的元素仅保留一个结点。
提示:指针p从链表的第一个元素开始,利用指针q从指针p位置开始向后搜索整个链表,删除与之值相同的元素;指针p继续指向下一个元素,开始下一轮的删除,直至p==null为至,既完成了对整个链表元素的删除相同值。
算法代码
#include<stdio.h>
#include<malloc.h>
#include <iostream>
#define ERROR 0
#define OK 1
typedef int ElemType; /*定义表元素的类型*/
typedef struct LNode /*线性表的单链表存储*/
{ElemType data;struct LNode *next;
} LNode,*LinkList;LinkList CreateList(int n); /* 创建一个长度为n的单链表 */
void PrintList(LinkList L); /*输出带头结点单链表的所有元素*/LinkList CreateList(int n)
{LNode *p,*q,*head;int i;head=(LinkList)malloc(sizeof(LNode));head->next=NULL;p=head;for(i=0; i<n; i++){q=(LinkList)malloc(sizeof(LNode));printf("输入第%i个元素:",i+1);scanf("%d",&q->data); /*输入元素值*/q->next=NULL; /*结点指针域置空*/p->next=q; /*新结点连在表末尾*/p=q;}return head;
}/*CreateList*/void PrintList(LinkList L)
{LNode *p;p=L->next; /*p指向单链表的第1个元素*/while(p!=NULL){printf("%5d",p->data);p=p->next;}
}/*PrintList*/int go(LinkList L)
{int t;LNode *p = L;p = p->next;for(;p != NULL;){t = p->data;LNode *now = p->next;LNode *fnode = p;for(;now != NULL;){LNode *tnode = now;if(now->data == t){tnode = fnode;fnode->next = now->next;free(now);}fnode = tnode;now = tnode->next;}p = p->next;}return OK;
}int main()
{int n;LinkList L=NULL; /*定义指向单链表的指针*/printf("请输入总数据量n:"); /*输入单链表的元素个数*/scanf("%d",&n);printf("\n");L = CreateList(n);printf("\n");printf("删除重复元素之后:\n");go(L);PrintList(L);return 0;
}
数据结构实验报告一 顺序表与链表相关推荐
- java数据结构与算法之顺序表与链表深入分析
转载请注明出处(万分感谢!): http://blog.csdn.net/javazejian/article/details/52953190 出自[zejian的博客] 关联文章: java数据结 ...
- 数据结构与算法:顺序表和链表的常用操作 (很全,基本涵盖本章所有算法)
文章目录 前言: 一.顺序表 二.链表 前言: 数据结构中的表操作算是里面较为简单的章节,但也比较重要,3月份学完的此章节,左思右想今天还是写篇 关于顺序表和链表的博客. ps : 复制代码可以在编译 ...
- 逆置单链表c语言程序,(数据结构C语言版)顺序表和单链表的逆置
<(数据结构C语言版)顺序表和单链表的逆置>由会员分享,可在线阅读,更多相关<(数据结构C语言版)顺序表和单链表的逆置(7页珍藏版)>请在人人文库网上搜索. 1.实验1-1顺序 ...
- C语言数据结构线性表上机实验报告,数据结构实验报告实验一线性表_图文
数据结构实验报告实验一线性表_图文 更新时间:2017/2/11 1:23:00 浏览量:763 手机版 数据结构实验报告 实验名称: 实验一 线性表 学生姓名: 班 级: 班内序号: 学 号: ...
- 北京理工大学计算机实验四报告表,北京理工大学数据结构实验报告实验四
北京理工大学数据结构实验报告实验四 (9页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 19.90 积分 <数据结构与算法设计>实验报告--实 ...
- 黑马程序员 C语言数据结构与算法之线性表(链表/栈/队列/顺序表)
C语言 链表基础知识清晰讲解(黑马) 讲的蛮好,就是音质不太好,有时听不清讲的啥! [黑马]数据结构与算法之线性表(链表/栈/队列/顺序表)[配套源码 嘛蛋,看错了,这是java的... 文章目录 链 ...
- C语言链表的转置算法,c语言编程集 数据结构 顺序表 点链表 数制转换 矩阵转置.doc...
c语言编程集 数据结构 顺序表 点链表 数制转换 矩阵转置 #include "stdio.h" #include "malloc.h" /*typedef s ...
- 8.基本数据结构-顺序表和链表
一.内存 - 计算机的作用:对数据进行存储和运算.首先我们需要知道我们目前使用的计算机都是二进制的计算机,就以为着计算机只可以存储和运算二进制的数据.例如下载好的一部电影,该电影可以存储到计算机中,计 ...
- 【顺序表和链表】实现增删查改数据结构 OJ题编程
目录 线性表 一.顺序表 1.使用顺序表MyArrayList增删查改 MyArrayList.java TestDemo.java 二.链表 1.带头 / 不带头 循环 / 非循环 2.创建链表并访 ...
- python列表是顺序表还是链表_Python数据结构与算法(链表使用详解)
链表 单向链表 p是头节点,指向第一个值,最后一个是伪节点,因为不指向地址. 表元素域elem用来存放具体的数据 链接域next用来存放下一个节点的位置(python中的标识) 变量p指向链表的头节点 ...
最新文章
- IDEA中将代码块封装为方法,IDEA代码重构快捷键
- PHP的异常捕捉与运行特殊处理
- pl/sql developer执行光标所在行
- [Angular2 Form] Style Validation in Angular 2 Forms
- fieldset 在td中怎样设置高度_TD-LOFT夹层,是如何做到超薄的?
- python需要的环境_python运行环境是什么
- linux故障排查书籍,Linux系统故障排查和修复技巧.docx
- Servlet第三篇【request和response简介、response的常见应用】
- 好的飞鸽传书2007对于对外的API
- oracle内置函数 trunc 使用
- Luogu P2827 蚯蚓
- JSK-12 最后一个单词的长度【入门】
- Bean在Spring和SpringMVC中无所不在
- 阿里面试官居然问我如何设计一个本地缓存
- UWP xaml 圆形头像
- 使用原生js发送请求
- 华为管理学案例分析_华为案例分析——管理学作业.ppt
- Pr对图像元素进行裁剪
- 苹果电脑关于命令行的操作
- 黑苹果完整安装教程,内含后续系统优化
热门文章
- Java之时间格式转换
- 局域网中计算机与网线连接的设备是6,Cat5e、Cat6、Cat6a和Cat7网线有什么区别?...
- 翻译《Git版本控制管理》
- 数值分析——Hermite插值
- 穿越时空—智慧城市大数据可视化分析决策系统
- Excel 一些数据处理技巧
- VirtualBox开启USB的方法
- gsp计算机设施设备表格,GSP计算机系统内审表.doc
- 完美数及寻找完美数的算法(Perfect number‘s algorithm)
- 推荐10款适合C/C++开发人员的IDE