c语言数据结构单链表的交并差集运算实现

c语言数据结构单链表的交并差集运算实现
c语言数据结构单链表的交并差集运算实现

数据结构上机实验课

后练习报告

姓名:冯天明

学号:

班级:通信141

2015年9月28日星期一

实验五:

实现A 、B两个单链表表示的集合的交集、并集和差集

实验代码:

#include

#include

#define OK 0

#define ERROR -1

#define OVERFLOW -2

typedefintElemType;

typedefstructLNode

{

ElemType data; //定义数据域

LNode *next; //定义指针域

}LNode,*LinkList;

void InitList(LinkList *L) //创建链表头

{

*L = ( LinkList )malloc( sizeof(LNode) );

if(!L) exit(OVERFLOW); //头结点内存申请失败

(*L)->next = NULL;

}

void DerstorList(LinkList&L) //清空链表

{

LinkList p;

while(L->next)

{

p = L->next;

L->next = p->next;

free(p);

}

}

void ClearList(LinkList *L,int n) //初始化链表

{

LinkListp ;

inti;

for(i = 0;i

{

p = (LinkList )malloc(sizeof(LNode)); //生成新节点

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

p->next = (*L)->next; //头插法

( *L)->next = p;

}

}

void InserList(LinkList *L,ElemType e) //头插法插入数据{

LinkList p;

p = (LinkList )malloc(sizeof( LNode ));

p->data = e;

p->next = (*L)->next; //头插法

( *L)->next = p;

}

void DisplaList(LinkList L) //输出链表

{

LinkList head;

head = L->next;

if(head==NULL)printf("集合为空!\n");

while(head) //遍历链表

{

printf("%4d",head->data); //输出节点信息

head = head->next;

}

printf("\n");

}

intisPresent(LinkListL,ElemType data) //判断链表中是否已经存在data该元素{

LinkList p = L->next;

while(p) //遍历链表,查找是否存在data值{

if( p->data == data )

return 1;

p = p->next;

}

return 0;

}

/*************求两个链表的交集**************/

int Intersection(LinkList L1,LinkList L2,LinkList L3)

{

LinkListp,q;

p = L1->next;

q = L2->next;

while( p )

{

while( q )

{

//判断两链表的元素是否相当,并且存入的链表中不存在该元素即可存入

if(p->data == q->data && !isPresent(L3,p->data))

{

InserList(&L3,p->data);

}

q = q->next;

}

q = L2->next; //复位

p = p->next;

}

return OK;

}

/************求链表的并集************/

void Union(LinkList L1,LinkList L2,LinkList L3)

{

LinkListp,q;

p = L1->next;

q = L2->next;

DerstorList(L3); //清空链表,重新存入数据

while( p )

{

//如果p中的元素不在并集链L3中,防止L1中有重复元素

if(!isPresent(L3,p->data))

InserList(&L3,p->data); //插入元素

p = p->next;

}

p = L1->next;

while(q)

{

if(!(isPresent(L3,q->data))) //q->data元素不存在并集表中,则插入

{

InserList(&L3,q->data); //把L2表中的元素插入

}

q = q->next;

}

}

/************求链表的差集************/

void Subtraction(LinkList L1,LinkList L2,LinkList L3)

{

LinkListp,q;

p = L1->next;

q = L2->next;

DerstorList(L3);

while(p)

{

if(!(isPresent(L2,p->data))) //如果L2中不存在data值,即为L1-L2差集InserList(&L3,p->data);

p = p->next;

}

}

void main()

{

LinkList L1,L2,L3;

int number;

InitList(&L1); //创建空链表

InitList(&L2);

InitList(&L3); //存储交并差集的链表

printf("请输入链表L1的元素个数:");

scanf("%d",&number);

printf("输入链表L1的内容:\n");

ClearList(&L1,number); //初始化链表L1

printf("请输入链表L2的元素个数:");

scanf("%d",&number);

printf("输入链表L2的内容:\n");

ClearList(&L2,number); //初始化链表L2

printf("L1:");

DisplaList(L1);

printf("L2:");

DisplaList(L2);

printf("L1 ∩L2为(交集):");

Intersection(L1,L2,L3); //求链表L1与L2的交集

DisplaList(L3);

printf("L1 ∪L2为(并集):");

Union(L1,L2,L3); //求链表L1 L2的并集

DisplaList(L3);

printf("L1 - L2(补集):");

Subtraction(L1,L2,L3); //求链表L1 L2 的差集(补集)DisplaList(L3);

}

