数据结构实验报告-实验一 顺序表、单链表基本操作的实现

实验一    顺序表、单链表基本操作的实现

 

实验目的

1、顺序表

(1)掌握线性表的基本运算。

(2)掌握顺序存储的概念,学会对顺序存储数据结构进行操作。

(3)加深对顺序存储数据结构的理解,逐步培养解决实际问题的编程能力。

实验内容

1、 顺序表

1、编写线性表基本操作函数:

(1)InitList(LIST *L,int ms)初始化线性表;

(2)InsertList(LIST *L,int item,int rc)向线性表的指定位置插入元素;

(3)DeleteList1(LIST *L,int item)删除指定元素值的线性表记录;

(4)DeleteList2(LIST *L,int rc)删除指定位置的线性表记录;

(5)FindList(LIST *L,int item)查找线性表的元素;

(6)OutputList(LIST *L)输出线性表元素;

2、调用上述函数实现下列操作:

(1)初始化线性表;

(2)调用插入函数建立一个线性表;

(3)在线性表中寻找指定的元素;

(4)在线性表中删除指定值的元素;

(5)在线性表中删除指定位置的元素;

(6)遍历并输出线性表;

实验结果

1、顺序表

(1)流程图

 
   

(2)程序运行主要结果截图

(3)程序源代码

#include<stdio.h>

#include<stdlib.h>

#include<malloc.h>

struct LinearList/*定义线性表结构*/

{

int *list;       /*存线性表元素*/

int size;        /*存线性表长度*/

int Maxsize;     /*存list数组元素的个数*/

};

typedef struct LinearList LIST;

void InitList(LIST *L,int ms)/*初始化线性表*/

{

if((L->list=(int*)malloc(ms*sizeof(int)))==NULL)

{

printf("内存申请错误");

exit(1);

}

L->size=0;

L->Maxsize=ms;

}

int InsertList(LIST *L,int item,int rc)/*item记录值;rc插入位置*/

{

int i;

if(L->size==L->Maxsize)/*线性表已满*/

return -1;

if(rc<0)

rc=0;

if(rc>L->size)

rc=L->size;

for(i=L->size-1;i>=rc;i--)/*将线性表元素后移*/

L->list[i+=1]=L->list[i];

L->list[rc]=item;

L->size++;

return 0;

}

void OutputList(LIST *L)/*输出线性表元素*/

{

int i;

for(i=0;i<L->size;i++)

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

printf("\n");

}

int FindList(LIST *L,int item)/*查找线性元素,返回值>=0为元素的位置,返回-1为没找到*/

{

int i;

for(i=0;i<L->size;i++)

if(item==L->list[i])

return i;

return -1;

}

int DeleteList1(LIST *L,int item)/*删除 指定元素值得线性表记录,返回值为>=0为删除成功*/

{

int i,n;

for(i=0;i<L->size;i++)

if(item==L->list[i])

break;

if(i<L->size)

{

for(n=i;n<L->size-1;n++)

L->list[n]=L->list[n+1];

L->size--;

return i;

}

return -1;

}

int DeleteList2(LIST *L,int rc)/*删除指定位置的线性表记录*/

{

int i,n;

if(rc<0||rc>=L->size)

return -1;

for(n=rc;n<L->size-1;n++)

L->list[n]=L->list[n+1];

L->size--;

return 0;

}

int main()

{

LIST LL;

int i,r;

printf("list addr=%p\tsize=%d\tMaxsize=%d\n",LL.list,LL.size,LL.Maxsize);

InitList(&LL,10);

printf("list addr=%p\tsize=%d\tMaxsize=%d\n",LL.list,LL.list,LL.Maxsize);

while(1)

{

printf("请输入元素值,输入0结束插入操作:");

fflush(stdin);/*清空标准输入缓冲区*/

scanf("%d",&i);

if(i==0)

break;

printf("请输入插入位置:");

scanf("%d",&r);

InsertList(&LL,i,r-1);

printf("线性表为:");

OutputList(&LL);

}

while(1)

{

printf("请输入查找元素值,输入0结束查找操作:");

fflush(stdin);/*清空标准输入缓冲区*/

scanf("%d ",&i);

if(i==0)

break;

r=FindList(&LL,i);

if(r<0)

printf("没有找到\n");

else

printf("有符合条件的元素,位置为:%d\n",r+1);

}

while(1)

{

printf("请输入删除元素值,输入0结束查找操作:");

fflush(stdin);/*清楚标准缓存区*/

scanf("%d",&i);

if(i==0)

break;

r=DeleteList1(&LL,i);

if(i<0)

printf("没有找到\n");

else{

printf("有符合条件的元素,位置为:%d\n线性表为:",r+1);

OutputList(&LL);

}

}

while(1)

{

printf("请输入删除元素位置,输入0结束查找操作:");

fflush(stdin);/*清楚标准输入缓冲区*/

scanf("%d",&r);

if(r==0)

break;

i=DeleteList2(&LL,r-1);

if(i<0)

printf("位置越界\n");

else

{

printf("线性表为:");

OutputList(&LL);

}

}

}

