广义表(C++实现)

广义表(C++实现)
广义表(C++实现)

广义表在学稀疏矩阵之后就应该学的,只是那时觉得看起来晕晕就跳过了,现在回头学了一下,觉得还是不错的一种结构。下面是代码:

文件"glist.h"

view plain

1.#include

2.#include

https://www.360docs.net/doc/7319257185.html,ing namespace std;

4.

5.enum elemTag {ATOM,LIST};

6.class GList;

7.

8.class GLnode

9.{

10.private:

11. elemTag Tag; //标志是原子还是子表 0:原子 1:子表

12.union

13. {

14.char data; //原子结点值域

15.struct//表结点指针域

16. {

17. GLnode *hp;

18. GLnode *tp;

19. }ptr;

20. };

21.friend class GList;

22.};

23.

24.class GList

25.{

26.public:

27. string Decompose(string &str)

28. {

29.//将非空串str分割成2部分,hstr为第一个','之前的子串,str为后面的

30.int n,i,k;

31. string ch,hstr;

32. n=str.length();

33.for(i=0,k=-1;i

34. {

35.//搜索最外层第一个逗号

36. ch=str.substr(i,1); //从第i个位置起读1个字符

37.if(ch=="(")

38. ++k;

39.else if(ch==")")

40. --k;

41. }

42.if(i

43. {

44. hstr=str.substr(1,i-2);//不要左括号,不要逗号,所以是i-2

45. str="("+str.substr(i,n-i);

46. }

47.else

48. {

49. hstr=str.substr(1,n-2);

50. str="";

51. }

52.return hstr;

53. }

54.

55./*----------------------------------------------------

56. /从广义表书写形式串S创建采用头尾链表存储表示的广义表T

57. /建立广义表头尾结点存储结构的递归定义:

58. /基本项:当S为空串时,置空广义表

59. / 当S为单字符串时,建立原子结点的子表

60. /递归项:假设sub为脱去S最外层括号的子串,记为"s1,s2,s3,..,sn"

61. / 每个si为非空字符串,对每个si建立一个表结点

62. /--------------------------------------------------------*/

63.

64.void Create_GList(GLnode *&GL,string S) //创建广义表

65. {

66. string hsub;

67.if(S=="()") //S为空串

68. {

69. GL=NULL;

70. }

71.else

72. {

73.

74. GL=new GLnode;

75.if(S.length()==1)

76. {

77. GL->Tag=ATOM;

78. GL->data=S[0];

79. }

80.else

81. {

82. GL->Tag=LIST;

83. hsub=Decompose(S); //从S中分离出表头串hsub

84. Create_GList(GL->ptr.hp,hsub);

85.if(S.empty())

86. {

87. GL->ptr.tp=NULL;

88. }

89.else

90. {

91. Create_GList(GL->ptr.tp,S);

92. }

93. }

94. }

95. }

96.

97.int GList_Depth(GLnode *GL) //求广义表深度

98. {

99./*-----------------------------------------

100. /当广义表为空表时,深度为1,当广义表为原子时

101. /深度为0,当广义表为广义表时,深度的求法为

102. /GList_Depth(GL)=1+max{GList_Depth(lsi)}

103. /-----------------------------------------*/ 104.

105.if(!GL)

106.return 1;

107.if(GL->Tag==ATOM)

108.return 0;

109.int dep,max;

110. GLnode *p;

111.for(max=0,p=GL;p;p=p->ptr.tp)

112. {

113. dep=GList_Depth(p->ptr.hp);

114.if(dep>max)

115. max=dep;

116. }

117.return 1+max;

118. }

119.

120.void Copy_GList(GLnode *GL,GLnode *&T) //T复制GL 121. {

122.//当表为空时,复制空表,否则先复制表头在复制表尾123.if(!GL)

124. T=NULL;

125.else

126. {

127. T=new GLnode;

128. T->Tag=GL->Tag;

129.if(GL->Tag==ATOM)

130. T->data=GL->data;

131.else

132. {

133. Copy_GList(GL->ptr.hp,T->ptr.hp); 134. Copy_GList(GL->ptr.tp,T->ptr.tp); 135. }

136. }

137. }

138.

139./*-----------------------------------------------140. /遍历广义表,如果是空表就输出"()",如果遇到Tag=0 141. /的结点,则直接输出该结点的值,如果tag=1,说明

142. /是一个子表,首先输出左括号,然后递归调用输出数据143. /元素,并当表尾不空的时候输出逗号,最后输出右括号144. /-----------------------------------------------*/ 145.void Traverse_GList(GLnode *L)

146. {

147.if(!L)

148. cout<<"()";

149.else

150. {

151.if(L->Tag==ATOM)

152. cout<data;

153.else

154. {

155. GLnode *p=NULL;

156. cout<<'(';

157. p=L;

158.while(p)

159. {

160. Traverse_GList(p->ptr.hp); 161. p=p->ptr.tp;

162.if(p)

163. cout<<',';

164. }

165. cout<<')';

166. }

167. }

168. }

169.

170.void GetHead(GLnode *GL) //取表头

171. {

172.//取广义表第一个元素

173. cout<<"广义表:";

174. Traverse_GList(GL);

175. cout<

176.if(!GL || GL->Tag==0 )

177. cout<<"原子和空表不能去表头"<

178.else

179. {

180. GLnode *h=GL->ptr.hp;

181.if(h->Tag==ATOM)

182. cout<<"表头为:"<data<

183.else

184. {

185. cout<<"表头为:";

186. Traverse_GList(h);

187. cout<

188. }

189. }

190. }

191.

192.void GetTail(GLnode *GL) //取表尾

193. {

194.//广义表表尾指的是除了第一个元素后所有剩余的元素组成的表195. cout<<"广义表:";

196. Traverse_GList(GL);

197. cout<

198.

199.if(!GL || GL->Tag==0)

200. cout<<"原子和空表不能取表尾"<

201.else

202. {

203. GLnode *t;

204. t=GL->ptr.tp;

205. cout<<"表尾为:";

206. Traverse_GList(t);

207. cout<

208. }

209. }

210.

211.int Length_GList_1(GLnode *GL) //求表长,非递归

212. {

213.//用非递归方式求广义表长度

214.int len=0;

215.if(GL && GL->Tag==LIST)

216. {

217.while(GL)

218. {

219. GL=GL->ptr.tp;

220. len++;

221. }

222.return len;

223. }

224.else

225.return 0;

226. }

227.

228.int Length_GList_2(GLnode *GL) //求表长,递归

229. {

230.if(!GL)

231.return 0;

232.return 1+Length_GList_2(GL->ptr.tp);

233. }

234.

235.void Replace_GList(GLnode *p,char x,char y,GLnode *&q) //替换236. {

237.//将广义表p中元素x替换成y,构建新广义表q

238.if(!p)

239. q=NULL;

240.else

241. {

242.if(p->Tag==ATOM)

243. {

244. q=new GLnode;

245. q->Tag=ATOM;

246. q->ptr.hp=NULL;

247.if(p->data==x)

248. q->data=y;

249.else

250. q->data=p->data;

251. }

252.else

253. {

254. GLnode *h,*t;

255. Replace_GList(p->ptr.hp,x,y,h);//递归处理表头得到h 256. Replace_GList(p->ptr.tp,x,y,t);//递归处理表尾得到t 257. q=new GLnode;

258. q->Tag=LIST;

259. q->ptr.hp=h;

260. q->ptr.tp=t;

261. }

262. }

263. }

264.

265.int Is_Same(GLnode *p,GLnode *q)//判断是否相等

266. {

267.int flag=1;//1表示相等,0表示不相等

268.if(p && q)

269. {

270.if(p->Tag==ATOM && q->Tag==ATOM)

271. {

272.if(p->data!=q->data)

273. flag=0;

274.else

275. flag=1;

276. }

277.else if(p->Tag==LIST &&q->Tag==LIST)

278. flag=Is_Same(p->ptr.hp,q->ptr.hp);

279.else

280. flag=0;

281.if(flag)

282. flag=Is_Same(p->ptr.tp,q->ptr.tp);

283. }

284.else

285. {

286.if(p && !q)

287. flag=0;

288.if(!p && q)

289. flag=0;

290. }

291.return flag;

292. }

293.void Concat_Glist(GLnode *&GL,GLnode *LG) //连接两个广义表294. {

295. GLnode *p=GL;

296. GLnode *q=p->ptr.tp;

297.while(q->ptr.tp)

298. q=q->ptr.tp;

299. q->ptr.tp=LG;

300. GL=p;

301. }