数据结构(C语言版)期末复习

数据结构(C语言版)期末复习汇总 第一章绪论 数据结构:是一门研究非数值计算程序设计中的操作对象,以及这些对象之间的关系和操作的学科。 数据结构分为:逻辑结构、物理结构、操作三部分 逻辑结构:集合、线性结构、树形结构、图(网)状结构 物理结构(存储结构):顺序存储结构、链式存储结构 算法:是为了解决某类问题而规定的一个有限长的操作序列。 算法五个特性:有穷性、确定性、可行性、输入、输出 评价算法优劣的基本标准(4个):正确性、可读性、健壮性、高效性及低存储量 语句频度的计算。 算法的时间复杂度: 常见有:O(1),O(n),O(n2),O(log2n),O(nlog2n),O(2n) 第二章线性表 线性表的定义和特点: 线性表:由n(n≥0)个数据特性相同的元素构成的有限序列。线性表中元素个数n(n≥0)定义为线性表的长度,n=0时称为空表。 非空线性表或线性结构,其特点: (1)存在唯一的一个被称作“第一个”的数据元素; (2)存在唯一的一个被称作“最有一个”的数据元素; (3)除第一个之外,结构中的每个数据元素均只有一个前驱; (4)除最后一个之外,结构中的每个数据元素均只有一个后继。 顺序表的插入:共计n个元素,在第i位插入,应移动(n-i+1)位元素。 顺序表的删除:共计n个元素,删除第i位,应移动(n-i)位元素。 线性表的两种存储方式:顺序存储、链式存储。 顺序存储 概念:以一组连续的存储空间存放线性表; 优点:逻辑相邻,物理相邻;可随机存取任一元素;存储空间使用紧凑; 缺点:插入、删除操作需要移动大量的元素;预先分配空间需按最大空间分配,利用不充分;表容量难以扩充; 操作:查找、插入、删除等 查找: ListSearch(SqlList L,ElemType x,int n) { int i; for (i=0;i

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

实验一单链表 #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;

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

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

实现要求: ⑴单链表建立函数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; //返回头指针

(完整版)数据结构(c语言版)期末考试复习试题

《数据结构与算法》(c语言版)期末考复习题 一、选择题。 1.在数据结构中,从逻辑上可以把数据结构分为 C 。 A.动态结构和静态结构B.紧凑结构和非紧凑结构 C.线性结构和非线性结构D.内部结构和外部结构 2.数据结构在计算机内存中的表示是指 A 。 A.数据的存储结构B.数据结构C.数据的逻辑结构D.数据元素之间的关系 3.在数据结构中,与所使用的计算机无关的是数据的 A 结构。 A.逻辑B.存储C.逻辑和存储D.物理 4.在存储数据时,通常不仅要存储各数据元素的值,而且还要存储 C 。A.数据的处理方法B.数据元素的类型 C.数据元素之间的关系D.数据的存储方法 5.在决定选取何种存储结构时,一般不考虑 A 。 A.各结点的值如何B.结点个数的多少 C.对数据有哪些运算D.所用的编程语言实现这种结构是否方便。 6.以下说法正确的是 D 。 A.数据项是数据的基本单位

B.数据元素是数据的最小单位 C.数据结构是带结构的数据项的集合 D.一些表面上很不相同的数据可以有相同的逻辑结构 7.算法分析的目的是 C ,算法分析的两个主要方面是 A 。(1)A.找出数据结构的合理性B.研究算法中的输入和输出的关系C.分析算法的效率以求改进C.分析算法的易读性和文档性(2)A.空间复杂度和时间复杂度B.正确性和简明性 C.可读性和文档性D.数据复杂性和程序复杂性 8.下面程序段的时间复杂度是O(n2) 。 s =0; for( I =0; i

数据结构 单链表详解

数据结构的概念: 数据的逻辑结构+ 数据的存储结构+ 数据的操作; 数据的数值:=====》数据===》数值型数据整形浮点数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};

c数据结构单链表的建立与基本应用

#include"stdio.h" #include"stdlib.h" typedef struct node { int data; struct node *next; }Lnode,*Linklist; input(Lnode *p,int n)//实现用键盘顺序输入链表数据{ Lnode *s;int i,d; printf("请输入数据:"); for(i=1;i<=n;i++) { if(i==1) { scanf("%d",&d); p->data=d; continue; } if(n==1)break; scanf("%d",&d);

s=(Linklist)malloc(sizeof(Lnode)); s->data=d; p->next=s; s->next=NULL; p=s;//使当前指针指向链表尾部节点 } } output(Lnode *p,int n)//实现输出当前链表所有数据 { int i=1; printf("当前链表的值为:"); while(p->next!=NULL) { printf("%d ",p->data); p=p->next; i++; } if(i==n)//当是最后一个节点时,其next已经是空,所以最后一个节点数据无法用while循环写出,所以另用了一个计数器i printf("%d",p->data); }

insert(Lnode *p,int i,int e)//实现在第i个元素之后插入新元素{ int j=0;Lnode *s; while(p&&jnext;++j;}if(!p||j>i-1)return 0; s=(Linklist)malloc(sizeof(Lnode)); s->data=e;s->next=p->next;p->next=s; return 1; } delet(Lnode *p,int i)//实现删除链表中第i+1个元素 { int j=0;Lnode *q; while(p->next&&jnext;++j; } if(!(p->next)||j>i-1)return 0; q=p->next;p->next=q->next; free(q); return 1; } search(Lnode *p,int e,int n) {

C语言链表专题复习

链表专题复习 数组作为存放同类数据的集合,给我们在程序设计时带来很多的方便,增加了灵活性。但数组也同样存在一些弊病。如数组的大小在定义时要事先规定,不能在程序中进行调整,这样一来,在程序设计中针对不同问题有时需要3 0个元素大小的数组,有时需要5 0个数组元素的大小,难于统一。我们只能够根据可能的最大需求来定义数组,常常会造成一定存储空间的浪费。 我们希望构造动态的数组,随时可以调整数组的大小,以满足不同问题的需要。链表就是我们需要的动态数组。它是在程序的执行过程中根据需要有数据存储就向系统要求申请存储空间,决不构成对存储区的浪费。 链表是一种复杂的数据结构,其数据之间的相互关系使链表分成三种:单链表、循环链表、双向链表,下面只介绍单向链表。 7.4.1 单链表 图7 - 3是单链表的结构。 单链表有一个头节点h e a d,指向链表在内存的首地址。链表中的每一个节点的数据类型为结构体类型,节点有两个成员:整型成员(实际需要保存的数据)和指向下一个结构体类型节点的指针即下一个节点的地址(事实上,此单链表是用于存放整型数据的动态数组)。链表按此结构对各节点的访问需从链表的头找起,后续节点的地址由当前节点给出。无论在表中访问那一个节点,都需要从链表的头开始,顺序向后查找。链表的尾节点由于无后续节点,其指针域为空,写作为N U L L。 图7 - 3还给出这样一层含义,链表中的各节点在内存的存储地址不是连续的,其各节点的地址是在需要时向系统申请分配的,系统根据内存的当前情况,既可以连续分配地址,也可以跳跃式分配地址。 看一下链表节点的数据结构定义: struct node { int num; struct node *p; } ; 在链表节点的定义中,除一个整型的成员外,成员p是指向与节点类型完全相同的指针。 在链表节点的数据结构中,非常特殊的一点就是结构体内的指针域的数据类型使用了未定义成功的数据类型。这是在C中唯一规定可以先使用后定义的数据结构。 ?单链表的创建过程有以下几步: 1 ) 定义链表的数据结构。 2 ) 创建一个空表。 3 ) 利用m a l l o c ( )函数向系统申请分配一个节点。