链表基本操作

实验目的

2、链表

(1)掌握链表的概念,学会对链表进行操作。

(2)加深对链式存储数据结构的理解,逐步培养解决实际问题的编程能力。

实验内容

  1、编写链表基本操作函数:

(1)InitList(LIST *L,int ms)初始化链表;

(2)InsertList1(LIST *L,int item,int rc)向链表的指定位置插入元素;

(3)InsertList2(LIST *L,int item,int rc)向有序链表的指定位置插入元素;

(4)DeleteList(LIST *L,int item)删除指定元素值的链表记录;

(5)FindList(LIST *L,int item)查找链表中的元素;

(6)OutputList(LIST *L)输出链表中的元素;

2、调用上述函数实现下列操作:

(1)初始化链表;

(2)调用插入函数建立一个链表;

(3)在链表中寻找指定的元素;

(4)在链表中删除指定值的元素;

(5)遍历并输出链表;

实验结果

(1)、流程图:

(2)程序运行主要结果截图:

(3)程序源代码:

#include<stdio.h>

#include<malloc.h>

typedef struct list

{

int data;

struct list *next;

}LIST;

void initlist(LIST **p)

{

*p=NULL;

}

void insertlist1(LIST **p,int item,int rc)

{

int i;

LIST *u,*q,*r;

u=(LIST*)malloc(sizeof(LIST));

u->data=item;

for(i=1,r=*p;i<rc&&r!=NULL;i++)

{

q=r;

r=r->next;

}

if(r==*p)

*p=u;

else

q->next=u;

u->next=r;

}

void insertlist2(LIST **p,int item)

{

LIST *u,*q,*r;

u=(LIST*)malloc(sizeof(LIST));

u->data=item;

for(r=*p;r!=NULL&&r->data<item; q=r,r=r->next)

if(r==*p)

*p=u;

else

q->next=u;

u->next=r;

}

int deletelist(LIST **p,int item)

{

LIST *q,*r;

q=*p;r=q;

if(q==NULL)

return 1;

if(q->data==item)

{

*p=q->next;

free(r);

return 0;

}

for( ;q->data!=item&&q->next!=NULL;r=q,q=q->next)

if(q->data==item)

{

r->next=q->next;

free(q);

return 0;

}

return 1;

}

int findlist(LIST *p,int item)

{

int i;

for(i=1;p->data!=item&&p!=NULL;p=p->next,i++)

return(p==NULL)?-1:i;

}

void outputlist(LIST *p)

{

while(p!=NULL)

{

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

p=p->next;

}

printf("\n");

}

void freelist(LIST **p)

{

LIST *q,*r;

for(q=*p;q!=NULL;)

{

r=q;

q=q->next;

free(r);

}

*p=NULL;

}

int main()

{

LIST *p;

int op,i,rc;

initlist(&p);

while(1)

{

printf("---------------\n");

printf("- 1:指定位置追加\n");

printf("- 2:升序追加\n");

printf("- 3:查找结点\n");

printf("- 4:删除结点\n");

printf("- 5:输出链表\n");

printf("- 6:清空链表\n");

printf("- 0:退出\n");

printf("--------------\n");

printf("请输入0~6 进行操作:");

fflush(stdin);

scanf("%d",&op);

switch(op)

{

case 0:

return -1;

case 1:

printf("请输入新增结点的键值和位置:");

scanf("%d%d",&i,&rc);

insertlist1(&p,i,rc);

break;

case 2:

printf("请输入新增结点的键值:");

scanf("%d",&i);

insertlist2(&p,i);

break;

case 3:

printf("请输入要查找结点的键值:");

scanf("%d",&i);

rc=findlist(p,i);

if(rc>0)

printf("  位置位 %d\n",rc);

else

printf("没有找到\n");

break;

case 4:

printf("请输入要删除的结点的键值:");

scanf("%d",&i);

rc=deletelist(&p,i);

if(rc==0)

printf("删除成功!\n",rc);

else

printf("没找到!\n");

break;

case 5:

printf("\n 链表内容为:\n");

outputlist(p);

break;

case 6:

freelist(&p);

break;

}

}

}

时间: 2024-10-11 22:55:46

数据结构实验报告-实验一 顺序表、单链表基本操作的实现的相关文章

数据结构 --- 02. 内存, 顺序表, 单链表