302.

303.};

测试函数"main.cpp"

view plain

1.#include"glist.h"

2.

3.int main()

4.{

5. GList list;

6. GLnode *GL=NULL;

7. string S;

8. cout<<"输入广义表S:";

9. cin>>S;

10. list.Create_GList(GL,S);

11. cout<<"广义表S的深度为:"<

12. cout<<"广义表S的长度为:"<

13. cout<<"广义表S的长度为:"<

14.

15. list.GetHead(GL);

16. list.GetTail(GL);

17.

18. GLnode *T;

19. cout<<"复制广义表"<

20. list.Copy_GList(GL,T);

21. cout<<"遍历复制后的广义表T"<

22. list.Traverse_GList(T);

23. cout<

24.

25. string F;

26. cout<<"输入广义表F:";

27. cin>>F;

28. GList list1;

29. GLnode *LG;

30. list1.Create_GList(LG,F);

31.if(list.Is_Same(GL,LG))

32. cout<<"广义表S和F相等"<

33.else

34. cout<<"广义表S和F不相等"<

35.

36. cout<<"广义表F的长度为:"<

37.

38.char x,y;

39. cout<<"输入你要替换的字符: ";

40. cin>>x;

41. cout<

42. cout<<"输入你要替换成哪个字符:";

43. cin>>y;

44. GLnode *k;

45. list1.Replace_GList(LG,x,y,k);

46. cout<<"替换后的广义表为:";

47. list1.Traverse_GList(k);

48. cout<

49.

50. cout<<"连接广义表S与被替换字符后的广义表F的表为:";

51. list.Concat_Glist(GL,k);

52. list.Traverse_GList(GL);

53. cout<

54.

55.return 0;

56.}