数据结构C语言版顺序表和单链表的逆置

数据结构C语言版顺序表和单链表的逆置 公司标准化编码 [QQX96QT-XQQB89Q8-NQQJ6Q8-MQM9N]

实验1-1 顺序表的逆置操作 程序原码 #include<> // 创建顺序表,确定元素个数,插入各个元素,逆置列表。#include<> #include<> #define max_list_size 100 //定义给顺序表分配空间大小 typedef struct{ int *elem; int length; }list_node; //指向顺序表首地址的结构体单元 list_node L; //这里使用了全局变量,在所有的函数里可以随意修改其值int list[max_list_size]; void init(); // 初始化操作 void inversion(); // 倒置部分

void creat(); // 建表部分 void display(); // 显示部分 //*************主函数****************** int main() { init(); creat(); printf("\n您输入的顺序表的结点数: \n"); display(); inversion(); printf("\n倒置顺序表的结点数: \n"); display(); } //*************初始化操作分配空间******************

void init() { = (int *) malloc (max_list_size * sizeof(int) ); if (! { printf("顺序表已满"); exit(-1); } = 0; } //*************以下为建表部分****************** void creat(){ int a, b, i; printf("请输入顺序表的结点数: "); scanf("%d", &a); if(a<=0){

数据结构课程设计单链表

目录 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)。

