C++版数据结构串的实现与操作
- 格式:doc
- 大小:18.00 KB
- 文档页数:3
《数据结构(C语言版)》教案《数据结构(C语言版)》教案2020 至2020 学年第一学期教案课程名称数据结构使用教材《数据结构(C语言版)》教学时数56课程性质必修任课班级(人数)信管(53人)信息系(部)信管教研室任课教师山东科技大学泰山科技学院课时授课计划2020-2020学年第二学期第1周授课日期2月20 日星期1 月日星期月日星期月日星期月日星期班级信管10-1 基本课题第1章绪论 1.1-1.2 教学目的与要求:1. 了解数据结构的基本概念2. 理解常用术语教学重点:数据结构的基本概念和术语教学难点:数据元素之间的四种结构关系作业及参考书:1、什么是数据结构?《数据结构算法实现及解析》/高一凡编著教具:多媒体板书课堂类型:讲授教学过程:自我介绍——开课——引入——展开——举例——小结——作业一、自我介绍和课程介绍约8min 课时:64 二、引入约2min 由问题的提出引入三、讲课进程设计1.1 什么是数据结构 1.1.1、数据结构与其它的关系约15min 数据结构+算法=程序程序设计: 为计算机处理问题编制一组指令集算法: 处理问题的策略数据结构: 问题的数学模型 1.1.2、当今计算机应用的特点:约25min l) 所处理的数据量大且具有一定的关系;2) 对其操作不再是单纯的数值计算,而更多地是需要对其进行组织、管理和检索。
举例说明:1) 学生成绩表2)井安棋对弈3)交通管理结论计算机的操作对象的关系更加复杂,操作形式不再是单纯的数值计算,而更多地是对这些具有一定关系的数据进行组织管理;我们将此称为非数值性处理。
要使计算机能够更有效地进行这些非数值性处理,就必须弄清楚这些操作对象的特点,在计算机中的表示方式以及各个操作的具体实现手段。
1.2 基本概念和术语1.1.1、数据与数据结构约20min 数据:是对客观事物的符号表示。
所有能被输入到计算机中,且能被计算机处理的符号的集合。
是计算机操作的对象的总称。
串基本操作的编程实现串(String)是一种数据结构,用于存储和操作字符序列。
在编程中,我们经常需要处理文本数据,比如字符串的搜索、替换、拼接等操作。
本文将以串基本操作为主题,分步解析在编程中如何实现这些操作。
1. 串的定义与表示在开始之前,我们首先需要了解串的定义与表示。
串是由零个或多个字符组成的有限序列。
可以使用字符数组或链表来表示一个串,这里我们以使用字符数组实现为例。
c#define MAX_SIZE 100typedef struct {char data[MAX_SIZE]; 用字符数组存储串的字符序列int length; 串的当前长度} String;2. 串的赋值与初始化在使用一个串之前,需要先进行初始化或者赋值操作。
初始化是指将字符串初始化为空串,而赋值是指将一个字符串赋值给另一个字符串。
下面是它们的具体实现。
c初始化串为空串void initString(String* s) {s->length = 0; 将串的长度初始化为0}将字符串t赋值给字符串svoid assignString(String* s, const char* t) {int i = 0;while (t[i] != '\0' && i < MAX_SIZE) {s->data[i] = t[i];i++;}s->length = i;}3. 串的拼接拼接是指将两个串连接在一起,形成一个新的串。
下面是串的拼接操作的实现。
c将字符串s2拼接到字符串s1的末尾void concatString(String* s1, const String* s2) {int i, j;for (i = s1->length, j = 0; j < s2->length && i < MAX_SIZE - 1; i++, j++) {s1->data[i] = s2->data[j];}s1->length = i;s1->data[i] = '\0'; 在拼接串的末尾添加结束符}4. 串的比较比较是指判断两个串是否相等。
/*数据结构C语言版抽象数据类型Polynomial一元多项式的实现P42-43编译环境:Dev-C++ 4.9.9.2日期:2011年2月10日*/#include <stdio.h>#include <malloc.h>#include <stdlib.h>// 抽象数据类型Polynomial一元多项式的实现typedef struct // 项的表示,多项式的项作为LinkList的数据元素{float coef; // 系数int expn; // 指数}term, ElemType;// 两个类型名:term用于本ADT,ElemType为LinkList的数据对象名typedef struct LNode // 结点类型{ElemType data;struct LNode *next;}LNode,*Link,*Position;typedef struct _LinkList // 链表类型{Link head,tail; // 分别指向线性链表中的头结点和最后一个结点int len; // 指示当前线性链表中数据元素的个数}LinkList;typedef LinkList polynomial;#define DestroyPolyn DestroyList#define PolynLength ListLength// 已知p指向线性链表L中的一个结点,返回p所指结点的直接前驱的位置// 若无前驱,则返回NULLPosition PriorPos(LinkList L,Link p){Link q;q=L.head->next;if(q==p) // 无前驱return NULL;else{while(q->next!=p) // q不是p的直接前驱q=q->next;return q;}}// 若升序链表L中存在与e满足判定函数compare()取值为0的元素,则q指示L中// 第一个值为e的结点的位置,并返回1;否则q指示第一个与e满足判定函数// compare()取值>0的元素的前驱的位置。
数据结构(C语言版)(第2版)课后习题答案数据结构(C语言版)(第2版)课后习题答案1. 简介数据结构是计算机科学领域中非常重要的一门学科,它研究的是数据的组织、存储和管理方式。
本文将针对《数据结构(C语言版)(第2版)》的课后习题提供答案,帮助读者更好地理解和应用数据结构。
2. 第一章: 绪论在第一章中,主要介绍了数据结构的基本概念、分类和基本操作。
以下是部分习题的答案:2.1 习题1习题描述:什么是数据结构?答案:数据结构是指数据对象中元素之间的关系,以及对这些关系进行操作的方法和技术的集合。
2.2 习题2习题描述:数据结构的分类有哪些?答案:数据结构可以分为线性结构和非线性结构。
线性结构包括线性表、栈、队列等;非线性结构包括树、图等。
3. 第二章: 线性表第二章介绍了线性表的定义、分类和实现。
以下是部分习题的答案:3.1 习题1习题描述:什么是线性表?答案:线性表是由n个数据元素a1, a2, ..., an组成的有限序列,其中元素之间存在着一一对应的关系。
3.2 习题2习题描述:线性表的分类有哪些?答案:线性表可以分为顺序表和链表。
顺序表是用一段地址连续的存储单元一次存储线性表的所有元素,而链表是采用链式存储结构,通过每个元素存储其后继元素的地址来实现元素之间的逻辑关系。
4. 第三章: 栈与队列第三章讲解了栈和队列的定义、特性和实现。
以下是部分习题的答案:4.1 习题1习题描述:栈和队列有什么区别?答案:栈是一种后进先出的线性表,只能在表尾进行插入和删除操作;队列是一种先进先出的线性表,只能在表的一端进行插入和删除操作。
4.2 习题2习题描述:栈的应用有哪些?答案:栈在计算机科学中有广泛的应用,如函数的调用和返回、括号匹配、表达式求值等。
5. 第四章: 串第四章讲解了串的定义、模式匹配和实现。
以下是部分习题的答案:5.1 习题1习题描述:什么是串?答案:串是由零个或多个字符组成的有限序列,串中的字符个数称为串的长度。
习题11.1选择题。
(1)计算机识别、存储和加工处理的对象统称为。
A.数据B.数据元素C.数据结构D.数据类型(2)数据结构通常是研究数据的及它们之间的联系。
A.存储和逻辑结构B.存储和抽象C.理想和抽象D.理想和逻辑(3)下列不是数据的逻辑结构的是。
A.散列结构 B.线性结构 C.树形结构 D.图状结构(4)数据结构被形式地定义<D,R>,其中D是的有限集,R是___的有限集。
A.算法 B.数据元素C.数据操作 D.逻辑结构(5)组成数据的基本单位是。
A.数据项 B.数据类型 C.数据元素 D.数据变量(6)设数据结构A=(D,R),其中,D={1,2,3,4},R={r},r={<1,2>,<2,3 >,<3,4>,<4,1>},则数据结构A是。
A.线性结构 B.树形结构 C.图状结构 D.集合(7)数据在计算机存储器中表示时,若物理地址与逻辑地址相同并且是连续的,则称为。
A.存储结构B.逻辑结构C.顺序存储结构D.链式存储结构(8)在数据结构的讨论中把数据结构从逻辑上分。
A.内部结构与外部结构B.静态结构与动态结构B.线性结构与非线性结构 D.紧凑结构与非紧凑结构(9)对于一个算法的评价,不包括以下方面的内容。
A.健壮性和可读性B.并行性C.正确性D.时间空间复杂度(10)算法分析的两个方面是。
A.空间复杂性和时间复杂性B.正确性和简明性C.可读性和文档性 D.数据复杂性和程序复杂性1.2填空题(1)数据结构是一门研究非数值计算的程序设计问题中计算机的以及它们之间的和运算等的学科。
(2)数据结构包括数据的结构和结构。
(3)数据结构从逻辑上划分为3种基本类型,即、和。
(4)数据的物理结构被分为、、和种类型。
(5)一种抽象数据结构类型包括和两个部分。
(6)数据的逻辑结构是指数据的存储结构是指(7)数据结构是指指数数据及其相互之间的当结点之间存在M对N(M:N)的联系时,称这种结构为当结点之间存在1对N(1:N)的联系时,称这种结构为(8)对算法从时间和空间两个方面进行衡量,分别称为分析。
第4~5章串和数组自测卷答案一、填空题(每空1分,共20分)1. 不包含任何字符(长度为0)的串称为空串;由一个或多个空格(仅由空格符)组成的串称为空白串。
(对应严题集4.1①,简答题:简述空串和空格串的区别)2. 设S=“A;/document/Mary.doc”,则strlen(s)= 20 , “/”的字符定位的位置为3。
4. 子串的定位运算称为串的模式匹配;被匹配的主串称为目标串,子串称为模式。
5. 设目标T=”abccdcdccbaa”,模式P=“cdcc”,则第 6 次匹配成功。
6. 若n为主串长,m为子串长,则串的古典(朴素)匹配算法最坏的情况下需要比较字符的总次数为(n-m+1)*m。
7. 假设有二维数组A6×8,每个元素用相邻的6个字节存储,存储器按字节编址。
已知A的起始存储位置(基地址)为1000,则数组A的体积(存储量)为288 B ;末尾元素A57的第一个字节地址为1282 ;若按行存储时,元素A14的第一个字节地址为(8+4)×6+1000=1072 ;若按列存储时,元素A47的第一个字节地址为(6×7+4)×6+1000)=1276 。
(注:数组是从0行0列还是从1行1列计算起呢?由末单元为A57可知,是从0行0列开始!)8. 〖00年计算机系考研题〗设数组a[1…60, 1…70]的基地址为2048,每个元素占2个存储单元,若以列序为主序顺序存储,则元素a[32,58]的存储地址为8950 。
答:不考虑0行0列,利用列优先公式:LOC(a ij)=LOC(a c1,c2)+[(j-c2)*(d1-c1+1)+i-c1)]*L得:LOC(a32,58)=2048+[(58-1)*(60-1+1)+32-1]]*2=89509. 三元素组表中的每个结点对应于稀疏矩阵的一个非零元素,它包含有三个数据项,分别表示该元素的行下标、列下标和元素值。
#include "stdlib.h"
#include "stdio.h"
#include "iostream.h"
#define STRINGMAX 80
struct string
{int len;
char ch[STRINGMAX]; //和char *ch 作用是一样的
};
typedef struct string STRING;
#define LEN STRINGMAX*sizeof(STRING)/* 串的定义*/
void create(STRING *s);
void print(STRING *s);
int concat(STRING *s,STRING *t);
STRING *substr(STRING *s,int start,int len);
void Delete(STRING *s,int start,int len);
void main()
{STRING *s,*t,*v; /*定义三个采用静态存储形式的串*/ t=(STRING *)malloc(LEN); /*为三个串分配相应的存储空间*/ s=(STRING *)malloc(LEN);
v=(STRING *)malloc(LEN);
int start,len;
// int position;
cout<<"请输入串s:"<<endl; /*创建S串*/
create(s);
cout<<"请输入串t:"<<endl; /*创建T串*/
create(t);
concat(s,t); /* 连接并输出相应的串*/
cout<<"将串t联接串s后,新串s为:"<<endl;
print(s);
cout<<"求子串。
\n输入截取子串的起始位置:";
cin>>start;
cout<<"\n输入子串的长度:";
cin>>len;
v=substr(s,start,len); /*求子串*/
cout<<"\n子串为:"<<v->ch<<endl;
cout<<"输入删除串的起始位置:"; /* 输入删除串的起始位置*/ cin>>start;
cout<<"\n输入删除串的长度:"; /* 输入删除串的长度*/ cin>>len;
Delete(s,start,len); /*删除串*/
cout<<"\n删除子串后,串s为:"<<endl;
print(s);
}
void create(STRING *s)
{
char c;
int i;
for (i=0;((c=getchar())!='\n'&&i<80);i++)
s->ch[i]=c; /*将输入的字符序列放入串的字符数组中*/ s->len=i; /*置串的长度*/
s->ch[i]= '\0 ';
}
void Delete(STRING *s,int start,int len) //从start位置开始删除len长的子串
{
int i;
if (start<=s->len&&len>=0&&start+len<=s->len)/*删除操作合法性验证*/
{for(i=start+len;i<=s->len;i++) /*从start位置开始移动元素*/
s->ch[i-len]=s->ch[i];
s->len=s->len-len; /*置新的长度*/
}
else
cout<<"cannot delete!\n";
}
STRING *substr(STRING *s,int start,int len) //取子串,从start位置开始取len长的子串{int i;
STRING *t;
t=(STRING *)malloc(LEN);
if (start<0&&start>=s->len) /*取子串的合法性验证*/
return(NULL);
else
if (len>=1&&len<=s->len-start)
{ for(i=0;i<len;i++) /*取字符序列入到子串的字符数组中*/
t->ch[i]=s->ch[start+i];
t->len=len; /*置子串长度*/
t->ch[i]='\0';
return(t);
}
else
return(NULL);
}
int concat(STRING *s,STRING *t)
{
if(s->len+t->len>STRINGMAX)
if(!(s=((STRING *)realloc(s,(s->len+t->len)*sizeof(char))))) return 0; int i,j;
j=s->len;
for (i=0;i<t->len;i++)
s->ch[i+j]=t->ch[i]; /*将串t中字符序列放入串s的尾部*/
s->ch[i+j]= '\0 ';
s->len=s->len+t->len; /*置新串s的长度*/
return 1;
}
void print(STRING *s) /*输出串的字符序列*/
{int i;
for (i=0;s->ch[i]!= '\0 ';i++)
cout<<s->ch[i];
cout<<endl;
}。