数据结构--06字符串的基本操作
- 格式:doc
- 大小:175.00 KB
- 文档页数:9
实验三串基本操作的编程实现引言:串是由零个或多个字符组成的有限序列,是一种非常基础也非常重要的数据结构。
在本实验中,我们将学习串的基本操作,并使用C语言来实现这些操作。
1.实验目的:-掌握串的基本操作,包括串的初始化、判空、求长度、复制和拼接等操作;-学会使用C语言编程实现串的基本操作。
2.实验内容:本实验主要包括以下几个串的基本操作的编程实现。
2.1串的初始化操作在C语言中,我们可以使用字符数组来表示一个串。
以下是一个串的初始化操作的实现代码:```c#include <stdio.h>void InitString(char s[], char str[])int i;for (i = 0; str[i] != '\0'; i++)s[i] = str[i];}s[i]='\0';int maichar s[20];char str[] = "Hello, World!";InitString(s, str);printf("Initialized string: %s\n", s);return 0;```2.2串的判空操作判空操作即判断一个串是否为空串。
如果一个串的长度为0,则表示该串为空串。
以下是一个判空操作的实现代码示例:```c#include <stdio.h>#include <stdbool.h>bool IsEmptyString(char s[])return s[0] == '\0';int maichar s[20] = ""; // 空串if (IsEmptyString(s))printf("The string is empty.\n");} elseprintf("The string is not empty.\n");}return 0;```2.3串的长度操作求串的长度,即求一个串中字符的个数。
数据结构试题06(有答案)⼀、单选题(每题 2 分,共20分)1. 以下数据结构中哪⼀个是线性结构?( )A. 有向图B. 队列C. 线索⼆叉树D. B 树2. 在⼀个单链表HL 中,若要在当前由指针p 指向的结点后⾯插⼊⼀个由q 指向的结点,则执⾏如下( )语句序列。
A. p=q; p->next=q;B. p->next=q; q->next=p;C. p->next=q->next; p=q;D. q->next=p->next; p->next=q;3. 以下哪⼀个不是队列的基本运算?()A. 在队列第i 个元素之后插⼊⼀个元素B. 从队头删除⼀个元素C. 判断⼀个队列是否为空D.读取队头元素的值4. 字符A 、B 、C 依次进⼊⼀个栈,按出栈的先后顺序组成不同的字符串,⾄多可以组成( )个不同的字符串?A.14B.5C.6D.85. 由权值分别为3,8,6,2的叶⼦⽣成⼀棵哈夫曼树,它的带权路径长度为( )。
A . 11 B.35 C. 19 D. 53以下6-8题基于图1。
6. 该⼆叉树结点的前序遍历的序列为( )。
A. E 、G 、F 、A 、C 、D 、BB. E 、A 、G 、C 、F 、B 、DC. E 、A 、C 、B 、D 、G 、FD. E 、G 、A 、C 、D 、F 、B7. 该⼆叉树结点的中序遍历的序列为( )。
A. A 、B 、C 、D 、E 、G 、FB. E 、A 、G 、C 、F 、B 、DC. E 、A 、C 、B 、D 、G 、FE. B 、D 、C 、A 、F 、G 、E8. 该⼆叉树的按层遍历的序列为( )。
A .E 、G 、F 、A 、C 、D 、B B. E 、A 、C 、B 、D 、G 、FC. E 、A 、G 、C 、F 、B 、DD. E 、G 、A 、C 、D 、F 、B9. 下⾯关于图的存储的叙述中正确的是( )。
c语⾔描述-串的基本操作串的定长顺序存储(部分代码)连接两个串:串的第⼀个空间存储串长#define MIXSIZE 100typedef int Status;typedef char SString[MIXSIZE+1];Status Concat(SString *s3,SString s1,SString s2){if(s1[0]+s2[0]<=MIXSIZE){printf("fgsd\n");for(int i=1;i<=s1[0];i++){*s3[i]=s1[i];}for(int i=s1[0]+1;i<s1[0]+s2[0];i++){*s3[i]=s2[0];}*s3[0]=s1[0]+s2[0];return TRUE;}else if(s1[0]<MIXSIZE&&(s1[0]+s2[0]>MIXSIZE)){printf("fgsd\n");for(int i=1;i<=s1[0];i++){*s3[i]=s1[i];}for(int i=s1[0]+1,j=1;(void)(i<=MIXSIZE),j<=MIXSIZE-s1[0];j++,i++){*s3[i]=s2[j];}*s3[0]=MIXSIZE;return FALSE;}else{for(int i=1;i<=MIXSIZE;i++){*s3[i]=s1[i];}*s3[0]=MIXSIZE;return FALSE;}}求⼦串:void SubString(SString *s3,SString s1,int pos,int len){if(pos<1||len>s1[0]||len<0||len>s1[0]-pos+1)printf("⾮法操作!\n");for(int i=1,j=pos;(void)(i<len),j<pos+len-1;i++,j++){*s3[i]=s1[j];}*s3[0]=len;}串的堆分配存储表⽰#include<stdio.h>#include <stdlib.h>#include<string.h>typedef struct{char *ch;int length;}HString;//将字符串chars复制到字符串T中void StrAssign(HString *T,char *chars){int len = 0;while(*(chars+len)!='\0') //计算串的长度{len++;}if(len==0) //串chars为空的情况{T->ch=NULL;T->length=0;}else{T->ch=(char *)malloc(len * sizeof(char));for(int i=0;i<len;i++){T->ch[i]=*(chars+i);}T->length=len;}}//打印串T元素void Print_str(HString *T ){int i=0;while(i<T->length){printf("%c",T->ch[i++]);}printf("\n");}//返回串长度int StrLength(HString *T){return T->length;}//⽐较两串int StrCompare(HString *T,HString *S ){int i;if(T->length!=S->length){if(T->length>S->length){printf("字符串不等,s1的长度⼤于s2\n");return 1;}else{printf("字符串不等,s1的长度⼩于s2\n");return -1;}}else{for(i=0;i<T->length;i++){if(T->ch[i]>S->ch[i]){printf("长度相等,但s1>s2\n");return 1;}else if(T->ch[i]<S->ch[i]){printf("长度相等,但s1>s2\n");return -1;}}printf("字符串相等\n");return 0;}}//连接两的字符串void Concat(HString *T,HString *s1,HString *s2){T->ch=(char *)malloc((s1->length+s2->length)*sizeof(char)); if(!T->ch)exit(0);for(int i=0;i<s1->length;i++)T->ch[i]=s1->ch[i];}for(int i=s1->length,j=0;i<s1->length+s2->length;i++,j++) {T->ch[i]=s2->ch[j];}T->length=s1->length+s2->length;}//求⼦串void SubString(HString *T,HString *S,int pos,int len){T->ch=(char *)malloc(len*sizeof(char));if(!T->ch)exit(0);for(int i=pos-1,j=0;i<pos+len;i++,j++){T->ch[j]=S->ch[i];}T->length=len;}//清空串void ClearString(HString *T ){if(T->ch){free(T->ch);T->ch=NULL;}T->length=0;}//主函数,可对函数进⾏测试int main(){char s1[100];char s2[100];printf(" 请输⼊字符串s1:\n");gets(s1);printf("请输⼊字符串s2:\n");gets(s2);HString S,S1,S2,*p,*p1,*p2;p=&S; p1=&S1; p2=&S2;StrAssign(p1, s1);//StrAssign(p2, s2);//StrCompare(p1, p2);//Concat(p, p1, p2);//SubString(p, p1, 2, 4);//Print_str(p1);//ClearString(p1);//Print_str(p1);}串的模式匹配算法1、传统算法int Index(HString *T,HString *S, int pos){int j=0;while(pos<T->length&&j<S->length){if(T->ch[pos]==S->ch[j]){pos++;j++;}else{pos=pos-j+2;j=1;}}if(j>=S->length){int len;len=pos-S->length+1;printf("%d",len);return len;}else{return 0;}。
8种C语言基本常用的字符串处理函数8种C语言基本常用的字符串处理函数本文是店铺搜索整理的8种基本的常用的字符串处理函数,所有的C语言编译系统中一般都提供这些函数,以下是店铺为大家整理的8种C语言基本常用的字符串处理函数,仅供参考,希望能够帮助到大家。
1、puts函数——输出字符串的函数一般的形式为puts(字符串组)作用:将一个字符串输出到终端。
如,char一个string,并赋予初值。
调用puts(string);进行字符串的输出。
2、gets函数——输入字符串的函数一般的形式:gets(字符数组)作用:从终端输入一个字符串到字符数组,并且得到一个函数值成为字符数组的起始地址。
gets(str);键盘输入,,,,你懂得。
注意:puts和gets函数只能输出或者输入一个字符串。
3、strcat函数——字符串连接函数一般的形式:strcat(字符数组1,字符数组2);作用:把两个字符串数组中字符串连接起来,把字符串2连接到字符串1的后面。
说明:字符数组1必须足够大,以便容纳连接后的新字符串。
4、strcpy/strncpy函数——字符串复制函数一般形式:strcpy(字符数组1,字符串2);作用:将字符串2复制到字符数组1中去。
如:char str1[10],str2[]="DongTeng";strcpy(str1,str2);执行后的结果为:你懂得注意:1. 不能用赋值语句直接将一个字符串常量或者字符数组直接给一个字符数组。
2. 用strncpy可以赋值指定的位置的字符。
strncpy(str1,str2,3);将str2中的第3个字符复制到str1中。
5、strcmp函数——字符串比较函数一般形式:strcmp(字符串1,字符串2);作用:用来比较两个字符串的差异。
具有不同的比较规则。
6、strlen函数——测字符串长度的函数一般形式:strlen(字符数组);如:char str[10]="DongTeng";printf("%d",strlen(str));得到的结果是:57、strlwr函数——转换为小写的函数一般形式:strlwr(字符串);8、strupr函数——转换为大写的函数一般形式:strupr(字符串)。
StSs 莎匣的唯个宇符,長度歹Go ocl bye TGood LucJkf ■■石:■ 串七为:Cond bye f hyp f Cnnrl lurk! 三己符咅”串七为=b^ef b^ef Good luck!串的基本操作一、 实验目的、意义(1) 理解串的堆分配存储结构。
(2) 理解用它们表示时插入,生成串,联接串与求子串的算法。
(3) 根据具体问题的需要,能够设计出相关算法。
二、 实验内容及要求说明1:学生在上机实验时,需要自己设计出所涉及到的函数,同时设计多组输 入数据并编写主程序分别调用这些函数,调试程序并对相应的输出作出分析;修 改输入数据,预期输出并验证输出的结果,加深对有关算法的理解。
具体要求:定义串的堆分配存储,完成串的基本操作:插入,生成串,联接串,求子串三、实验所涉及的知识点C 语言算法、循环算法、串的堆分配存储结构、插入,生成串,联接 串与求子串的算法。
四、实验结果及分析(所输入的数据及相应的运行结果,运行结果要有提示信息,运行结果采用截图 方式给出。
) "E 儿敛為洁也试強Qe b extl. eweSt^): God b9E*串主否?旅“空0:5>邑七为:□峥单岬和孤相司的子早用串s 代替后,串如Good b^ef Good Luckf 舉皿青年后J 赴 宅s 为从岀屮的第I 复制吕七为串:God huefGod luch?Ss 7J i Cud luck?五、总结与体会(调试程序的心得与体会,若实验课上未完成调试,要认真找出错误并分析原因等。
)调试程序时,出现了许多错误。
如:串的堆分配存储结构、串的联接等。
另外还有一些语法上的错误。
由于对所学知识点概念模糊,试验课上未能完成此次上机作业。
后来经过查阅教材,浏览网页等方式,才完成试验。
这次试验出现错误最重要的原因就是对课本知识点理解不深刻以及编写代码时的粗心。
以后要都去练习、实践,以完善自己的不足。
day3_列表、元组、字符串、切⽚和字典的基本操作⼀、列表的基本操作简介列表的英⽂名字是list,叫列表和叫list是⼀个意思,列表⽤[]表⽰,如L = [],表⽰这是⼀个空列表,⾥⾯没有值,列表⾥⾯可以存放int、float、str、bool等数据类型,可以把⼀个类型的存放在list⾥,如nums = [6, 3, 24, 67, 31, 7, 10],也可以把所有类型的都放在⼀个list⾥,如names = ['parker', 123, 10.5, True],还有⼆维和三维,就是list⾥⾯还嵌套⼀个list列表的增加操作:以nums = [6, 3, 24, 67, 31, 7, 10]为例⼦第⼀种⽅式,append,从末尾给list添加元素,nums.append(9)就是把9这个元素放到了nums这个list的最后⾯,这是添加int类型的数据,如果要是添加字符串类型的,要把添加的内容⽤""或''括起来,print(nums)就会打印出[6, 3, 24, 67, 31, 7, 10, 9],可以看到9追加到最后的位置第⼆种⽅式,insert,指定位置添加,如果指定的下标不存在,那么在末尾添加,nums.insert(1,5),print(nums)会打印出[6, 5, 3, 24, 67, 31, 7, 10],可以看到添加的元素5插⼊到下标为1的位置,之前的下标为1的元素3,现在它的下标是2第三种⽅式,extend,从末尾给指定的list添加元素,nums.extend(['呵呵','哈哈']),print(nums)会打印出[6, 3, 24, 67, 31, 7, 10, '呵呵', '哈哈'],extend ⾥传⼊⼀个可迭代对象,可以是list,tuple,set,字符串,字典,就是把后⾯list、tuple、set⾥的元素加⼊到nums末尾,把字典的key加到nums末尾,把字符串以单个字符的形式加到nums末尾列表的查询操作:其实上⾯的print(nums)操作就是查询整个list,查看添加到list⾥⾯的元素是否已经添加成功都可以通过print(nums)来实现查询单个元素可以通过print(nums[1])或print(nums[-1]) 的⽅式,查看下标对应的元素,下标-1代表最后⼀个元素列表的修改操作:直接通过赋值的⽅式来修改,如nums[0] = 88,在print(nums)会打印出[88, 3, 24, 67, 31, 7, 10],可以看到下标为0的6变成了88,修改成功了列表的删除操作:第⼀种⽅式是,del nums[3],然后print(nums)会打印出[6, 3, 24, 31, 7, 10],会把下标为3的元素67删掉第⼆种⽅式,nums.pop(),删除列表⾥最后⼀个元素,然后print(nums)会打印出[6, 3, 24, 67, 31, 7],会把最后⼀个元素10删掉第三种⽅式,nums.pop(2),删除指定下标的元素,然后print(nums)会打印出[6, 3, 67, 31, 7, 10],会把下标为2的元素24删掉第四种⽅式,nums.remove(31),传⼊的是元素,不是下标,然后print(nums)会打印出[6, 3, 24, 67, 7, 10],list⾥⾯的元素31被删掉了第五种⽅式,nums.clear(),清空列表⾥的所有元素,返回⼀个空列表,然后print(nums)会打印出[],list⾥⾯的所有元素都被删掉了列表的排序操作:通过sort()⽅式,但只是适⽤于int和float类型,如nums.sort(),然后print(nums)会打印出[3, 6, 7, 10, 24, 31, 67],默认是按升序排列列表的翻转操作:1、通过reverse()⽅式,翻转list中元素的位置,如果上⾯的排序要实现降序排列,可以通过nums.sort(reverse=True)实现,print(nums)打印出[67, 31, 24, 10, 7, 6, 3]2、通过reversed()⽅式,tu = [1, 34, 67, 888, -777, 13],先tu.sort(),然后print(list(reversed(tu)))实现了list元素的翻转,也适⽤于元组列表的拼接操作:通过'+'连接两个list,实现list的拼接,如names + nums ,拼接后的列表是⼀个新的list,两个list(names、nums)仍然是分开的list1 = [123, 456]list2 = [45, 555]print(list1 > list2)打印出True,⽐较第⼀个元素⼤⼩,第⼀个⼀样再⽐较后⾯的,以此类推列表的下标操作:data = [123, '锤⼦', 'hello', 123, 'park', 'many', 123]print(data.index('hello')) # 打印位置2print(data.index(123, 4, 9)) # begin是4,end是9,在这个范围内123的下标,如果这个值不存在,会报错不要循环删list,会导致下标错乱,代码如下:lis = [1, 1, 2, 3, 4, 5, 6]for i in lis:if i % 2 != 0:lis.remove(i)print(lis)lis = [1, 1, 2, 3, 4, 5, 6]for i in lis3:if i % 2 != 0:lis.remove(i)print(lis)以下的情况没有问题:lis = [1, 1, 2, 3, 4, 5, 6]lis2 = [1, 1, 2, 3, 4, 5, 6]for i in lis2:if i % 2 != 0:lis.remove(i)print(lis)⼆、元组的基本操作简介元组的英⽂名字是tuple,叫元组和叫tuple是⼀个意思,元组⽤()表⽰,如L = (),表⽰这是⼀个空元组,⾥⾯没有值,元组⾥⾯也可以存放int、float、str、bool等数据类型,可以把⼀个类型的存放在tuple⾥,如nums = (6, 3, 24, 67, 31, 7, 10),也可以把所有类型的都放在⼀个tuple⾥,如names = ('parker', 123, 10.5, True),元组是不可变变量,⼀旦定义了⼀个元组,就不能修改⾥⾯的值,元组没有增删改查操作,只有两个⽅法,⼀个是count(),另⼀个是index()print(8 * (8,))打印出(8, 8, 8, 8, 8, 8, 8, 8)tu = ('hello',)tu2 = 7, 8, 9print(type(tu)) # 要是没有,就是字符串类型print(type(tu2)) # 元组类型,逗号是关键print(nums.count())的作⽤是统计元组中元素出现的次数print(nums.index())的作⽤是返回元组中元素的下标,如果有重复的,只打印第⼀个tu = (1, 34, 67, 888, -777, 13)print(sum(tu)) # 显⽰226print(sum(tu, 74)) # 显⽰300元组的删除操作:del tuprint(tu) # 删除后报NameError: name 'tu' is not defined# 不⽤max⽅法求最⼤的数def max_fun():tuple1 = (23, 15, 1, 27, -98, 77, 10, 101)max_element = tuple1[0] # 默认最⼤的元素是第0个for element in tuple1:if element > max_element:max_element = elementreturn max_elementres = max_fun()print(res)三、字符串的基本操作简介字符串就是⽤""或''括起来的表现形式,如'',这是⼀个空字符串,'abc'、'1234'、'Test'等这些都是字符串,字符串也是不可变变量,⼀旦定义了⼀个字符串,就不能修改⾥⾯的值,字符串也没有增删改查操作,字符串的⽅法很多,这⾥主要介绍⼀些常⽤的和重要的⽅法startswith() ,它的作⽤是判断以什么开头,返回True或False,这⾥定义⼀个字符串,str1 = 'abc',print(str1.startswith('a'))会打印出True,如果不是以指定字符开头返回Falseendswith() ,它的作⽤是判断以什么结尾,返回True或False,这⾥定义⼀个字符串,str2 = 'abc',print(str2.endswith('c'))会打印出True,如果不是以指定字符结尾返回Falseformat() ,它的作⽤是格式化(参数⽐较多⽤format),格式化的内容⽤{}括起来,如sql = 'insert into user values({id},{name},{sex},{addr})'sql2 = sql.format(addr='北京', id=1234, sex='男', name='hello'),print(sql2)会打印出insert into user values(1234,hello,男,北京)print('⽣成的sql语句是{sql},再来个{sql}'.format(sql=new_sql)),前⾯有两个⼀样的{sql},format⾥⾯只写⼀个就可以,format⾥⾯的sql和前⾯的加粗的sql保持⼀致,叫成别的名字也⾏,只要能对应上就⾏format还可以使⽤关键字参数,但是要放到format最后,否则会报错,如print("{index},{0}".format("再见", index="你好"))# 如果想要显⽰Pi = 3.14,format前边的字符串应该怎么填写呢?res = '{0}{1:.2f}'.format('Pi = ', 3.1415) # {1:.2f}表⽰数字保留2位⼩数,下标从0开始,数字位置随意,如print("{1},{0}".format("你好", "再见")),打印再见,你好d = {'name': 'ssj', 'age': 22}name = '⼩花'word_before = 'name is %s' % nameprint(word_before)print('{name},{age}'.format_map(d)),format_map传⼊的是⼀个字典,没有format好⽤''.join(),它的作⽤是拼接字符串,如res = ('*'.join(['hello', 'world', '123'])),⽤*连接list⾥的各元素,join⾥传⼊的可以是list,也可以是tuple,还可以是set,list、tuple以及set⾥的元素必须是字符串类型,⽤特殊符号、字母、数字或字符串都可以连接,然后print(res)打印出来⼀个字符串lstrip() ,它的作⽤是去掉字符串左边的空格和换⾏,如print(' \n aaa'.lstrip())打印出aaarstrip(),它的作⽤是去掉字符串右边的空格和换⾏,如print('mysql \n'.rstrip())打印出mysqlstrip(),它的作⽤是去掉字符串两边的空格和换⾏,如print('\n bbb \n'.strip())打印出bbb,()⾥也可以去掉指定的字符串,如name ='sun,abs',print(name.strip('s'))会打印出un,ab,如name = 'un,abs',print(name.strip('s'))会打印出un,abreplace(),它的作⽤是替换字符串,把前⾯的换成后⾯的,如print('mysql is db.'.replace('mysql', 'oracle'))会打印出oracle is db.split(),它的作⽤是分割字符串,返回⼀个list,如print('1+2+3+4'.split('+'))会打印出['1', '2', '3', '4'],默认以空格分隔,⼏个空格都⾏,如果分隔时,输⼊的分隔符不存在,也不会报错splitlines(),它的作⽤是按照换⾏符分割,返回⼀个list,如print('1+2+3\n1+2+3+4'.splitlines())会打印出['1+2+3', '1+2+3+4']zfill(),补0,括号⾥指定长度,如print('123'.zfill(10)),打印出0000000123,长度为10,在前⾯补0isalnum(),如果 string ⾄少有⼀个字符并且所有字符都是字母或数字则返回 True,否则返回 False,print('#12w@'.isalnum())会打印出False,如果只包含数字和字母,或者只包含数字或字母返回Trueisalpha(),如果 string ⾄少有⼀个字符并且所有字符都是字母则返回 True,否则返回 False,print('hello'.isalpha())会打印出Trueisdigit(),如果 string 只包含数字则返回 True,否则返回 False,print('0330'.isdigit())会打印出Trueisspace(),如果 string 中只包含空格,则返回 True,否则返回 False,print(' '.isspace())会打印出True四、切⽚的基本操作简介切⽚的英⽂名是slice,就是对list⼀个范围的取值,可以对列表、元组和字符串进⾏切⽚操作,列表切⽚后仍然是⼀个列表,元组切⽚后仍然是⼀个元组,字符串切⽚后仍然是⼀个字符串,member[1:3]表⽰取出下标值是1和2的元素,顾头不顾尾,如果member[:3]表⽰取出下标值是0,1,2的元素,如果member[1:]表⽰取出下标值从1到最后的元素,还有⼀种是member[:]表⽰是对原列表的copy,member[:10:2]表⽰取出从下标0-9的元素,2代表步长,就是每间隔⼀个取⼀个元素,实际上应该取出下标是0,2,4,6,8的元素,member[::-1]会从后取元素,然后打印出来,L[-2:-1]代表下标是倒数第⼆个的值五、字典的基本操作简介字典的英⽂名是dict,字典的表现形式是{},这表⽰空字典,也可以user_info = {'name': '哈哈', 'age': '22'},字典相⽐list取值更快,只要print(user_info['name'])就可以把哈哈打印出来,字典是通过key-value存取的,只要找到key,就可以找到对应的value,字典有增删改查操作,下⾯依次介绍字典的增加操作:第⼀种⽅式:可以通过user_info['addr']='北京'第⼆种⽅式:user_info.setdefault('sex', '男') # 如果key已存在,不做修改,还是保留原值第三种⽅式:dict1.update(dict2) # 把dict2⾥的key和value放到dict1⾥,如下:dict1 = {'name': 'tim', 'age': 22}dict2 = {'sex': 'female'}dict1.update(dict2)print(dict1) 打印出{'age': 22, 'name': '哈哈', 'sex': 'female'}字典的查询操作:第⼀种⽅式,print(user_info['name']),如果name不存在的话会报错,如果存在会打印出对应的value第⼆种⽅式,print(user_info.get('name')),如果name不存在会返回None,存在则打印出对应的value,print(user_info.get('addr', '北京')),get可以加⼀个默认值,也可以不加,如果key不存在,打印的是默认值,如果key存在,打印真实的valueprint(user_info.keys()) # 打印所有的keys,如dict_keys(['name', 'age']),转换成list,可⽤print(list(users.keys()))print(user_info.values()) # 打印所有的values,如dict_values(['哈哈', '22']),转换成list,可⽤print(list(users.values()))print(user_info.items()) # 打印出dict_items([('name', '哈哈'), ('age', '22')])字典的删除操作:第⼀种⽅式,del user_info['name'],可以删除字典⾥的name和它对应的value第⼆种⽅式,user_info.pop('age'),这⾥要传⼊⼀个key,然会后删除字典⾥的name和它对应的value第三种⽅式,user_info.popitem(),返回并删除字典中的最后⼀对key和value第四种⽅式,user_info.clear(),全部删除,返回⼀个空字典字典的修改操作:第⼀种⽅式,user_info['name'] = 'hello',直接赋值第⼆种⽅式,user_info.update(name = '孙树江'),如果没有该key就是新增⼀个键值对user_info = {'name': '哈哈', 'age': '22'}for k in user_info: # 这种循环⽅式效率⾼value = user_info.get(k)print(k, value)for k, v in user_info.items(): # 这种循环⽅式效率不⾼,通过.items()⽅法先将字典转成⼀个list,再循环print(k, v)dict1 = dict((('a', 97), ('b', 98), ('c', 99))) # 第⼆层括号可以换成[ ]print(dict1) # 打印出{'b': 98, 'c': 99, 'a': 97}dict2 = dict(⼩甲鱼='让编程改变世界', 谭浩强='让C语⾔改变历史')print(dict2) # 打印出{'谭浩强': '让C语⾔改变历史', '⼩甲鱼': '让编程改变世界'}dict3 = {}print(dict3.fromkeys((1, 2, 3))) # 如果只传⼀个,value默认是None,打印出{1: None, 2: None, 3: None}dict4 = {}print(dict4.fromkeys((1, 2, 3), '哈哈')) # 打印出{1: '哈哈', 2: '哈哈', 3: '哈哈'}dict5 = {}print(dict5.fromkeys((1, 2, 3), ('one', 'two', 'three'))) # 打印出{1: ('one', 'two', 'three'), 2: ('one', 'two', 'three'), 3: ('one', 'two', 'three')},第⼆个整体作为⼀个value# 字符串通过split⽅式转成字典my_dict = {}data = '1000,⼩花,⼥'[my_dict['id'], my_dict['name'], my_dict['sex']] = data.split(',') # ⽅法1# (my_dict['id'], my_dict['name'], my_dict['sex']) = data.split(',') # ⽅法2# my_dict['id'], my_dict['name'], my_dict['sex'] = data.split(',') # ⽅法3print('ID=>', my_dict['id'])print('Name=>', my_dict['name'])print('Sex=>', my_dict['sex'])print(my_dict) # 打印出字典综上,上⾯介绍的⽅法都是⽐较常⽤的和实⽤的⽅法,要学会活学活⽤,多动⼿练习。
课程教案课程名称:数据结构授课教师:学习对象:任课时间:一、学生情况分析数据结构是计算机专业的一门核心专业课程。
学生在前期的学习中已经学习了C语言程序设计课程。
通过本课程学习使学生对提高编写程序的能力以及解决实际问题的能力。
二、课程教学目标《数据结构》是计算机学科中一门核心专业基础课。
主要介绍如何合理地组织数据、有效地存储和处理数据,正确地设计算法以及对算法的分析和评价。
通过本课程的学习,使学生深透地理解数据结构的逻辑结构和物理结构的基本概念以及有关算法,培养基本的、良好的程序设计技能,编制高效可靠的程序,为学习操作系统、编译原理和数据库等课程奠定基础。
三、课程教学内容第一章绪论教学内容:1)什么是数据结构2)抽象数据类型概念;数据类型;数据抽象与抽象数据类型;用于描述数据结构的语言3)数据结构的抽象层次4)算法定义5)性能分析与度量;算法的性能标准;算法的后期测试;算法的事前估计;空间复杂度度量;时间复杂度度量;时间复杂度的渐进表示法;教学要求:了解:数据结构基本概念及数据结构的抽象层次了解:抽象数据类型概念了解:算法的定义及算法特性掌握:算法的性能分析与度量方法第二章线性表教学内容:1)线性表的定义和特点2)线性表的顺序存储及查找、插入和删除操作3)线性表的链式存储及查找、插入和删除操作4)使用线性表的实例教学要求:了解:线性表的定义和特点熟练掌握:线性表的顺序存储结构的查找、插入和删除等基本操作熟练掌握:单链表、循环链表及双向链表的定义及实现掌握:熟练掌握单链表的应用方法第三章栈和队列教学内容:1)栈:栈的抽象数据类型;栈的顺序存储表示;栈的链式存储表示2)队列:队列的抽象数据类型;队列的顺序存储表示;队列的链式存储表示3)队列的应用举例教学要求:熟练掌握:栈的定义及实现熟练掌握:队列的定义及实现掌握:能运用栈和队列解决简单实际问题教学:内容:1)字符串的抽象数据类型2)字符串操作的实现3)字符串的模式匹配教学要求:熟练掌握:字符串的定义方式熟练掌握:字符串的各种操作的实现了解:字符串的模式匹配算法第五章数组和广义表教学:内容:1)数组的定义和初始化2)作为抽象数据类型的数组的顺序存储方式教学要求:了解:作为抽象数据类型的数组的定义熟练掌握:顺序表的数组定义方式及实现第六章树和二叉树教学内容:1)树和森林的概念:树的定义;树的术语;树的抽象数据类型;森林的概念2)二叉树:二叉树的定义;二叉树的性质;二叉树的抽象数据类型3)二叉树的表示:数组表示;链表存储表示4)二叉树的遍历:中序遍历;前序遍历;后序遍历;应用二叉树遍历的实例;二叉树的中序非递归算法5)线索化二叉树:线索;中序线索化二叉树;前序与后序的线索化6)树与森林:树的存储表示;森林与二叉树的转换;树的遍历;森林的遍历7)二叉树的计数8)霍夫曼树:路径长度;霍夫曼树;霍夫曼树编码教学要求:了解:树和森林的概念掌握:二叉树的概念、性质及二叉树的表示熟练掌握:二叉树的遍历方法掌握:线索化二叉树的特性及寻找某结点的前驱和后继的方法掌握:树和森林的实现及遍历方法掌握:二叉树的计数方法及从二叉树遍历结果得到二叉树的方法掌握:霍夫曼树的实现方法及霍夫曼编码的概念第七章图教学内容:1)图的基本概念:图的基本概念;图的抽象数据类型2)图的存储表示:邻接矩阵;邻接表;邻接多重表3)图的遍历与连通性;深度优先搜索;广度优先搜索;连通分量4)最小生成树:克鲁斯卡尔算法;普里姆算法教学要求:掌握:图的基本概念和图的存储表示熟练掌握:图的两种遍历方法与求解连通性问题的方法掌握:构造最小生成树的Prim和Kruskal方法教学内容:1)静态查找表:顺序表的查找;有序表的查找;索引顺序表的查找2)二叉排序树:二叉排序树上的搜索、插入和删除教学要求:熟练掌握:静态搜索表的顺序搜索和折半搜索方法熟练掌握:二叉搜索树的表示、搜索、插入、删除算法及其性能分析方法第十章内部排序教学内容:1)概述2)插入排序:直接插入排序;对分插入排序;链表插入排序;希尔排序3)选择排序:直接选择排序;堆排序教学要求:掌握:排序的基本概念和性能分析方法掌握:插入排序、选择排序、等内排序的方法及性能分析方法单元名称:第一讲:绪论一、教学目标1.了解《数据结构》课程的体系结构2.掌握本章介绍的各种基本概念和术语3.了解数据结构的二元组表示4.掌握逻辑结构与物理结构之间的映像关系。
《数据结构》实验报告院系光电与信息工程学院专业电子信息工程姓名学号电话2011级2班2013年4月22日1.实验题目实验6. 字符串的基本操作2.需求分析(1)字符串匹配。
采用顺序结构存储串,编写一个函数SubStr(str1,str2),用于判定str2是否是str1的子串。
(2)公共字符串。
问题描述编写一个函数,实现在两个已知字符串中找出所有非空最长公共子串的长度和最长公共子串的个数。
实现要求输出非空最长公共子串的长度和最长公共子串的个数。
字符串匹配:①串长度Strlen(SString str)②判断是否为子串SubStr(SString str1,SString str2)公共字符串:①串长度Strlen(SString str)②最大公共串长度函数maxlen()③求公共串个数函数SubStrnum()输入形式:字符串。
3.概要设计(1)ADT SString{数据对象:D={a i|a i∈IntegerSet,i=0,1,2,…,n,n≥0}结构关系:R={<a i,a i+1>|a i,a i+1 ∈D}基本操作:Strlen(SString str)操作前提:字符串str已存在操作结果:求str的长度SubStr(SString str1,SString str2)操作前提:字符串str已存在操作结果:判断str2是不是str1的子串}ADT SString{数据对象:D={a i|a i∈IntegerSet,i=0,1,2,…,n,n≥0}基本操作:Strlen(SString str)操作前提:字符串str已存在操作结果:求str的长度maxlen(SString str1,SString str2,SString str)操作前提:字符串str1,str2,str已存在操作结果:求str1和str2的最大公共子串长度,并将该子串赋给strSubStrnum(SString str1,SString str2)操作前提:字符串str1,str2已存在操作结果:求在str1中str2子串的个数}(2)字符串匹配:本程序包含3个函数:•主函数main()•求串长函数Strlen(SString str)•{字符串匹配函数SubStr(SString str1,SString str2)各函数调用关系:主函数main调用其他两个函数公共字符串:本程序包含4个函数:•主函数main()•求串长函数Strlen(SString str)•最大公共串长度函数maxlen()•求公共串个数函数SubStrnum()各函数调用关系:主函数main调用其他三个函数(3)字符串匹配:主函数的伪码main(){定义SString 变量str1,str2;输入第一个字符串;输入第二个字符串;调用字符串匹配函数;输出匹配结果;}公共字符串:主函数的伪码main(){定义SString 变量str1,str2,str3;输入第一个字符串;输入第二个字符串;调用最大公共串长度函数,输出结果;调用公共串个数函数,输出结果;}4.详细设计字符串匹配:(1)类型定义typedef unsigned char SString[MAXSTRLEN+1];基本操作的伪码算法(1)求串长int Strlen(SString str){ 定义整型变量i;当str[i]不为空时{i++;}}(2)字符串匹配int SubStr(SString str1,SString str2){定义int变量i,m,j,p;n=Strlen(str1);m=Strlen(str2);如果n<m则返回0;当i<=n-1&&j<=m-1{如果str1[i]==str2[j]{i++;j++;}否则{i=i-j+1;j=0;}}如果j==m则返回1;否则返回0;}公共字符串:类型定义typedef unsigned char SString[MAXSTRLEN+1];基本操作的伪码算法(1)求串长int Strlen(SString str){ 定义整型变量i;当str[i]不为空时{i++;}}(2)最大公共串长度int maxlen(SString str1,SString str2,SString str){ for循环(max=Strlen(str2);max>=0;max--){For循环(i=0; str1[i]; i++)For循环(j=0; str2[j]; j++){For循环(h=0; str1[i+h]==str2[j+h] && (str2[j+h] || str1[i+h]); h++);如果(h==max){index = j;For循环(i=0; i<max; i++){str[i] = str2[index++];}str[max]='\0';返回max;}}}}(3)求公共串个数int SubStrnum(SString str1,SString str2) {定义变量int i=0,j=0,n,m,k=0;n=Strlen(str1);m=Strlen(str2);当str1[i]不为空时{当str2[j] 不为空时{如果str1[i]==str2[j] 则{i++;j++;}否则{i=i-j+1;j=0;}如果str1[i]为空{则退出循环;}}如果str2[j]为空{k++;j=0;}}返回k;}5.调试分析调试时出现错误,经过检查发现在某些地方出现死循环问题。
6.使用说明(1)字符串匹配:程序执行过程如下:提示用户输入第一个字符串;用户按要求输入一个字符串;提示用户输入第二个字符串;用户按要求输入二个字符串;调用字符串匹配函数,并在屏幕上显示匹配结果。
(2)公共字符串:程序执行过程如下:提示用户输入第一个字符串;用户按要求输入一个字符串;提示用户输入第二个字符串;用户按要求输入二个字符串;调用maxlen函数,并在屏幕上显示最大公共子串长度。
再调用SubStrnum函数分别进行比较,并将结果输出。
7.测试结果字符串匹配:(1)屏幕显示:请输入第一个字符串:输入abcdefghi后,屏幕显示:请输入第二个字符串:输入def后,屏幕显示:str2是str1的子串。
(2)屏幕显示:请输入第一个字符串:输入abcdefghi后,屏幕显示:请输入第二个字符串:输入cba后,屏幕显示:str2不是str1的子串。
公共字符串:屏幕显示:请输入第一个字符串:输入abcdefghijklmn后,屏幕显示:请输入第二个字符串:输入abikabnmabw后,屏幕显示:最大公共子串长度为2公共子串个数为38. 参考文献数据结构(c语言版)9.附录源程序文件如下:字符串匹配:#include<stdio.h>#define MAXSTRLEN 255typedef unsigned char SString[MAXSTRLEN+1];int Strlen(SString str){int i=0;while(str[i]!='\0'){i++;}return i;}int SubStr(SString str1,SString str2){int i=0,j=0,n,m;n=Strlen(str1);m=Strlen(str2);if(n<m) return 0;while(i<=n-1&&j<=m-1){if(str1[i]==str2[j]){i++;j++;}else{i=i-j+1;j=0;}}if(j==m)return 1;else return 0;}void main(){SString str1,str2;printf("请输入第一个字符串:");scanf("%s",str1);printf("\n");printf("请输入第二个字符串:");scanf("%s",str2);printf("\n");if(SubStr(str1,str2))printf("str2是str1的子串\n");else printf("str2不是str1的子串\n");}公共字符串:#include<stdio.h>#define MAXSTRLEN 255typedef unsigned char SString[MAXSTRLEN+1];int Strlen(SString str){int i=0;while(str[i]!='\0'){i++;}return i;}int maxlen(SString str1,SString str2,SString str){int i, j, h, index, max=0;for(max=Strlen(str2);max>=0;max--){for(i=0; str1[i]; i++)for(j=0; str2[j]; j++){for(h=0; str1[i+h]==str2[j+h] && (str2[j+h] || str1[i+h]); h++);if(h==max){index = j;for(i=0; i<max; i++){str[i] = str2[index++];}str[max]='\0';return max;}}}}int SubStrnum(SString str1,SString str2){int i=0,j=0,n,m,k=0;n=Strlen(str1);m=Strlen(str2);while(str1[i]){while(str2[j]){if(str1[i]==str2[j]){i++;j++;}else{i=i-j+1;j=0;}if(!str1[i]){break;}}if(!str2[j]){k++;j=0;}} r eturn k;}void main(){SString str1,str2,str3;printf("请输入第一个字符串:");scanf("%s",str1);printf("\n");printf("请输入第二个字符串:");scanf("%s",str2);printf("\n");printf("最大公共子串长度为%d\n",maxlen(str1,str2,str3));printf("公共子串个数为%d\n",SubStrnum(str1,str3)>SubStrnum(str2,str3)?SubStrnum(str1,str3):SubStrnum(str2,str3) );}。