单链表的建立及其基本操作的实现(完整程序)

#include "stdio.h"/*单链表方式的实现*/ #include "malloc.h" typedef char ElemType ; typedef struct LNode/*定义链表结点类型*/ { ElemType data ; struct LNode *next; }LNode,*LinkList;/*注意与前面定义方式的异同*/ /*建立链表,输入元素,头插法建立带头结点的单链表(逆序),输入0结束*/ LinkList CreateList_L(LinkList head) { ElemType temp; LinkList p; printf("请输入结点值(输入0结束)"); fflush(stdin); scanf("%c",&temp); while(temp!='0') { if(('A'<=temp&&temp<='Z')||('a'<=temp&&temp<='z')) { p=(LinkList)malloc(sizeof(LNode));/*生成新的结点*/ p->data=temp; p->next=head->next; head->next=p;/*在链表头部插入结点,即头插法*/ } printf("请输入结点值(输入0结束):"); fflush(stdin); scanf("%c",&temp); } return head; } /*顺序输出链表的内容*/ void ListPint_L(LinkList head) { LinkList p; int i=0; p=head->next; while(p!=NULL) { i++; printf("单链表第%d个元素是:",i);

(数据结构C语言版)顺序表和单链表的逆置

} 实验 1-1 顺序表的逆置操作 程序原码 // 创建顺序表,确定元素个数,插入各个元素,逆置列表。 #include #define max_list_size 100 //定义给顺序表分配空间大小 typedef struct{ int *elem; int length; }list_node; //指向顺序表首地址的结构体单元 list_node L; // 这里使用了全局变量,在所有的函数里可以随意修改其值 int list[max_list_size]; void init(); void inversion(); void creat(); void display(); //************* 主函数 ****************** int main() { init(); creat(); printf("\n 您输入的顺序表的结点数 : \n"); display(); inversion(); printf("\n 倒置顺序表的结点数 : \n"); display(); void init() { L.elem = (int *) malloc (max_list_size * sizeof(int) ); if (! L.elem) { printf(" 顺序表已满 "); exit(-1); } L.length = 0; #include #include // 初始化操作 // 倒置部分 // 建表部分 // 显示部分 //* ************ 初始化操作分配空间 ******************

数据结构单链表输入输出(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; }

数据结构-单链表实验报告

单链表实验报告 一、实验目的 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便是删除的结点的个数。

《数据结构(C语言版)》复习重点要点

