一、实验目的

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;
}

数据结构实验报告一 顺序表与链表相关推荐

  1. java数据结构与算法之顺序表与链表深入分析

    转载请注明出处(万分感谢!): http://blog.csdn.net/javazejian/article/details/52953190 出自[zejian的博客] 关联文章: java数据结 ...

  2. 数据结构与算法:顺序表和链表的常用操作 (很全,基本涵盖本章所有算法)

    文章目录 前言: 一.顺序表 二.链表 前言: 数据结构中的表操作算是里面较为简单的章节,但也比较重要,3月份学完的此章节,左思右想今天还是写篇 关于顺序表和链表的博客. ps : 复制代码可以在编译 ...

  3. 逆置单链表c语言程序,(数据结构C语言版)顺序表和单链表的逆置

    <(数据结构C语言版)顺序表和单链表的逆置>由会员分享,可在线阅读,更多相关<(数据结构C语言版)顺序表和单链表的逆置(7页珍藏版)>请在人人文库网上搜索. 1.实验1-1顺序 ...

  4. C语言数据结构线性表上机实验报告,数据结构实验报告实验一线性表_图文

    数据结构实验报告实验一线性表_图文 更新时间:2017/2/11 1:23:00  浏览量:763  手机版 数据结构实验报告 实验名称: 实验一 线性表 学生姓名: 班 级: 班内序号: 学 号: ...

  5. 北京理工大学计算机实验四报告表,北京理工大学数据结构实验报告实验四

    北京理工大学数据结构实验报告实验四 (9页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 19.90 积分 <数据结构与算法设计>实验报告--实 ...

  6. 黑马程序员 C语言数据结构与算法之线性表(链表/栈/队列/顺序表)

    C语言 链表基础知识清晰讲解(黑马) 讲的蛮好,就是音质不太好,有时听不清讲的啥! [黑马]数据结构与算法之线性表(链表/栈/队列/顺序表)[配套源码 嘛蛋,看错了,这是java的... 文章目录 链 ...

  7. C语言链表的转置算法,c语言编程集 数据结构 顺序表 点链表 数制转换 矩阵转置.doc...

    c语言编程集 数据结构 顺序表 点链表 数制转换 矩阵转置 #include "stdio.h" #include "malloc.h" /*typedef s ...

  8. 8.基本数据结构-顺序表和链表

    一.内存 - 计算机的作用:对数据进行存储和运算.首先我们需要知道我们目前使用的计算机都是二进制的计算机,就以为着计算机只可以存储和运算二进制的数据.例如下载好的一部电影,该电影可以存储到计算机中,计 ...

  9. 【顺序表和链表】实现增删查改数据结构 OJ题编程

    目录 线性表 一.顺序表 1.使用顺序表MyArrayList增删查改 MyArrayList.java TestDemo.java 二.链表 1.带头 / 不带头 循环 / 非循环 2.创建链表并访 ...

  10. python列表是顺序表还是链表_Python数据结构与算法(链表使用详解)

    链表 单向链表 p是头节点,指向第一个值,最后一个是伪节点,因为不指向地址. 表元素域elem用来存放具体的数据 链接域next用来存放下一个节点的位置(python中的标识) 变量p指向链表的头节点 ...

最新文章

  1. IDEA中将代码块封装为方法,IDEA代码重构快捷键
  2. PHP的异常捕捉与运行特殊处理
  3. pl/sql developer执行光标所在行
  4. [Angular2 Form] Style Validation in Angular 2 Forms
  5. fieldset 在td中怎样设置高度_TD-LOFT夹层,是如何做到超薄的?
  6. python需要的环境_python运行环境是什么
  7. linux故障排查书籍,Linux系统故障排查和修复技巧.docx
  8. Servlet第三篇【request和response简介、response的常见应用】
  9. 好的飞鸽传书2007对于对外的API
  10. oracle内置函数 trunc 使用
  11. Luogu P2827 蚯蚓
  12. JSK-12 最后一个单词的长度【入门】
  13. Bean在Spring和SpringMVC中无所不在
  14. 阿里面试官居然问我如何设计一个本地缓存
  15. UWP xaml 圆形头像
  16. 使用原生js发送请求
  17. 华为管理学案例分析_华为案例分析——管理学作业.ppt
  18. Pr对图像元素进行裁剪
  19. 苹果电脑关于命令行的操作
  20. 黑苹果完整安装教程,内含后续系统优化

热门文章

  1. Java之时间格式转换
  2. 局域网中计算机与网线连接的设备是6,Cat5e、Cat6、Cat6a和Cat7网线有什么区别?...
  3. 翻译《Git版本控制管理》
  4. 数值分析——Hermite插值
  5. 穿越时空—智慧城市大数据可视化分析决策系统
  6. Excel 一些数据处理技巧
  7. VirtualBox开启USB的方法
  8. gsp计算机设施设备表格,GSP计算机系统内审表.doc
  9. 完美数及寻找完美数的算法(Perfect number‘s algorithm)
  10. 推荐10款适合C/C++开发人员的IDE