下面是输出结果

view plain

1.输入广义表S:((a,b),(c,d))

2.广义表S的深度为:2

3.广义表S的长度为:2

4.广义表S的长度为:2

5.广义表:((a,b),(c,d))

6.表头为:(a,b)

7.广义表:((a,b),(c,d))

8.表尾为:((c,d))

9.复制广义表

10.遍历复制后的广义表T

11.((a,b),(c,d))

12.输入广义表F:(f,(g,h),(i,i))

13.广义表S和F不相等

14.广义表F的长度为:3

15.输入你要替换的字符: i

16.

17.输入你要替换成哪个字符:x

18.替换后的广义表为:(f,(g,h),(x,x))

19.连接广义表S与被替换字符后的广义表F的表为:((a,b),(c,d),f,(g,h),(x,x))

20.Press any key to continue

实验二 链表操作实现

实验二链表操作实现 实验日期: 2017 年 3 月 16 日 实验目的及要求 1. 熟练掌握线性表的基本操作在链式存储上的实现; 2. 以线性表的各种操作(建立、插入、删除、遍历等)的实现为重点; 3. 掌握线性表的链式存储结构的定义和基本操作的实现; 4. 通过本实验加深对C语言的使用(特别是函数的参数调用、指针类型的应用)。 实验容 已知程序文件linklist.cpp已给出学生身高信息链表的类型定义和基本运算函数定义。 (1)链表类型定义 typedef struct { int xh; /*学号*/ float sg; /*身高*/ int sex; /*性别,0为男生,1为女生*/ } datatype; typedef struct node{ datatype data; /*数据域*/ struct node *next; /*指针域*/ } LinkNode, *LinkList; (2)带头结点的单链表的基本运算函数原型 LinkList initList();/*置一个空表(带头结点)*/ void createList_1(LinkList head);/*创建单链表*/ void createList_2(LinkList head);/* 创建单链表*/ void sort_xh(LinkList head);/*单链表排序*/ void reverse(LinkList head);/*对单链表进行结点倒置*/ void Error(char *s);/*自定义错误处理函数*/ void pntList(LinkList head);/*打印单链表*/ void save(LinkList head,char strname[]);/*保存单链表到文件*/

实验一数据库及基本表的建立

实验一数据库及基本表的建立 一、实验目的 1、掌握SQL SERVER的查询分析器和企业管理器的使用; 2、掌握创建数据库和表的操作; 二、实验内容和要求 1、练习使用SQL语句、企业管理器(Enterprise Manager)创建数据库; 2、练习使用SQL语句、企业管理器(Enterprise Manager)创建数据库表; 三、实验主要仪器设备和材料 1.计算机及操作系统:PC机,Windows 2000/xp; 2.数据库管理系统:SQL sever 2005; 四、实验方法、步骤及结果测试 题目1、创建数据库“学生情况”: 实现代码及截图: SQL语句 Create database 学生情况 查询分析器执行情况 :SQL语句及执行结果截图显示 找到主数据文件和日志文件,观察大小,并给出截图。

题目2、将数据库“学生情况”改名为“student” SQL语句 EXEC sp_renamedb学生情况, student 查询分析器执行情况: SQL语句及执行结果截图显示 题目3、创建基本表 S表 含义字段名字段类型字段 宽度 说明学号Sno Char10主键,不允许为空姓名Sname char10不允许为空 性别Ssex char2取值为男或女

C表 Sc表: 创建各表的实现代码及截图:

查询分析器执行情况: SQL语句及执行结果截图显示

题目4*、用sql语句将C表中的ccredit改为整型,同样约束为0-20之间 题目5、用sql语句在S表中添加一格“备注”字段remark,变长字符型,长度30,并保存结果

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

实验一单链表 #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; //返回头指针

数据库基本表的定义删除与修改.doc