《数据结构(C语言版)》复习重点 重点在二、三、六、七、九、十章,考试内容两大类:概念,算法 第1章、绪论 1. 数据:是对客观事物的符号表示,在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称。 2. 数据元素:是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。 3. 数据结构:是相互之间存在一种或多种特定关系的数据元素的集合。 其4类基本结构:集合、线性结构、树形结构、图状结构或网状结构 4. 逻辑结构:是数据元素之间的逻辑关系的描述。 5. 物理结构(存储结构):是数据结构在计算机中的表示(又称映像)。 其4种存储结构:顺序存数结构、链式存数结构、索引存数结构、散列存数结构6. 算法:是对特定问题求解步骤的一种描述,它是指令的有限序列,其中每一条指令表示一个或多个操作。 其5个重要特性:有穷性、确定性、可行性、输入、输出 7. 时间复杂度:算法中基本操作重复执行的次数是问题规模n的某个函数f(n),算法的时间度量记作,T(n)=O(f(n));他表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称做算法的渐进时间复杂度,简称时间复杂度。例如: (a) {++x;s=0;} (b) for(i=1;i<=n;++i){++x;s += x;} (c) for(j=1;j<=n;++j) for(k=1;k<=n;++k){++x;s += x;} 含基本操作“x增1”的语句的频度分别为1、n和n2,则这3个程序段的时间复杂度分别为O(1)、O(n)和O(n2),分别称为常量阶、线性阶和平方阶。还可呈现对数阶O(log n)、指数阶O(2的n次方)等。 8. 空间复杂度:算法所需存储空间的度量记作,S(n)=O(f(n))。 第2章、线性表 1. 线性表:是最常用最简单的一种数据结构,一个线性表是n个数据元素的有限序列。 2. 线性表的顺序存储结构:是用一组地址连续的存储单元依次存储线性表的数据元素。其特点为逻辑关系上相邻的两个元素在物理位置上也相邻,可以随机存取表中任一元素。 存储位置计算:假设线性表的每个元素需占用L个存储单元,并以所占的第一个单元的存储地址作为数据元素的存储位置,线性表的第i个数据元素ai的存储位置为LOC(ai)=LOC(a1)+(i-1)*L 式中LOC(a1)是线性表第一个元素a1的存储位置,通常称做线性表的起始位置或基地址。 3. 线性表的链式存储结构:是用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的)。

数据结构C语言版单链表源代码

/*单链表的各种操作*/ #include #include #define null 0 typedef int ElemType; /* 字符型数据*/ struct LNode { ElemType data; struct LNode *next; }; void setnull(struct LNode **p); int length (struct LNode **p); ElemType get(struct LNode **p,int i); void insert(struct LNode **p,ElemType x,int i); void dele(struct LNode **p,int i); void display(struct LNode **p); int locate(struct LNode **p,ElemType x); void main() {

struct LNode *head,*q; /*定义静态变量*/ int select,x1,x2,x3,x4; int i,n; int m,g; char e,y; setnull(&head); /*建设链表并设置为空表*/ printf("请输入数据长度: "); scanf("%d",&n); for(i=1;i<=n;i++) { printf("将数据插入到单链表中: "); scanf("%d",&y); insert(&head,y,i); } /*插入数据到链表*/ display(&head); /*显示链表所有数据*/ printf("select 1 求长度 length()\n"); printf("select 2 取结点 get()\n"); printf("select 3 求值查找 locate()\n"); printf("select 4 删除结点 delete()\n"); printf("select 0 退出\n"); printf("input your select: "); scanf("%d",&select);

《数据结构Java版》线性表之单链表的建立及操作

《数据结构Java》线性表之单链表的建立及操作 package sjjg3; //单链表结点类,T指定结点的元素类型 public class Node { public T data;//数据域,存储数据元素 public Node next;//地址域,引用后继结点 public Node(T data,Node next) {//构造结点,data指定数据元素,next指定后继结点 this.data=data;//T对象引用赋值 this.next=next;//Node对象引用赋值 } public Node() { this(null, null); } public String toString() {//返回结点数据域的描述字符串 return this.data.toString(); } } package sjjg3; //单链表类,实现ADT List声明方法,T表示数据元素的数据类型 public class SinglyList extends Object{ public Node head;//头指针,指向单链表的头结点 //(1)构造方法 public SinglyList() {//构造空单链表 this.head=new Node();//创建头结点,data和next值均为null } public SinglyList(T[] values) {//构造单链表,由values数组提供元素this();//创建空单链表,只有头结点 Node rear=this.head;//rear指向单链表最后一个结点 for(int i=0;i(values[i],null);//尾插入,创建结点链入rear结点之后 rear=rear.next;//rear指向新的链尾结点 } } public boolean isEmpty() {//判断单链表是否空,O(1) return this.head.next==null; } //(2)存取 public T get(int i) {//返回第i个元素,0<=i<表长度。若i越界,则返回null。O(n) Node p=this.head.next; for(int j=0;p!=null && j

数据结构单链表实验报告

数据结构单链表实验报告