一.内存 1.基本概念 计算机的作用: 就是用来存储和运算二进制的数据 变量的概念: 就是计算机中的某一块内存空间   衡量计算机内存大小的范围: bit byte kb mb 计算机中内存空间都会有两个基本的属性 大小 地址 不同数据占用内存空间的大小 整数:4byte float:4byte double:8byte 字符:1byte 理解a=10的内存图(引用,指向) 指向:如果一个变量存储了某一块内存空间的地址,则表示该变量指向该块内存 引用:如果一个变量存储了某一块内存空间的地址,则该

顺序表--单链表

单链表: typedef struct Lnode { ElemType data; /*数据域,保存结点的值 */ struct Lnode *next; /*指针域*/ }LNode, *LinkList; /*结点的类型 */ 建表: 1)头插入建表:每次插入的结点都作为链表的第一个结点. 只要在新创建单线性链表时,如果要插入的结点是n个,算法的时间复杂度均为O(n). void create_LinkList(LinkList &L,int n)/*给一组数据逆着插入才是顺序*/ { L

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

转载请注明出处(万分感谢!): http://blog.csdn.net/javazejian/article/details/52953190 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 ??数据结构与算法这门学科虽然在大学期间就已学习过了,但是到现在确实也忘了不少,因此最近又重新看了本书-<数据结构与算法分析>加上之前看的<java数据结构>也算是对数据结构的进一步深入学习了,于是也就打算

&quot;数据结构翻转课堂&quot;答疑实录——顺序表

[说明] 本文是<数据结构>翻转课堂在线答疑的实录,由云班课的"答疑/讨论"功能中导出数据整理而成.. [重要提示] 下面的内容,按时间从后往前的顺序提供,请直接到文章末尾,倒着看更顺畅. [课程实践答疑实录] 焦梦真2015-09-20 11:19:20说 太难了 贺利坚2015-09-20 11:25:48答 练就将军本色之时到了.待回头看,江山本是如此多娇! 高露2015-09-19 15:14:50 用指针和线性表那一块... 王增亮2015-09-15 21:18

《数据结构》复习之线性表(顺序表和链表)

线性表的概念 线性表的比较 线性表的数据结构 顺序表的算法操作 双链表的补充 总结 1.线性表的概念 线性表的存储结构有顺序存储结构和链式存储结构两种.前者成为顺序表,后者称为链表. 顺序表: 顺序表就是把线性表中的所有元素按照其逻辑顺序,一次存储到从指定的存储 位置开始的一块连续的存储空间中,如下图所示. 链表 在链表的存储中,每一个节点不仅包含所存元素本身的信息,还包含元素之间的逻辑关系的信息,即前驱节点包含后继节点的地址信息,这样就可以通过前驱节点中的地址信息方便地找到后继节点的位置,如下

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

一.内存 - 计算机的作用:对数据进行存储和运算.首先我们需要知道我们目前使用的计算机都是二进制的计算机,就以为着计算机只可以存储和运算二进制的数据.例如下载好的一部电影,该电影可以存储到计算机中,计算机中存储的是基于二进制的电影数据,然后我们可以通过相关的视频播放软件结合相关的硬件对电影的二进制数据进行相关的运算操作,所产生的结果就是我们可以看到电影的画面和听到音频的声音. - 问题:阐述计算机如何计算1+2的结果? - 阐述:简单理解为,首先可以将1和2输入到计算机中,然后计算机会将1和2转

【数据结构】之顺序表和链表的比较

1.顺序表 顺序表的优点: (1) 方法简单,各种高级语言中都有数组,容易实现.(2) 不用为表示结点间的逻辑关系而增加额外的存储开销.(3) 顺序表具有按元素序号随机访问的特点. 顺序表的缺点: (1) 在顺序表中做插入删除操作时,平均移动大约表中一半的元素,因此对n较大的顺序表效率低.(2) 需要预先分配足够大的存储空间,估计过大,可能会导致顺序表后部大量闲置:预先分配过小,又会造成溢出. 2.链表 链表的优点: (1) 在链表中做插入删除操作时,不会影响前面和后面的节点,因此对n较大的链表

java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制)

转载请注明出处(请尊重原创!谢谢~): http://blog.csdn.net/javazejian/article/details/53073995 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) ??这篇是数据结构与算法的第3篇,通过前两篇的介绍,对应顺序表和链表已有

线性表-顺序表、链表类模板的实现(数据结构基础 第2周)

学习完课程后,自己用C++实现了简单的顺序表和链表,并用约瑟夫问题做了测试,不保证完全正确. 其中有一点需要注意一下:C++中类模板声明头文件和实现头文件不可以分离到.h和.cpp中,否则无法正常编译,详见:https://www.zhihu.com/question/20630104 源码 1.顺序表 //seqlist.h #pragma once #include <iostream> using namespace std; template <class T> class