实验一 基本表的定义,删除与修改 一、实验目的: 熟练掌握基本表的定义、删除与修改,为后继学习作准备。 二、实验属性(验证性) (1)了解并掌握SQL SERVER 2005管理控制器的使用; (2)掌握基本表的定义、删除与修改。 三、实验仪器环境与要求 1.每人一台计算机。 2.计算机安装有SQL SERVER2005。 四、实验要求(预习、实验前、实验中、实验后等要求) 1.预习教材第三章,熟悉SQL语句。 2.熟悉SQL SERVER 2005,能使用管理控制器的使用。 3.能够熟练使用SQL语句进行表的创建、删除与修改。 五、实验原理 SQL语言基本应用。 六、实验步骤: (1) 启动SQL SERVER 2005。 (2) 启动SQL SERVER 2005查询分析器; (3) 创建数据库”学生选课管理数据库”; 1 定义基本表 1.1、学生表Student,每个属性名的意义为Sno-学号字符型长度为12、Sname-姓名字符型长度为20、Ssex-性别字符型长度为4、Sage-年龄为整型、Sdept-所在系字符型长度为15。这里要求Sno为主码,Sname不能为空值,且取值唯一。 定义语句: 首先创建数据库“学生选课管理系统” Create database 学生选课管理系统 定义语句: Create table student (sno char(12) primary key, Sname char(20) unique NOT NULL, Ssex char(4),sage int,sdept char(15) ) 1.2、建立表课程表Course,其属性名意义分别为Cno-课程号、字符型长度为15, Cname-课程名、字符型长度为20, Pre_Cno-先修课程号、字符型长度为15, Credits-学分、整型。Cno为主码。 定义语句: Create table course (cno char(15) primary key ,

实验二单链表基本操作技巧

实验二单链表基本操作 一实验目的 1.学会定义单链表的结点类型,实现对单链表的一些基本操作和具体 的函数定义,了解并掌握单链表的类定义以及成员函数的定义与调用。 2.掌握单链表基本操作及两个有序表归并、单链表逆置等操作的实现。二实验要求 1.预习C语言中结构体的定义与基本操作方法。 2.对单链表的每个基本操作用单独的函数实现。 3.编写完整程序完成下面的实验内容并上机运行。 4.整理并上交实验报告。 三实验内容 1.编写程序完成单链表的下列基本操作: (1)初始化单链表La。 (2)在La中第i个元素之前插入一个新结点。 (3)删除La中的第i个元素结点。 (4)在La中查找某结点并返回其位置。 (5)打印输出La中的结点元素值。 2 .构造两个带有表头结点的有序单链表La、Lb,编写程序实现将La、 Lb合并成一个有序单链表Lc。 合并思想是:程序需要3个指针:pa、pb、pc,其中pa,pb分别指向La表与Lb表中当前待比较插入的结点,pc 指向Lc表中当前最后一个结点。依次扫描La和Lb中的元素,比较当前元素的值,将较小者链接到*pc 之后,如此重复直到La或Lb结束为止,再将另一个链表余下的内容链接到pc所指的结点之后。 3.构造一个单链表L,其头结点指针为head,编写程序实现将L逆置。 (即最后一个结点变成第一个结点,原来倒数第二个结点变成第二个结点,如此等等。) 四思考与提高 1.如果上面实验内容2中合并的表内不允许有重复的数据该如何操作? 2.如何将一个带头结点的单链表La分解成两个同样结构的单链表Lb,Lc,使得Lb中只含La表中奇数结点,Lc中含有La表的偶数结点?

数据库表标准定义

数据库标准定义 注: 1.本文档中标注为红色的字段为在国网规范规定的表基础上扩展的字段 2.标注为蓝色的字段为相似字段中应正确使用的(如单位分为管理单位、产权单位、所在单位,优先使用管理单位,不使用产权单位,会将管理单位标注为蓝色) 3.标注为浅橙色的字段为153号文件中包含但在验收文档中不包含的字段 4.根据153号文中对主题域的规定,目前已确定规范中涉及的9个域的字母符号,如有新增数据表的情况,请按照规定进行命名,如有需要新增主题域的情况,请提前与MIS 开发组联系。已确定的主题域如下: 域名代 号 域说明所覆盖的主要实体/数据备注 组织域(Orgnization)O 定义了与营销业务应用密 切相关的组织与人员信息。 供电单位、部门、人员及 管理等。 电网域(Grid)G 定义了电网基础资料及其 关系信息。 变电站、线路、台区等。 客户档案域(Customer)C 定义了客户基础数据资料。客户、用电客户、计量点、 客户用电设备、客户档案等。 采集设备域(Device)D 定义了营销设备资产信息。采集终端、集中器、采集 器、电能表、互感器。 终端参数域(Parameter)P 定义了终端运行的各项参 数配置信息。 终端基本参数、测量点参 数、总加组参数、模拟量 参数、脉冲量参数、控制 参数。 采集任务域(Assignment)A 定义了采集任务、自动抄 表任务等任务配置及执行 信息。 采集任务、任务执行明细、 任务执行信息、抄表计划。 有序用电域(Market)M 定义了有序用电业务涉及 的数据。 有序用电基本信息、错避峰 方案信息、限电信息、有 序用电执行情况。 运行控制域(Run Control)R 定义了用电采集终端的运 行信息、通过用电采集终 端进行催费、营业报停控 信息。 用电异常信息、设备运行工 况、催费控制、营业报停控 制、预购电控。 采集数据域(Elements Data)E 定义了用电信息采集主站 采集回的用电信息元数据。 实时数据、历史数据、曲 线数据、事件数据。 统计数据域(Statistics Data) T 定义了用电信息采集主站 统计分析后的数据。 电量数据、功率电流电压数 据、损耗数据。 规范未 规定,自 有域 系统公共域(System) S 定义了系统参数、公共数 据。 系统参数、主站配置信息等。规范未 规定,自 有域

广义表存储结构与算法设计分析

广义表存储结构与算法设计分析(论文) 薛金凤 (内蒙古师范大学青年政治学院) 摘要:给出了存储广义表两种不同存储结构的具体类型定义及其C 语言描述,对两种不同存储结构下广义表的几种基本操作算法——求广义表的长度、深度、表长和表尾等算法进行了分析设计,并给出相应算法的C 语言描述和时间复杂度分析,为数据结构相关章节的教学起到一定的指导作用。 关键词:广义表;抽象数据类型;C 语言;时间复杂度 广义表在《数据结构》课程的实际讲授中,一般作为由线性结构向非线性结构进行过渡的部分,大多数参考文献对于该部分内容都只给出简单的介绍,而并未给出具体的算法实现;但仔细分析广义表的逻辑结构特点,发现数据结构中的绝大多数逻辑结构都可以归纳为广义表结构,广义表在数据结构中应该占据相当重要的位置,如果让广义表统领大多数的数据存储结构,有利于增强学生的总结概括能力,对《数据结构》课程相关章节的教学也起到推波助澜的作用。 本文将介绍广义表所采用的两种不同存储结构,及其C 语言描述的类型定义,分析求解广义表的长度、深度、表头及表尾等操作应基于的存储结构,给出具体的操作算法及其C 语言描述,并对各个算法进行时间复杂度分析。 1 广义表的定义 广义表是线性表的推广,也称列表,广泛应用于人工智能等领域的表处理LISP 语言中。广义表一般记作LS=( 12,.......n a a a ),其中n 为表长,i a 可以是单个元素,也可以是广义表。 层次性事广义表的主要特点之一。单元素结点(原子结点)没有子结点;表结点或者问空表结点,或者拥有子结点;表结点和它的子结点分布在广义表的不同层次上。 广义表划分结点层次的规则:头结点定义为第一层结点;属于第k 层次子表结点的结点定义为第k+1层次结点,k=1,2,… 定义1 广义表第一层次中元素结点的个数称为广义表的长度。1 1收稿日期:2012年6月12 作者简介:薛金凤,内蒙古包头人,即将毕业于内蒙古师范大学青年政治学院。

单链表的基本操作

上机实验报告 学院:计算机与信息技术学院 专业:计算机科学与技术(师范)课程名称:数据结构 实验题目:单链表建立及操作 班级序号:师范1班 学号:201421012731 学生姓名:邓雪 指导教师:杨红颖 完成时间:2015年12月25号

一、实验目的: (1)动态地建立单链表; (2)掌握线性表的基本操作:求长度、插入、删除、查找在链式存储结构上的实现; (3)熟悉单链表的应用,明确单链表和顺序表的不同。 二、实验环境: Windows 8.1 Microsoft Visual c++ 6.0 三、实验内容及要求: 建立单链表,实现如下功能: 1、建立单链表并输出(头插法建立单链表); 2、求表长; 3、按位置查找 4、按值查找结点; 5、后插结点; 6、前插结点 7、删除结点; 四、概要设计: 1、通过循环,由键盘输入一串数据。创建并初始化一个单链表。 2、编写实现相关功能函数,完成子函数模块。 3、调用子函数,实现菜单调用功能,完成顺序表的相关操作。

五、代码: #include #include typedef char datatype; typedef struct node { datatype data; struct node *next; }linklist; linklist *head,*p; //头插法建立单链表 linklist *Creatlistf() { char ch; linklist *head,*s; head=NULL; ch=getchar(); printf("请输入顺序表元素(数据以$结束):\n"); while(ch!='$') { s=(linklist *)malloc(sizeof(linklist)); s->data=ch; s->next=head; head=s; ch=getchar(); } return head; } //求单链表的长度 void get_length(struct node *head) { struct node *p=head->next; int length=0;

链表的基本操作(基于C)

#include #include struct Student { char cName[20]; int iNumber; struct Student* pNext; }; int iCount; struct Student* Create() { struct Student* pHead=NULL; struct Student* pEnd,*pNew; iCount=0; pEnd=pNew=(struct Student*)malloc(sizeof(struct Student)); printf("please first enter Name ,then Number\n"); scanf("%s",&pNew->cName); scanf("%d",&pNew->iNumber); while(pNew->iNumber!=0) { iCount++; if(iCount==1) { pNew->pNext=pHead; pEnd=pNew; pHead=pNew; } else { pNew->pNext=NULL; pEnd->pNext=pNew; pEnd=pNew; } pNew=(struct Student*)malloc(sizeof(struct Student)); scanf("%s",&pNew->cName); scanf("%d",&pNew->iNumber); } free(pNew); return pHead; }

void Print(struct Student* pHead) { struct Student *pTemp; int iIndex=1; printf("----the List has %d members:----\n",iCount); printf("\n"); pTemp=pHead; while(pTemp!=NULL) { printf("the NO%d member is:\n",iIndex); printf("the name is: %s\n",pTemp->cName); printf("the number is: %d\n",pTemp->iNumber); printf("\n"); pTemp=pTemp->pNext; iIndex++; } } struct Student* Insert(struct Student* pHead) { struct Student* pNew; printf("----Insert member at first----\n"); pNew=(struct Student*)malloc(sizeof(struct Student)); scanf("%s",&pNew->cName); scanf("%d",&pNew->iNumber); pNew->pNext=pHead; pHead=pNew; iCount++; return pHead; } void Delete(struct Student* pHead,int iIndex) { int i; struct Student* pTemp; struct Student* pPre; pTemp=pHead; pPre=pTemp; printf("----delete NO%d member----\n",iIndex); for(i=1;i

第七章 图和广义表习题总结

第七章图和广义表课后答案及习题 习题7.1: 15 习题7.3: int visited[MAXSIZE]; //指示顶点是否在当前路径上 int exist_path_DFS(ALGraph G, int i, int j) { //深度优先判断有向图G中顶点i到顶点j是否有路径,是则返回1,否则返回0 if(i==j) return 1; //i就是j else { visited[i]=1; for(p=G.vertices[i].firstarc; p; p=p->nextarc) { k=p->adjvex; if(!visited[k]&&exist_path(k,j)) return 1; //i下游的顶点到j有路径 }//for }//else } //exist_path_DFS 习题7.4: (1)邻接矩阵

最小生成树 习题7.6: a d g f b h c e

ω> 关键路径:α→G→H→K →J →E→ω 习题7.10: int GList_Getdeph(GList L) //求广义表深度的递归算法 { if(!L->tag) return 0; //原子深度为0 else if(!L) return 1; //空表深度为1 m=GList_Getdeph(L->ptr.hp)+1; n=GList_Getdeph(L->ptr.tp); return m>n?m:n; }//GList_Getdeph 补充习题: 1.在一个无向图中,所有顶点的度数之和等于所有边数的( )倍。 A) 1/2 B) 1 C) 2 D) 4 2.具有5个顶点的有向完全图有( )条弧。 A) 10 B) 16 C) 20 D) 25 3.一个有10个顶点,6条边的无向图,该图是否连通( )。 A) 能B) 不能 4.在任一有向图中,所有顶点的入度之和一定等于所有顶点的出度之和( )。 A) 正确B) 不正确 5 图的深度优先遍历类似于二叉树的()。 A)先序遍历B)中序遍历C)后序遍历D)层次遍历 6.在用邻接表表示图时,深度优先遍历算法的时间复杂度为() A)O(n)B)O(n+e)C)O(n2)D)O(n3) 7.如果无向图G必须进行二次广度优先搜索才能访问其所有顶点,则下列说法中不

单链表的基本操作 C语言课程设计

课程设计(论文) 题目名称单链表的基本操作 课程名称C语言程序课程设计 学生姓名 学号 系、专业信息工程系、网络工程专业 指导教师成娅辉 2013年6月6 日

目录 1 前言 (3) 2 需求分析 (3) 2.1 课程设计目的 (3) 2.2 课程设计任务 (3) 2.3 设计环境 (3) 2.4 开发语言 (3) 3 分析和设计 (3) 3.1 模块设计 (3) 3.2 系统流程图 (4) 3.3 主要模块的流程图 (6) 4 具体代码实现 (9) 5 课程设计总结 (12) 5.1 程序运行结果 (12) 5.2 课程设计体会 (12) 参考文献 (13) 致谢 (13)

1 前言 我们这学期学习了开关语句,循环语句、链表、函数体、指针等的应用,我们在完成课程设计任务时就主要用到这些知识点,本课题是单链表的简单操作,定义四个子函数分别用来创建链表、输出链表、插入数据以及删除数据,主函数中主要用到开关语句来进行选择调用哪个子函数,下面就是课程设计的主要内容。 2 需求分析 2.1 课程设计目的 学生在教师指导下运用所学课程的知识来研究、解决一些具有一定综合性问题的专业课题。通过课程设计(论文),提高学生综合运用所学知识来解决实际问题、使用文献资料、及进行科学实验或技术设计的初步能力,为毕业设计(论文)打基础。 2.2 课程设计任务 输入一组正整数,以-1标志结束,用函数实现:(1)将这些正整数作为链表结点的data域建立一个非递减有序的单链表,并输出该单链表;(2)往该链表中插入一个正整数,使其仍保持非递减有序,输出插入操作后的单链表;(3)删除链表中第i个结点,输出删除操作后的单链表,i从键盘输入。 2.3 设计环境 (1)WINDOWS 7系统 (2)Visual C++ 2.4 开发语言 C语言 3 分析和设计 3.1 模块设计 定义链表结点类型struct node表示结点中的信息,信息包括数据域data(用于存放结点中的有用数据)以及指针域next(用于存放下一个结点的地址),并将链表结点类型名改为NODE。如下所示:

用单链表实现集合的操作

《数据结构》课设计报告 2012—2013学年第一学期 课程名称数据结构 设计题目用单链表实现集合的操作 专业班级 姓名 学号 指导教师 一.实验目的

掌握单链表的算法,插入、删除、遍历等。 二.实验内容 (1)对集合中的元素用有序单链表进行存储; (2)实现交、并、差等基本运算时,不能另外申请存储空间; (3)充分利用单链表的有序性,要求算法有较好的时间性能。 三.设计与编码 集合是由互不相同的元素构成的一个整体,在集合中,元素之间可以没有任何关系,所以,集合也可以作为线性表的处理。用单链表实现集合的操作,需要注意集合中元素的唯一性,即在单链表中不存在值相同的结点。 (1)判断A和B是否相等。两个集合相等的条件是不仅长度相同,而且各个对应的元素也相等。由于用单链表表示集合,所以只要同步搜啊秒两个单链表,若从头至尾每个对应的元素都相等,则表明两个集合相等。 (2)求集合A和B的交集。根据集合的运算规则,集合A∩B中包含所有既属于集合A又属于集合B的元素,因此,需要查找单链表A和B中的相同元素并保留在单链表A中。由于用有序单链表表示集合,因此判断某元素是否在B中不需要遍历表B,而是从上次搜索到的位置开始,若在搜索过程中,遇到一个其值比该元素大的结点,便可断定该元素不在单链表中,为此,需要用两个指针p、q分别指向当前被比较的两个结点,会出现以下三种情况: 1、若p->data>q->data,说明还未找到,需在表B中继续查找; 2、若p->datadata,说明表B中无此值,处理表A中下一结点; 3、若p->data=q->data,,说明找到了公共元素。 (3)求集合A和B的并集,集合A∪B中包含所有或属于集合A或属于集合B 的元素。因此,对单链表B中的每一个元素x,在单链表A中进行查找,若存在和x不同的元素,则将该结点出入到单链表A中。 (4)求集合A和B的差集。根基集合的运算规则,集合A-B中包含所有属于集合A而不属于集合B的元素。因此,对单链表B中的每个元素x在单链表A中进行查找,若存在和x相同的结点,则将该结点从链表A中删除。 在主函数中,首先建立两个有序单链表表示集合A和B,然后依次调用相应函数实现集合的判等、交、并和差等运算,并输出运算结果。 代码: #include using namespace std; template struct Node{ T data; Node *next; }; template class LinkList{ public:

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

#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);

数据结构 广义表的建立与输出

《数据结构》实验报告 ◎实验题目:广义表的建立与输出 ◎实验目的:1、掌握使用Visual C++6.0上机调试程序的基本方法; 2、掌握广义表的存储结构,学会广义表的建立与输出; 3、提高自己分析问题和解决问题的能力,在实践中理解教材上的理论。 ◎实验内容:利用链式存储结构建立广义表,然后输出该广义表,在本实验中不使用递归的方法,而是用一个栈存储结点的指针,以此完成实验要求。 一、需求分析 1、输入的形式和输入值的范围:根据提示,输入广义表,按回车结束。 2、输出的形式:输出结果为上一步所输入的广义表。 3、程序所能达到的功能:输入广义表后,该程序可以建立广义表的链式存储结构,之后按照一定的顺序访问结点并输出相应的值,从而完成广义表的输出。 4、测试数据: 输入广义表:((),a,b,((c,(d,()))),((()))) 输出结果为:((),a,b,((c,(d,()))),((()))) 是否继续?(是,输入1;否,输入0):1 输入广义表: 广义表未建立 是否继续?(是,输入1;否,输入0):0 Press any key to continue 二概要设计 1、广义表是一种递归的数据结构,因此很难为每个广义表分配固定大小的存储空间,所以其存储结构采用动态链式结构。 每个结点的形式如下图所示。 tag为标记域:若tag=0,表示该结点的sublist域不为空,若tag=1,表示该结点为表结点,则sublist域中存放相应子表第一个元素对应结点的地址; data域:存放广义表中的字母; sublist域:存放相应子表第一个元素对应结点的地址; next域:存放与本元素同一层的下一个元素所在结点的地址,当本元素是所在层的最后一个元素时,next域为空。 2、广义表的建立 本程序中利用数组存储所输入的广义表,然后从头到尾扫描数组中的每一个字符根据字符的不同分别执行不同的操作,并用一个存储结点指针的栈辅助完成。在扫描前先申请一个结点作为头结点,也是当前指针所指结点,在广义表的建立的过程中,每次申请一个新结点,需对其进行初始化,即令标记域为0,data域为空。按照本程序的思路,广义表(a,(b,c),())的链式存储结构如下图所示。广义表建立的具体过程见详细设计部分。

单链表基本操作实验

实验2 链表的操作 实验容: 1)基础题:编写链表基本操作函数,链表带有头结点 (1)CreatList_h()//用头插法建立链表 (2)CreateList_t()//用尾插法建立链表 (3)InsertList()向链表的指定位置插入元素 (4)DeleteList()删除链表中指定元素值 (5)FindList()查找链表中的元素 (6)OutputList()输出链表中元素 2)提高题: (1)将一个头节点指针为heada的单链表A分解成两个单链表A和B,其头结点指针分别为heada和headb,使得A表中含有原单链表A中序号为奇数的元素,B表中含有原链表A中序号为偶数的元素,且保持原来的相对顺序。 (2)将一个单链表就地逆置。 即原表(a1,a2,。。。。。。 an),逆置后新表(an,an-1,。。。。。。。a1) /* 程序功能 :单链表基本功能操作 编程者 :天啸 日期 :2016-04-14 版本号 :3.0 */ #include #include typedef struct List { int data; struct List *next; }List; void CreatList_h(List *L) //头插法 { int i = 0; int n = 0; int goal; List *p; printf("请输入数据的个数:\n"); scanf("%d",&n); L -> next = NULL; for(i=0;i

{ printf("请输入第%d个数:\n",i+1); scanf("%d",&goal); p = (struct List*)malloc(sizeof(struct List)); p -> data = goal; p -> next = L->next; //将L指向的地址赋值给p; L -> next = p; } } void CreateList_t(List *L) //尾插法 { int i; int n; int goal; List *p; List *q=L; printf("请输入数据的个数:\n"); scanf("%d",&n); for (i=0;i data = goal; q -> next = p; q = p; } q -> next = NULL; } void InsList(List *L,int i,int e) //插入 { List *s; List *p = L; int j = 0; while (p&&jnext; ++j; } s = (struct List*)malloc(sizeof(struct List)); s -> data = e; //插入L中

链表基本操作实验报告

实验2 链表基本操作实验 一、实验目的 1.定义单链表的结点类型。 2.熟悉对单链表的一些基本操作和具体的函数定义。 3.通过单链表的定义掌握线性表的链式存储结构的特点。 二、实验内容与要求 该程序的功能是实现单链表的定义和主要操作。如:单链表建立、输出、插入、删除、查找等操作。该程序包括单链表结构类型以及对单链表操作的具体的函数定义和主函数。程序中的单链表(带头结点)结点为结构类型,结点值为整型。 要求: 同学们可参考指导书实验2程序、教材算法及其他资料编程实现单链表相关操作。必须包括单链表创建、输出、插入、删除操作,其他操作根据个人情况增减。 三、算法分析与设计。 1.创建单链表: 头结点L

...... 2.单链表插入

s s->data=x; s->next=p->next; p->next=s; 3.单链表的删除: p->next=p->next->next;

四、运行结果 1.单链表初始化 2.创建单链表 3.求链表长度 4.检查链表是否为空 5.遍历链表 6.从链表中查找元素 7.从链表中查找与给定元素值相同的元素在顺序表中的位置

8.向链表中插入元素 插入元素之后的链表 9.从链表中删除元素 删除位置为6的元素(是3) 10.清空单链表 五、实验体会 经过这次单链表基本操作实验,自己的编程能力有了进一步的提高,认识到自己以前在思考一个问题上思路不够开阔,不能灵活的表达出自己的想法,虽然在打完源代码之后出现了一些错误,但是经过认真查找、修改,最终将错误一一修正,主要是在写算法分析的时候出现了障碍,经过从网上查找资料,自己也对程

数据结构(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)熟练掌握单链表的插入,删除和查询算法的设计与实现。 (3)根据具体问题的需要,设计出合理的表示数据的链表结构,并设计相关算法。 二、实验内容及要求 说明1:本次实验中的链表结构均为带头结点的单链表。 说明2: 学生在上机实验时,需要自己设计出所涉及到的函数,同时设计多组输入数据并编写主程序分别调用这些函数,调试程序并对相应的输出作出分析;修改输入数据,预期输出并验证输出的结果,加深对有关算法的理解。 具体要求: 建立单链表,完成链表(带表头结点)的基本操作:建立链表、插入、删除、查找、输出;其它基本操作还有销毁链表、将链表置为空表、求链表的长度、获取某位置结点的内容、搜索结点。 三、实验所涉及的知识点 数据结构、C语言语法函数、结构体类型指针、单链表(建表、初始化链表、求表长、插入、删除、查询算法)等。 四、实验结果及分析 (所输入的数据及相应的运行结果,运行结果要有提示信息,运行结果采用截图方式给出。) 五、总结与体会 (调试程序的心得与体会,若实验课上未完成调试,要认真找出错误并分析原因等。) 调试程序时,出现了许多错误。如:结构体类型指针出错,忽略了释

放存储空间,对头插法建表、尾插法建表不熟悉等。另外还有一些语法上的错误。由于对所学知识点概念模糊,试验课上未能完成此次上机作业。后来经过查阅教材,浏览网页等方式,才完成试验。这次试验出现错误最重要的原因就是对课本知识点理解不深刻以及编写代码时的粗心。以后要都去练习、实践,以完善自己的不足。 六、程序清单(包含注释) //单链表 #include<> #include<> #define OK 1 #define ERROR 0 typedef char ElemType; typedef int Status; //线性表的单链表的存储结构 typedef struct LNode{ ElemType data; struct LNode *next; }LNode,*LinkList; //LinkList为结构体类型的指针,可以直接定义变量,比如LinkList p; //建表(头插法) void CreatListF(LinkList &L,ElemType a[],int n) { //初始化线性表 L=(LinkList)malloc(sizeof(LNode));//分配内存空间 L->next=NULL;

相关文档
最新文档