一、设计人员相关信息 1.设计者姓名、学号和班号:12地信李晓婧12012242983 2.设计日期:2014. 3.上机环境:VC++6.0 二、程序设计相关信息 1.实验题目:编写一个程序,实现单链表的各种基本运算(假设单链表的元素类型为 char),并在此基础上设计一个程序,完成如下功能: (1)初始化单链表; (2)采用尾插法依次插入元素a,b,c,d,e; (3)输出单链表 (4)输出单链表长度 (5)判断单链表是否为空 (6)输出单链表第3个元素 (7)输出元素a的位置 (8)在第4个元素位置上插入元素f (9)输出单链表 (10)删除第三个元素 (11)输出单链表 (12)释放单链表 2.实验项目组成: (1)插入和删除节点操作 (2)建立单链表 尾插法建表 (3)线性表基本运算在单链表中的实现 初始化线性表 销毁线性表 判断线性表是否为空表 求线性表的长度

3.实验项目的程序结构(程序中的函数调用关系图): Main LinkList InitList CreateListR DispList ListLength ListEmpty GetElem LocateElem ListInsert ListDelete DestroyList 4.实验项目包含的各个文件中的函数的功能描述: ●尾插法建表CreateListR:将新节点插到当前链表的表尾上,为此必须增加一个尾指针 r,使其始终指向当前链表的尾节点。 ●初始化线性表InitList:该运算建立一个空的单链表,即创建一个头节点; ●销毁线性表DestroyList:释放单链表占用的内存空间,即逐一释放全部节点的空间; ●判断线性表是否为空表ListEmpty:若单链表没有数据节点,则返回真,否则返回假; ●求线性表的长度ListLength:返回单链表中数据节点的个数; ●输出线性表DispList:逐一扫描单链表的每个数据节点,并显示各节点的data域值;

数据结构(C语言)单链表的基本操作

实验名称:实验一单链表的基本操作 实验目的 熟练掌握线性表两类存储结构的描述方法。 实验内容 从键盘读入若干个整数,建一个整数单链表,并完成下列操作: (1)打印该链表; (2)在链表中插入一个结点,结点的数据域从键盘读入,打印该链表; (3)在链表中删除一个结点,被删结点的位置从键盘读入,打印该链表; (4)在链表中做查找:从键盘读入要查找的整数,将该整数在链表中的位置打印出来,若要查找的整数不在链表中,返回一个信息。 算法设计分析 (一)数据结构的定义 单链表存储结构定义为: struct Node; typedef struct Node * pnode; struct Node { int info; pnode link; }; typedef struct Node * LinkList; (二)总体设计 程序由主函数、创建单链表函数、链表长度函数、链表打印函数、插入正整数函数、删除函数、查询函数组成。其功能描述如下: (1)主函数:调用各个函数以实现相应功能 int main(void) //主函数 { printf("单链表的基本操作实验:\n"); struct list *pnode; pnode = creat(); //创建 print(pnode); //输出 insert(pnode); //插入 print(pnode); //输出 _delete(pnode); //删除 print(pnode); //输出 _located(pnode); //查找 print(pnode); //输出 return 0 ; } (三)各函数的详细设计: Function1: struct list *creat()//创建链表;

数据结构与算法单链表的实现

单链表的实现 实现单链表的基本操作,必须包括初始化链表(元素为空)、销毁链表、求表长、查找、插入、删除、遍历(打印)等操作。请编写程序,实现上述单链表的基本操作。 注意:1.元素类型可以自定义 2.可以是带头结点的单链表或不带头结点的单链表 #include #include #include typedef int datatype; typedef struct node { datatype data; struct node *next; }LNode,*LinkList; /* //创建不带头结点的单链表 Linklist Create_LinkList() { return NULL; } */ //创建带头结点的单链表 LinkList Create_LinkList() { LinkList L=NULL; L=(LinkList)malloc(sizeof(LNode)); if(L) L->next=NULL; return L; } //打印单链表

void Print_LinkList(LinkList H) { if(H == NULL) { printf("?????????\n"); } else { printf("head-->"); LinkList p=H->next; while(p!=NULL) { printf("%d",p->data); printf("-->"); p=p->next; } printf("\n"); } } //销毁单链表 void Destroy_LinkList(LinkList *H) { LinkList p, q; p = *H; while(p) { q = p; p = p->next; free(q); } *H = NULL; if(*H==NULL) printf("销毁成功,请退出\n"); else printf("销毁失败\n"); }

相关文档
最新文档