数据结构课程设计——文字编辑实验报告

合集下载

数据结构课程设计实践报告

数据结构课程设计实践报告

数据结构课程设计实践报告数据结构课程设计实践报告1. 实验目的本次数据结构课程设计实践的目的是帮助学生掌握数据结构的基本概念,了解常见数据结构的实现原理,提高代码实现能力和问题解决能力。

2. 实验背景数据结构是计算机科学的基础课程,它是计算机科学的重要组成部分。

在计算机科学中,数据结构是针对计算机中的数据存储、管理和操作的方法论。

数据结构中的“数据”是指计算机中存储的各种信息,而“结构”则是指这些信息之间的相互关系。

常见的数据结构包括数组、链表、栈、队列、树和图等。

3. 实验内容本次数据结构课程设计实践包括以下内容:3.1 栈和队列实现一个基于栈和队列的计算器程序,能够进行加减乘除等基本运算和括号运算。

3.2 链表与树实现一个简单的文件系统,包括文件的创建、删除、移动、复制等操作,利用链表实现文件存储,利用树来实现文件目录结构。

3.3 图实现最短路径算法,并利用Graphviz工具将结果可视化展示出来。

4. 实验过程我们小组首先进行了团队分工,每个成员负责一个模块的代码实现,同时进行代码审查。

我们使用C++语言进行编码实现,采用面向对象设计思想,将每个数据结构封装成一个类,方便日后的调用和扩展。

在实现栈和队列的计算器程序时,我们使用了双栈法来进行括号运算的处理,使用队列来实现多项式的存储和输出。

在实现文件系统时,我们构建了一颗树形结构来表示文件的目录结构,同时在每个节点处保存了一个链表,来存储该目录下的文件信息,方便进行操作。

在实现最短路径算法时,我们采用了Dijkstra算法,并使用Graphviz 工具将结果可视化展示出来。

5. 实验结果我们小组经过不断尝试和调试,最终实现了所有要求的功能,并达到了预期的效果。

我们在实验过程中遇到的问题,如链表的指针操作、树的遍历方法以及Dijkstra算法的实现等,我们通过文献资料的查阅和团队讨论得以解决。

6. 实验总结通过本次数据结构课程设计实践,我们加深了对数据结构的理解和掌握,同时也提高了我们的编程能力和问题解决能力。

数据结构课程设计实验报告

数据结构课程设计实验报告

数据结构课程设计实验报告引言数据结构课程设计实验是为了加深对数据结构基本概念和算法的理解和掌握,通过实际操作来加深对数据结构的认识和应用能力。

本实验报告将介绍在数据结构课程设计实验中所完成的内容,包括实验目的、实验环境、实验过程、实验结果以及实验总结。

实验目的通过本次实验,旨在掌握以下内容: - 理解并掌握线性表、栈、队列、链表、二叉树等基本数据结构的概念和实现; - 熟悉数据结构的插入、删除、查找等基本操作; - 学习并掌握基本排序算法和查找算法的实现; - 通过实验加深对数据结构和算法的理解,并能够灵活运用于实际问题的解决。

实验环境本次实验在以下环境下进行: - 操作系统:Windows 10 - 编程语言:C语言 - 集成开发环境:Visual Studio Code实验过程1. 线性表的操作设计1.1 定义结构体首先,定义表示线性表的结构体,包括数据域和指向下一个结点的指针。

typedef struct Node {int data; // 数据域struct Node* next; // 指向下一个结点的指针} Node;1.2 初始化线性表编写函数以初始化一个空的线性表。

void InitList(Node** head) {*head = (Node*)malloc(sizeof(Node));(*head)->next = NULL;}1.3 插入元素编写函数以在线性表的指定位置插入元素。

```C void Insert(Node* head, int pos, int data) { if (pos < 1) { printf(。

文本编辑《数据结构》上机实验报告

文本编辑《数据结构》上机实验报告

成都信息工程学院计算机系课程实验报告一【上机实验目的】要求功能与界面模拟WINDOWS记事本,支持鼠标,因为记事本功能较多,可以根据自己的能力模拟出部分功能,文本编辑这部分功能必须实现,主要利用串的知识。

二【实验环境】PC机每人1台三【上机实验内容】要求功能与界面模拟WINDOWS记事本,支持鼠标,因为记事本功能较多,可以根据自己的能力模拟出部分功能,文本编辑这部分功能必须实现,主要利用串的知识。

四【上机调试程序流程图】(注:可打印)在此程序中,主要包含了添加、插入、删除、复制、剪切、粘贴、还有文件操作。

五【上机调试中出现的错误信息、错误原因及解决办法】1、开始的时候当我输入字符的时候,总是输不进去,经过检查才知道,我忘了把字符输出到屏幕上。

2、在删除的时候,当一行删除完的时候,光标并不会上移到上一行。

然后我通过判断当这光标处的坐标减一后为零(表示这行没有字符了)的时候,然后重新读取光标,让光标显示在上一行。

3、在进行插入操作之后,移动光标会出现问题,就好像插入的字符并没有在链表当中一样。

然后我写了一个测试函数,来判断插入后链表是否满足每列的字符数不得超过80个字符。

然后让每列的字符数都在链表当中,满足要求。

六【上机调试后的源程序及还存在的问题】(注:源程序可打印)/*文本编辑器editor源代码*/#include <stdio.h>#include <conio.h>#include <bios.h>#include <math.h>#define LEFT 0x4b00 /*←:光标左移*/#define RIGHT 0x4d00 /*→:光标右移*/#define DOWN 0x5000 /*↓键:光标下移*/#define UP 0x4800 /*↑键:光标上移*/#define ESC 0x011b /*ESC键:取消菜单打开操作*/#define ENTER 0x1c0d /*回车键:换行*/#define BACK 3592 /*BackSpace键:删除当前光标位置前一个字符*/#define CL 29440 /*ctrl+←键:从右至左,选定文本*/#define CR 29696 /*ctrl+→键:从左到右,选定文本*/#define Cc 11779 /*ctrl+c键:将选定文本,复制一份到剪贴板中*/#define Cv 12054 /*ctrl+v键:将剪贴板中的内容复制到当前位置*/#define Cx 11544 /*ctrl+x键:对选定文本,执行剪切操作*/#define F1 15104 /*F1键:打开文件菜单*/#define F2 15360 /*F2键:打开编辑菜单*/#define F3 15616 /*F3键:打开帮助菜单*/int value,backup;/*value保存有值数组元素的最大下标值,backup保存value的副本,NUM保存当前行中的用户输入的字符个数*/typedef struct record{char ch; /*保存一字符*/int col, line; /*x轴和y轴坐标*/}record;record r[500]; /*定义一个有500个元素的结构体数组,保存选定的文本字符的属性*/typedef struct node /*定义保存行中的单个字符的结构*/{char ch; /*数据域:保存一字符*/struct node *next; /*指针域:指向下一个结点的指针*/}node;/*由此类型节点构成的单链表,命名为:列单链表*/typedef struct Hnode /*定义保存所有列单链表首节点的指针的结构*/{node *next; /*指向列单链表的首节点的地址*/struct Hnode *nextl; /*指向下一个节点的指针*/}Hnode;/*由此类型节点构成的单链表,命名为:行单链表*/void view(Hnode *q) /*按行显示保存在单链表中的文本字符,q为指向行单链表中第一个节点的指针*/{node *p; /*p为保存列单链表节点元素地址的指针*/clrscr(); /*清屏*//*双重循环,读取并显示保存在单链表中字符*/do{p=q->next;while(p!=NULL&&p->ch>=32&&p->ch<127&&p->ch!=13&&p->ch!=-1) /*指针p不能为空,且数据域必须为常规字符*/{putch(p->ch);/*在文本窗口中输出该字符*/p=p->next; /*指向下一个节点*/}q=q->nextl; /*指向下一个节点*/if((p->ch==13||p->ch==-1)&&q!=NULL) gotoxy(1,wherey()+1); /*若ch为回车或EOF标记,光标跳至下行的开始处*/}while(q!=NULL); /*逐行逐列显示文本字符*/}void control(int A, Hnode *Hhead){void colorview(Hnode *,int,int); /*函数声明*/int x,y,flag=0;x=wherex(); y=wherey(); /*得到当前光标的坐标值*/if((A==CL)&&(x!=1)) /*ctrl+←,当前光标不是在行首,光标移动*/gotoxy(wherex()-1,wherey());if((A==CL)&&(x==1)) /*ctrl+←,在行首*/gotoxy(abs(judge(Hhead,wherey()-1)),wherey()-1); /*judge(Hhead,wherey()-1)上一行的字符个数作为x值,光标移动*/if((A==CR)&&check(Hhead,wherey(),wherex())>0) /*ctrl+→,当前光标的右边有字符,光标移动*/{ flag=1; gotoxy(wherex()+1,wherey()); }if((A==CR)&&check(Hhead,wherey()+1,1)>0&&check(Hhead,y,x)==0) /*ctrl+→,当前光标处没有字符但下一行的第一列有字符,光标移动*/{ flag=1; gotoxy(1,wherey()+1); }if((A==CR)&&x==80) /*ctrl+→,当前光标在当前行的行尾,光标移动*/{ flag=1; gotoxy(1,wherey()+1); }if(A==CR&&flag==1) /*ctrl+→,光标已经跳至新处,将当前光标所在位置的字符的坐标和值保存在r数组中*/{r[abs(value)].col=wherex();r[abs(value)].line=wherey();r[abs(value)].ch=check(Hhead,r[abs(value)].line,r[abs(value)].col);if(r[abs(value)].ch==-1) r[abs(value)].ch=13; /*若第line行,第col列的字符为回车键,则返回-1*/value--;}if(A==CL&&(x!=1||y!=1)) /*ctrl+←,当前光标并不在窗口左上角,将当前光标所在位置的字符的坐标和值保存在r数组中*/{r[abs(value)].col=wherex();r[abs(value)].line=wherey();r[abs(value)].ch=check(Hhead,r[abs(value)].line,r[abs(value)].col);value++;}colorview(Hhead,wherex(),wherey());}/*用不同的前背景色显示选择的字符*/void colorview(Hnode *Hhead,int x,int y){int i;view(Hhead);/*重新显示所有文本字符*/for(i=0;i<abs(value);i++) /*value为数组下标*/{gotoxy(r[i].col,r[i].line);textcolor(0);textbackground(7);cprintf("%c",r[i].ch);}textcolor(7);textbackground(0);gotoxy(x,y);}int check(Hnode *Hhead,int m,int n) /*check():在单链表中检查第m行第n列位置的字符,若为常规字符,则返回该字符*/{int i;Hnode *q;node *p;q=Hhead;for(i=1;i<m;i++) /*定位至行单链表中的第m个元素*/q=q->nextl;p=q->next;/*获取第m个节点的数据域*/for(i=1;i<n;i++) /*定位至列单链表中的第n个元素*/p=p->next;if(p->ch==13) return -1; /*若第m行,第n列的字符为回车键,则返回-1*/if(p->ch>=32&&p->ch<127) return p->ch; /*若第m行,第n列的字符为常规字符,则返回该字符*/else return 0; /*若第m行,第又非常规字符,则返回0*/}int judge(Hnode *Hhead,int m) /*judge():返回第m行中的常规字符总的个数,不包括回车符*/ {Hnode *q;node *p;int i,num=0;q=Hhead;for(i=1;i<m;i++) /*定位至行单链表中的第m个元素*/q=q->nextl;if(q==NULL) return -1; /*返回-1,表示第m行不存在*/p=q->next;while(p->next!=NULL){p=p->next;num++; /*统计第m行的字符个数*/}/*行尾字符还没有判断,接下来判断行尾字符*/if(p->ch==13&&num==0) return 0; /*返回0,表示当前行只有一个回车字符*/if(p->ch>=32&&p->ch<127) return num+1; /*返回num+1,表示当前行的最后一个字符为常规字符*/if(p->ch==13&&num!=0) return num; /*返回num,表示当前行的最后一个字符为回车符,不计算在内*/else return num;/*返回num,表示当前行中只有一个字符,且没有回车符*/}int del(Hnode *Hhead,int m,int n) /*del():删除第m行,第n列位置的字符*/{Hnode *q,*q1;node *p1,*p2,*tail;int i ,j,flag=0;q=Hhead;if(n==0&&m==1) return; /*第1行,第0列不存在*/if(n==0&&m>1) /*若为第0列字符,但行必须大于1,执行向上行移处理*/{m=m-1;gotoxy(judge(Hhead,wherey()-1)+1,m);/*移至第m-1行,第76列*/flag=1; /*移位的标志置1*/}for(i=1;i<m;i++) /*定位至行单链表中的第m个元素*/q=q->nextl;p1=q->next;for(i=1;i<n-1;i++) /*定位至列单链表中的第n-1个元素*/p1=p1->next;p2=p1->next; /*p2指向列单链表中的第n个元素*/if(n==1) /*若是删除第m行第1列的字符*/{q->next=p1->next;free(p1);}else{p1->next=p2->next; /*在单链表中删除第m行第n列的元素*/free(p2);}return flag; /*返回0:表示没有换位,返回1:表示有换位*/}void insert(Hnode *Hhead,int m,int n, char a) /*第m行,第n列的位置之前一个位置,插入单字符*/{int i;Hnode *q;node *p,*p1,*p2;q=Hhead;for(i=1;i<m;i++) /*定位至行单链表中的第m个元素*/q=q->nextl;p1=q->next;for(i=1;i<n-1;i++) /*定位至列单链表中的第n-1个元素*/p1=p1->next;p=(node *)malloc(sizeof(node)); /*创建一个新的列单链表节点*/p->ch=a; /*给此节点的数据域赋值*/if(n==1) /*插入之前,若只有一个字符在行中,则插在此节点之前*/{p->next=q->next;q->next=p;}else{p->next=p1->next; /*在第m行,第n列的字符前,插入一字符*/p1->next=p;}test(Hhead,m); /*在插入新元素后,检验并处理单链表中第m行开始的元素,使其满足规则*/}/*执行insert()后,检验第n行及后面的数据,使其满足规则*/int test(Hnode *Hhead,int n){int i=0;node *p1,*p2,*tail,*temp1,*temp2;Hnode *q,*q1;q=Hhead;for(i=1;i<n;i++) /*定位至行单链表中的第n个元素*/{q=q->nextl;}tail=p1=q->next;if(p1==NULL){return ; /*若此行没有任何字符,则返回*/}while(tail->next!=NULL) /*定位至列单链表中的最后一个元素*/{tail=tail->next;}for(i=1;i<80;i++){p1=p1->next;}p2=p1->next;p1->next=NULL; /*在此行的最后一个字符的前一个字符处断行,因为插入在此行插入了一个新的字符*/if(tail->ch!=13) /*若此行行尾不是回车键*/{if(q->nextl==NULL)/*若p1的数据域为回车符且行单链表中只有n个节点*/{q1=(Hnode *)malloc(sizeof(Hnode));q1->nextl=NULL;q1->next=p2; /*新行单链表节点保存此行多出的字符*/q->nextl=q1;}else{q=q->nextl;tail->next=q->next;/*将多出的字符与下一行的字符相连*/q->next=p2;test(Hhead,++n);}}else{q1=(Hnode *)malloc(sizeof(Hnode));q1->nextl=q->nextl;q1->next=p2;q->nextl=q1;}}/*从任意文本文件中读取文件内容,保存至行单链表和列单链表形式的数据结构中*/void opens(Hnode *Hp){FILE* fp;Hnode *q11,*q22;node *p11,*p22,*hp;char temp;int count=0,flags=1;char filename[10]; /*保存文件名*/clrscr();/*清屏*/printf("Enter infile name,for example [c:\\wb.txt]:");/*输入文件名格式*/scanf("%s",filename); /*输入文件名*/fp=fopen(filename,"r");/*以只读方式打开文件,filename必须要存在*/if(fp==NULL)/*打开文件失败*/{textbackground(2);textcolor(13);cprintf("open file error!");getchar();exit(0) ;}q11=Hp;while(!feof(fp)){count=0;flags=1;q22=(Hnode *)malloc(sizeof(Hnode));/*新建一个行单链表中的节点*/p11=(node *)malloc(sizeof(node)); /*新建一个列单链表中的节点*/while((temp=fgetc(fp))!=10&&count<=80&&!feof(fp)) /*循环结束,表示在单链表中一行处理完毕,开始新行*/{p22=(node *)malloc(sizeof(node));/*新建一个列单链表中的节点*/if(flags==1){hp=p22;flags=0;} /*hp保存列单链表中的首节点的地址*/p22->ch=temp;p22->next=NULL;p11->next=p22;p11=p22;count++;}if(temp==10){ /*若为换行符,将其转换为回车符,因为在程序中,是按回车符处理的*/ p22=(node *)malloc(sizeof(node));p22->ch=13;p22->next=NULL;p11->next=p22;p11=p22;}if(!feof(fp))/*若没此条件,文件最后一行会处理两次.*/{q22->next=hp;q22->nextl=NULL; /*将存储了字符的新列单链表与行单链表中的新节点建立关联*/q11->nextl=q22;q11=q22;}fclose(fp);Hp=Hp->nextl;/*因为Hp的所在节点的数据域为空,所以Hp=Hp->nextl*/return ;}/*将head所指的行单链表中所指的各个列单链表中的数据域的值写入文件,文件路径和文件名由用户指定*/void save(Hnode *head){FILE* fp;Hnode *q;node *p;char filename[10]; /*保存文件名*/q=head;clrscr();/*清屏*/printf("Enter infile name,for example [c:\\wb.txt]:");/*输入文件名格式*/scanf("%s",filename); /*输入文件名*/fp=fopen(filename,"w");if(fp==NULL) /*打开文件失败*/{printf("\n=====>open file error!\n");getchar();return ;}do{p=q->next; /*指向node类型的数据*/while(p!=NULL){if((int)p->ch==13)/*把回车转化为换行符*/{fputc('\n',fp);p=p->next;}else{fputc(p->ch, fp);p=p->next;}}q=q->nextl;}while(q!=NULL);fclose(fp); /*关闭此文件*/return ;void main(){char a;int i,A,x,y,flag=0,b,t;Hnode *Hhead,*q;node *p1,*p2;Hhead=q=(Hnode *)malloc(sizeof(Hnode)); /*为行单链表中首节点分配内存空间*/q->nextl=NULL;q->next=p1=p2=(node *)malloc(sizeof(node));p1->ch=13;p1->next=NULL;while(1){while(bioskey(1)==0) continue; /*等待用户按键*/a=A=bioskey(0); /*返回输入的字符的键值*/if(a>=32&&a<127) /*若输入为常规字符*/{if(check(Hhead,wherey(),wherex())<=0)/*当前位置没有字符且输入是常规字符,则执行添加字符操作*/{p2->ch=a;putch(a);if(wherex()-1==80){q->nextl=(Hnode *)malloc(sizeof(Hnode));q=q->nextl;q->nextl=NULL;q->next=NULL;p1=p2=q->next=(node *)malloc(sizeof(node));p1->ch=13;p1->next=NULL;gotoxy(1,wherey()+1);}else{p2->next=(node *)malloc(sizeof(node));p2=p2->next;p2->ch=13;p2->next=NULL;}}else /*当前位置有字符且输入是常规字符,则执行插入字符操作*/{x=wherex();y=wherey();insert(Hhead,wherey(),wherex(),a);view(Hhead);gotoxy(x+1,y);}}if(a==13){gotoxy(1,wherey()+1);q->nextl=(Hnode *)malloc(sizeof(Hnode));q=q->nextl;q->nextl=NULL;q->next=NULL;p1=p2=q->next=(node *)malloc(sizeof(node));p1->ch=13;p1->next=NULL;}x=wherex(); y=wherey();/*文本窗口中左移,当前光标不在窗口的第1列*/if((A==LEFT)&&(x!=1))gotoxy(wherex()-1,wherey());/*文本窗口中左移,当前光标在窗口的第1列*/if((A==LEFT)&&(x==1))gotoxy(abs(judge(Hhead,wherey()-1)),wherey()-1);/*文本窗口中右移,若当前光标的右边一位有字符*/if((A==RIGHT)&&check(Hhead,wherey(),wherex())>0)gotoxy(wherex()+1,wherey());/*文本窗口中右移至下行的第1列,若当前光标位置没有字符且下行的第1列有字符*/if((A==RIGHT)&&check(Hhead,wherey()+1,1)!=0&&check(Hhead,y,x)<=0)gotoxy(1,wherey()+1);/*右移*/if((A==RIGHT)&&x==80)gotoxy(1,wherey()+1);/*上移*/if((A==UP)&&check(Hhead,wherey()-1,wherex())!=0)gotoxy(wherex(),wherey()-1);/*下移*/if((A==DOWN)&&check(Hhead,wherey()+1,wherex())!=0) gotoxy(wherex(),wherey()+1);/*处理BackSpace键*/if(A==BACK) /*处理BackSpace键*/{flag=del(Hhead,wherey(),wherex()-1);x=wherex()-1;y=wherey();view(Hhead);if(flag==0){gotoxy(x,y);}if(flag==1){gotoxy(x+1,y);flag=0;}}/*处理Ctrl+x按键*//*处理Ctrl+x按键*/if(A==Cx&&value!=0){if(value>0){x=wherex();y=wherey();}Else{x=r[0].col;y=r[0].line;}for(i=0;i<abs(value);i++)del(Hhead,r[i].line,r[i].col);backup=value; /*保存r数组的有值元素的最大下标值*/value=0; /*此value为全局变量*/view(Hhead);gotoxy(x,y);}/*处理Ctrl+c按键*/if(A==Cc&&value!=0){x=wherex();y=wherey();backup=value;value=0; /*此value为全局变量*/view(Hhead);gotoxy(x,y);}/*处理Ctrl+v按键*/if(A==Cv&&backup!=0){x=wherex();y=wherey();if(backup<0) /*Ctrl+右移键选定的文本,贴切此当前位置*/ for(i=0;i<abs(backup);i++)insert(Hhead,y,x+i,r[i].ch);/*逐个插入*/ if(backup>0) /*Ctrl+左移键选定的文本,贴切此当前位置*/ for(i=0;i<backup;i++)insert(Hhead,y,x+i,r[backup-1-i].ch);view(Hhead);gotoxy(x,y);}/*处理Ctrl+左移键或右移键*/if(A==CL||A==CR) control(A,Hhead);if(A==F1){clrscr();/*清屏*/main();} /*新建文件*/if(A==F3){ /*打开文件*/Hhead=(Hnode *)malloc(sizeof(Hnode));opens(Hhead);getchar();clrscr();view(Hhead);}/*保存文件*/if(A==F2){save(Hhead);clrscr();cprintf("save successfully!");getch();view(Hhead);}}}七【上机实验中的其他它问题及心得】此编辑器主要采用的是用链表的作为他的存储结构,此编辑器用了三个结构体来分别存储行(主要作用是存储列单链表的首地址)、每列的字符还有存储复制、剪切的字符。

数据结构课程设计实验报告 完整版

数据结构课程设计实验报告 完整版

第一章链表的应用线性表是数据结构中最简单、最常用的一种线性结构,也是学习数据结构全部内容的基础,其掌握的好坏直接影响着后继课程的学习。

线性表的顺序存储结构,即顺序表的概念相对比较简单,因此,本章的主要任务是使用有关单链表的操作来实现通讯录信息系统的管理。

1.1设计要求本章的设计实验要求使用有关链表的操作来实现通讯录信息系统的管理。

为了验证算法,通讯录管理包括单通讯录链表的建立、通讯者的插入、通讯者的删除、通讯者的查询及通讯录表的输出等。

主控菜单的设计要求使用数字0—5来选择菜单项,其他输入则不起作用。

程序运行后,给出6个菜单项的内容和输入提示:1.通讯录链表的建立2. 通讯者结点的插入3. 通讯者结点的查询4. 通讯者结点的删除5. 通讯录链表的输出0. 退出管理系统请选择0—5:1.2设计分析1.2.1主控菜单函数设计分析1.实现循环和功能选择首先编写一个主控菜单驱动程序,输入0—5以进入相应选择项。

假设输入选择用变量sn存储,它作为menu_select函数的返回值给switch语句。

使用for循环实现重复选择,并在主函数main()中实现。

实际使用时,只有选择大于5或小于0的值,程序才能结束运行,这就要使用循环控制。

这里使用for循环语句实现菜单的循环选择,为了结束程序的运行,使用了“return”语句,也可以使用“exit(0);”语句。

2.得到sn的合理值如前所述,应该设计一个函数用来输出提示信息和处理输入,这个函数应该返回一个数值sn,以便供给switch语句使用。

假设函数名为menu_select,对于sn的输入值,在switch 中case语句对应数字1—5,对于不符合要求的输入,提示输入错误并要求重新输入。

将该函数与主函数合在一起,编译运行程序,即可检查并验证菜单选择是否正确。

1.2.2功能函数设计分析1.建立通讯录链表的设计这里实际上是要求建立一个带头结点的单链表。

建立单链表有两种方法,一种称之为头插法,另一种称为尾插法。

数据结构课程设计_中文文本编辑(文本删除、修改、查询、统计、添加)

数据结构课程设计_中文文本编辑(文本删除、修改、查询、统计、添加)

数据结构课程设计:文本编辑(最后附完整代码)一.问题描述---------------------------------------------1二.设计思路---------------------------------------------1三.系统实现功能1.建立单链表-------------------------------------------22.显示文章内容---------------------------------------- 33.查找文章语句-----------------------------------------34.删除文章语句-----------------------------------------55.替换文章语句-----------------------------------------76.统计文章字数-----------------------------------------107.写入文本结束程序--------------------------------------10四.系统不足及需改进分------------------------------------11五.文件清单说明------------------------------------------11六:附录-------------------------------------------------12一:问题描述本次我所做的课程设计为:文本编辑,主要内容是对中文文本的显示、查找、删除、替换、统计、写入文本。

在程序选择功能后根据提示,输入任意长度中文语句即可对文章进行操作。

二:设计思路文本编辑,顾名思义就是对一遍文章进行编辑,我所设计的是对中文的编辑。

中文有两个字节(汉字、标点),通常情况下通过文件输入流仅仅可以取一个字节或者是以空格为分隔符取单词这仅仅对英文的文章适用,周六周日我从网上搜索相关方法,未找到一条切实可用的对中文字符操作的方法。

Vwwuor数据结构课程设计—文章编辑设计报告

Vwwuor数据结构课程设计—文章编辑设计报告

生命是永恒不断的创造,因为在它内部蕴含着过剩的精力,它不断流溢,越出时间和空间的界限,它不停地追求,以形形色色的自我表现的形式表现出来。

--泰戈尔文章编辑——冯岳良20080573 一、需求分析功能:输入一页文字,程序可以统计出文字、数字、空格的个数。

静态存储一页文章,每行最多不超过80个字符,共N行;要求:(1)分别统计出其中英文字母数和空格数及整篇文章总字数;(2)统计某一字符串在文章中出现的次数,并输出该次数;(3)删除某一子串,并将后面的字符前移。

存储结构使用线性表,分别用几个子函数实现相应的功能;输入数据的形式和范围:可以输入大写、小写的英文字母、任何数字及标点符号。

输出形式:(1)分行输出用户输入的各行字符;(2)分4行输出"全部字母数"、"数字个数"、"空格个数"、"文章总字数"(3)输出删除某一字符串后的文章;二、概要设计1、定义结构体 struct line,文本行采用顺序存储,行与行之间采用链式存储开始主函数输入文字统计个数查找某一子串输出文字统计字母、数字、空删除这一子串格、某一字符串的个数以及文章总字数输出删除后的文章具体操作2、主要函数:int FindString(LINE * &head,char *str) /*统计str在文章中出现的次数*/ 求在一行中Str出现的次数的流程图:①.查找第一个字符,如果有第一个字符即p->data[i]==str[0],设计数器k=0 ②.查找这个字符后面的字符与要查找的字符串是否匹配即p->data[i+j]==str[j],如果匹配k++③.重复第二步,如果k=len2,则查找到,count++;如果没查找到,重新进行第一步void delstringword(char *s,char *str) /*删除字符串*s 中的字符串*str*/开始count=0;h=0;len1=0; len2=strlen(str);p->data[i]==str[0]i++k=0;j=0;p->data[i+j]==str[j]k++;j++;k=len2count++; i=i+k-1;结束YNYNNY实现思想:①.从字符串s 中寻找str 第一次出现的位置 *p=strstr(s,str);②.len=strlen(s);i=len-strlen(p)即前i 项恰好不含要删除的字符串,将前i 项复制到tmp 中 ③.j=i+strlen(str) 即要删除的字符串在i+1和j 之间,将j 之后的字符串复制到tmp 中④.将tmp 赋给串s ,返回s三、详细设计:#include<iostream.h> #include <string.h>#include <stdio.h> /*文本每行以字符串形式存储,行与行之间以链表存储*/ typedef struct line {char *data; struct line *next;}LINE; /*创建一链表,同时向里面输入文本数据*/ void Create(LINE * &head) {printf ("请输入一页文章,以Ctrl+E(^E)为结尾(每行最多输入80字符!):\n");LINE *p=new LINE; /*首先为链表 建立一个附加表头结点*/ head=p; /*将p 付给 表头指针*/ char tmp[100]; while(1) {gets(tmp); /*输入字符串!*/ if(strlen(tmp)>80) {printf("每行最多输入80字符");str pi jsfor(m=0;m<i;m++) tmp[count++]=s[m];for(n=j;n<len;n++) tmp[count++]=s[n];tmp}if(tmp[0]==5)break; /*如果发现输入 ^E,则退出输入*/ p=p->next=new LINE;p->data=new char[strlen(tmp)+1]; /*为结点分配空间 */ strcpy(p->data,tmp);if(tmp[strlen(tmp)-1]==5) /*除去最后一个控制符 ^E */{p->data[strlen(tmp)-1]='\0';break;}}p->next=NULL; /*最后的一个指针为空 */head=head->next;}/*统计字母数*/int CountLetter(LINE * &head){LINE *p=head;int count=0;do{int Len=strlen(p->data); /*计算当前 data 里的数据元素的个数*/for(int i=0;i<Len;i++)if((p->data[i]>='a'&&p->data[i]<='z')||(p->data[i]>='A'&&p->data[i]<='Z')) /*计算字母数*/count++;}while((p=p->next)!=NULL); /*遍历链表*/return count; /*返回文章的字母总数*/}/*统计数字数*/int CountNumber(LINE * &head){LINE *p=head;int count=0;do{int Len=strlen(p->data); /*计算当前 data 里的数据元素的个数*/for(int i=0;i<Len;i++)if(p->data[i]>=48 && p->data[i]<=57)count++;/*计算数字数,ASCII码*/}while((p=p->next)!=NULL); /*遍历链表*/}/*统计空格数*/int CountSpace(LINE * &head){LINE *p=head;int count=0;do{int Len=strlen(p->data); /*计算当前 data 里的数据元素的个数*/ for(int i=0;i<Len;i++)if(p->data[i]==32)count++; /*计算空格数,空格ASCII码为32*/ }while((p=p->next)!=NULL); /*遍历链表*/return count;}/*统计文章的总字数*/int CountAll(LINE * &head){LINE *p=head; /*保存链表的首地址*/int count=0;do /*计算总字符数*/{count+=strlen(p->data);}while((p=p->next)!=NULL); /*遍历链表*/return count;}/*统计str在文章中出现的次数*/int FindString(LINE * &head,char *str){LINE *p=head;int count=0;int h=0;int len1=0; /*保存当前行的总字符数*/ int len2=strlen(str); /*待统计字符串的长度*/ int i,j,k;do{len1=strlen(p->data); /*当前行的字符数*/for(i=0;i<len1;i++) /*字符匹配*/{if(p->data[i]==str[0]){k=0;for(j=0;j<len2;j++)if(p->data[i+j]==str[j]) k++;if(k==len2) {count++;i=i+k-1;}}}}while((p=p->next)!=NULL); /*遍历链表*/return count;}/*删除指定的字符串*/void delstringword(char *s,char *str)/* *s为输入的字符串,*str为将要删除的字符*/{char *p=strstr(s,str); /*从字符串s中寻找str第一次出现的位置*/char tmp[80];int len=strlen(s);int i=len-strlen(p);int j=i+strlen(str);int count=0;for(int m=0;m<i;m++)tmp[count++]=s[m];for(int n=j;n<len;n++)tmp[count++]=s[n];tmp[count]='\0';strcpy(s,tmp); /*返回新的字符串*/}void DelString(LINE * &head,char *str){LINE *p=head;do{if(strstr(p->data,str)!=NULL)delstringword(p->data,str);}while((p=p->next)!=NULL); /*遍历链表*/}/*向屏幕输出文章*/void OutPut(LINE * &head){LINE *p=head;do{printf("%s\n",p->data);}while((p=p->next)!=NULL); /*遍历链表*/}void main(){LINE *head;Create(head);printf("输入的文章为:\n");OutPut(head);printf("\n");printf("全部字母数:%d \n",CountLetter(head));printf("数字个数:%d \n",CountNumber(head));printf("空格个数: %d \n",CountSpace(head));printf("文章总字数: %d \n",CountAll(head));char str1[20],str2[20];printf("\n");printf("请输入要统计的字符串:");scanf("%s",str1);printf("%s出现的次数为:%d \n",str1,FindString(head,str1)); printf("\n");printf("请输入要删除的某一字符串:");scanf("%s",str2);DelString(head,str2);printf("删除%s后的文章为:\n",str2);OutPut(head);}四、调试分析:1.测试数据及结果2、问题思考:输入文章时,计算机怎样识别文章是否结束?输出文章时,怎样处理表示结束的字符?解决方案:输入文章时,以Ctrl+E(^E)为结尾,当tmp[0]==5时,发现输入^E,则退出输入。

数据结构-课程设计--简易文本编辑器

数据结构-课程设计--简易文本编辑器

《数据结构》课程设计班级: 10计本2班姓名:邓寅森学号: 2010305202指导教师:杨老师完成日期: 2011年12月计算机科学与技术系课程设计评分表课程名称: 数据结构 简易文本编辑器教师签名:日期:一、需求分析1.1 问题描述传统的纸质文档已经不能满足大家的需求,有容易丢失、查找不方便等缺点。

计算机信息管理为人们的生活、工作提供了方便,提高了效率。

“简易文本编辑器”是为了帮助老师、同学或其他一些需要使用文本编辑的人员进行管理和分析的一种计算机应用程序。

1.2 基本任务通过用户调查分析及实际需求,系统需要实现如下基本任务:(1)输入数据信息建立文本;(2)查询文本中满足要求的信息;(3)插入新的信息到文本中;(4)删除不再需要的文本信息;(5) 查看所有的文本信息。

二、概要设计为了完成需求分析的基本任务,主要从以下3个方面进行设计:2.1 主界面设计为了实现简易文本编辑器的各项功能,设计了一个含有多个菜单项的主控菜单模块以操作系统的各项功能,以方便用户使用系统。

系统进入菜单运行界面如图所示:简易文本编辑器主菜单2.2 数据结构设计系统采用线性表的顺序存储结构表示和存储“简易文本编辑器”中的信息。

实现文本的输入,删除,插入,查找,显示功能。

2.3 系统功能设计运行程序,提示进入菜单,按“回车键”进入主菜单,再可以在主菜单上进行各项操作。

每次进入菜单,选择“1键”新建文本,然后才可以进行其他操作,或者按“0键”选择退出。

三、模块设计3.1 模块设计系统主要包含主程序模块和其它操作模块。

其调用关系如图所示。

模块调用示意图3.2 系统子模块及其功能设计本系统共设计了16个子模块,各程序的函数名及功能说明如下:1、/*由模式串nextval值*/void GetNextval(SqVString T,int nextval[])2、/*模式匹配KMP算法*/int KMPIndex(SqVString S,int pos,int next[],SqVString T)3、/*初始化串*/void InitString(SqVString *S,char *str)4、/*串插入*/int StrInsert(SqVString *S,int pos,SqVString T)5、/*串删除*/int StrDelete(SqVString *S,int pos,int len)6、/*求子串*/int SubStr(SqVString S,int pos,int len,SqVString *T)7、/*串连接*/int Concat(SqVString *S,SqVString T)8、/*串赋值*/int StrAssign(SqVString *S,char *value)9、void InputString() //新建10、void DeleteString()//删除11、void DeleteSubstring()//删除12、void InsertSubstring()//查找13、void DisplayString()//显示14、void cd()//进入界面15、void ts()//主菜单16、void tc()//退出3.3 系统模块之间的调用关系系统的16个子模块之间的主要调用关系所示:系统函数调用关系图四、详细设计4.1 数据结构设计系统采用线性表的顺序存储结构存储通讯录信息。

数据结构课程设计之文本编辑器

数据结构课程设计之文本编辑器

##大学数据结构课程设计报告题目:简易文本编辑器院(系):计算机工程学院学生姓名:班级:学号:____起迄日期: 2011年6月20日至2011年6月30日指导教师:2010—2011年度第 2 学期一、需求分析1.问题描述:简易文本编辑器主要是针对文字编辑处理,对于如何编辑一个简易文本编辑器程序我们可以利用线性表示实现其功能,线性表便于插入删除查找功能,而文本编辑器需要用到这些功能,因此可以利用线性表实现。

对于文本编辑器应该具有插入、删除、查找等功能,并且可以显示所有输入数据,可正确存盘、取盘,正确显示编辑的文字长度。

2.基本功能:简易文本编辑器应该具有的功能:图形菜单界面:位置查找:数据查找:显示所有输入数据:插入:删除文本信息:可正确存盘、取盘:正确显示长度:3.输入输出:输入数据,数据类型为整形,且输入的字符或数字不多于100个,输出为输出输入的数据,输出输入数据的长度,输出插入元素及插入后的数据,输出查找元素的,输出的数据均为整形。

二、概要设计1.设计思路:首先构造一个线性表, 然后利用线性表的存储结构顺序存储方式,实现文本的编辑添加查找删除.2.数据结构设计:程序采取了线性结构利用顺序存储的方法,采用该结构的原因是线性表利于存储、插入、删除、查找、修改等功能,使用它可以使程序运行简单方便。

定义程序中用到的抽象数据类型;抽象数据类型线性表的定义如下:ADT SqList{数据对象:D={ai | ai∈data,i=1,2,3……,n,n≥0}数据关系:R1={<ai-1,ai>| ai-1,ai∈D,i=1,2,3,……,n}基本操作:InitList(*L)操作结果:构造一个空的线性表L。

GetLength(L)初始条件:线性表L已存在。

操作结果:返回L中数据元素的个数。

GetElem( L, i,*e)初始条件:线性表L已存在,1≤i≤L.Length.操作结果:查找指定的某元素i,并将值赋给e,用e 输出。

数据结构课程设计实验报告

数据结构课程设计实验报告

《数据结构》课程设计任务书学期:12-13-1 班级:软件111一、设计目的《数据结构》是一门实践性较强的软件基础课程,为了学好这门课程,必须在掌握理论知识的同时,加强上机实践。

本课程设计的目的就是要达到理论与实际应用相结合,使同学们能够根据数据对象的特性,学会数据组织的方法,能把现实世界中的实际问题在计算机内部表示出来,并培养基本的、良好的程序设计技能。

二、设计要求1、通过这次设计,要求在数据结构的逻辑特性和物理表示、数据结构的选择应用、算法的设计及其实现等方面加深对课程基本内容的理解。

同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。

2、学生必须仔细研读《数据结构》课程设计(实习)要求,以学生自学为主、指导教师指导为辅,认真、独立地完成课程设计的任务,有问题及时主动与指导教师沟通。

3、本次课程设计按照教学要求需要在三周时间内独立完成,学生要发挥自主学习的能力,充分利用时间,安排好课设的时间计划,并在课设过程中不断检测自己的计划完成情况,及时地向指导教师汇报。

4、编程语言任选。

三、设计选题说明:课程设计题目主要分为两大类:,主要是验证性题,少数是简单的综合性题,侧重考查学生对数据结构课程中重要数据结构和算法的理解与掌握程度,相对较简单;本类题目选题要求:要求个人所选题目必须独立完成;原则上不得参考别人的程序,若个人能力有限必须参考,参考成分不得超过30%,其中参考部分自己必须能消化吸收,否则视为无效;为培养学生分析问题、解决问题的实际动手能力和团队协作能力,鼓励有能力的学生尽可能选作难度较高的题目,故仅选作一星题目的学生,无论完成多少题目,原则上最高分不超出70分;仅选作一星和二星题目的学生,无论完成多少题目,原则上最高分不超出85分注意:上述题目,可以相互讨论,但严禁搭便车,杜绝拷贝或分享别人的劳动果实,坚决杜绝让别人代做。

一经发现、核实,无论是拷贝者或是被拷贝者的成绩均视为不及格,情节严重者将交由学工办通报批评并受到相应的纪律处分。

文章编辑数据结构课程设计报告书

文章编辑数据结构课程设计报告书

理工大学《数据结构》课程设计报告学院专业班级学号学生指导教师课程成绩完成日期课程设计成绩评定学院专业班级学号学生指导教师完成日期指导教师对学生在课程设计中的评价课程设计任务书计算机与通信工程学院软件工程专业文章编辑学生:旖指导老师:倩诒摘要本课程设计主要解决了基本的文章编辑问题。

对于一页按要求输入到程序执行窗口的文章,静态存储结构使用线性表中,分别完成统计文章总字符数、文章中空格个数、文章中英文字母数、统计文章中英文字母数的操作和文章中某一字符串的出现的次数,并输出该次数;除以上的统计操作,还实现删除文章中指定字符串,并且将删除字符串后面的字符前移,再保存为编辑后的文章。

关键字静态存储;线性表;编辑;字符串目录1.引言 (1)1.1课程设计意义 (1)1.2课程设计目的 (1)1.3课题要求 (1)2.设计思路与方案 (2)2.1函数流程 (2)2.2功能函数 (4)3.详细实现 (5)3.1数据结构设计 (5)3.2功能函数设计 (5)3.3函数分析 (6)4.运行环境与结果 (12)4.1运行环境 (12)4.2运行结果 (12)5.结束语 (16)6.参考文献 (17)7.附录 (18)代码清单 (18)1引言1.1课程设计意义在实践教学中,课程设计是一个重要环节,它以某一课程为基础,可以涉及和课程相关的各个方面,是一门独立于课程之外的特殊课程。

课程设计是让同学们对所学的课程更全面的学习和应用,理解和掌握课程的相关知识。

数据结构[1]是一门重要的专业基础课,是计算机理论和应用的核心基础课程。

数据结构课程设计,要求学生在数据结构的逻辑特性和物理表示、数据结构的选择和应用、算法的设计[2]及其实现等方面,加深对课程基本容的理解[3]。

同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。

1.2课程设计目的1.提高对数据逻辑结构[4]的特点以及存储表示方式的认识,培养在具体应用中选择合适的数据结构和存储结构的能力。

数据结构课程设计实验报告

数据结构课程设计实验报告

数据结构课程设计实验报告
1. 实验背景和目的,首先,我会介绍实验的背景和目的,包括这个实验在整个数据结构课程中的重要性和意义,以及实验的具体目标和要解决的问题。

2. 实验内容和方法,接着,我会详细描述实验的具体内容和方法,包括所涉及到的数据结构类型,算法设计和实现过程,以及实验中所用到的工具和技术。

3. 实验结果和分析,然后,我会展示实验的结果和数据分析,包括对实验结果的定量和定性分析,以及对实验过程中遇到的问题和挑战的解决方法和思考。

4. 总结和展望,最后,我会对整个实验进行总结和展望,包括对实验过程中的经验和教训的总结,以及对未来可能的改进和扩展方向的展望。

以上是我对数据结构课程设计实验报告的回答和讨论,希望能够全面和完整地回答你的问题。

如果还有其他方面需要补充或者深入讨论的地方,请随时告诉我。

数据结构课程设计报告-文本编辑器参考模板

数据结构课程设计报告-文本编辑器参考模板

《数据结构》课程设计报告题目:基于顺序结构的文本编辑器的设计专业:计算机科学与技术班级:姓名:学号:指导教师:成绩:2014-2015学年第一学期目录1课程设计内容 (1)1.1 设计内容 (1)1.2 设计任务 (1)1.3 具体要求 (1)2 概要设计 (1)2.1 系统的功能简介 (1)2.2 各个模块之间的主要关系 (2)3 设计过程及代码分析 (2)4 设计结果与分析 (15)5 源程序 (16)6 总结 (24)7 致谢 (24)8 参考文献 (25)1 课程设计内容1.1 设计内容《文本编辑器》主要根据课程设计要求进行设计的,本次课程设计的内容及要求是设计一个文本编辑器,能实现文本内容输入、显示、统计、处理、保存和退出文本编辑器等基本功能,主界面具有图形菜单界面、输入文本、打开文件、显示当前文本内容、进入文本内容统计菜单、进入文本内容处理菜单、保存、退出文本编辑器。

其中文本内容统计菜单包含大小写字母、数字、标点符号、空格、所有字符的统计;文本内容处理菜单包含查找、删除文章中的字符或者字符串,向文章中插入字符或者字符串,从文章中复制字符或者字符串,修改行内容,替换字符或者字符串。

1.2 设计任务主要利用C语言的文件操作能力设计一个简单的文本编辑器,对于文本编辑器来说,数据结构相对简单,使用一个有较大长度的顺序表即可,在程序中可采用一维数组来实现。

使用数组表示的顺序表来存储文本具有简洁、访问方便、输出方便等特点。

1.3 具体要求明确课程设计的目的,能根据课程设计的要求,查阅相关文献,为完成设计准备必要的知识;提高学生用数据结构进行程序设计的能力,重点提高用C语言进行文件操作和绘图应用的编程技术水平;初步了解软件开发的一般方法和步骤;提高撰写技术文档的能力。

2 概要设计2.1 系统的功能简介该系统的主要功能是实现文本内容输入、显示、统计、处理、保存。

首先,输入文本内容并保存;选择打开文件,打开刚才保存的文件;选择显示当前文章内容,可以预览文件内容;进入文章内容统计菜单,可以对文章中大写字母、小写字母、数字、标点符号、空格、所有字数的统计;进入文章内容处理菜单,查找、删除文章中的字符或者字符串,向文章中插入字符或者字符串,从文章中复制字符或者字符串,修改行内容,替换字符或者字符串。

数据结构实验报告(实验)

数据结构实验报告(实验)

深 圳 大 学 实 验 报 告课程名称: 数据结构实验与课程设计 实验项目名称: 实验一:顺序表的应用 学院: 计算机与软件学院 专业: 指导教师: **报告人: 文成 学号: ********** 班级: 5 实验时间: 2012-9-17实验报告提交时间: 2012-9-24教务部制一、实验目的与要求:目的:1.掌握线性表的基本原理2.掌握线性表地基本结构3.掌握线性表地创建、插入、删除、查找的实现方法要求:1.熟悉C++语言编程2.熟练使用C++语言实现线性表地创建、插入、删除、查找的实现方法二、实验内容:Problem A: 数据结构——实验1——顺序表例程Description实现顺序表的创建、插入、删除、查找Input第一行输入顺序表的实际长度n第二行输入n个数据第三行输入要插入的新数据和插入位置第四行输入要删除的位置第五行输入要查找的位置Output第一行输出创建后,顺序表内的所有数据,数据之间用空格隔开第二行输出执行插入操作后,顺序表内的所有数据,数据之间用空格隔开第三行输出执行删除操作后,顺序表内的所有数据,数据之间用空格隔开第四行输出指定位置的数据Sample Input611 22 33 44 55 66888 352Sample Output11 22 33 44 55 6611 22 888 33 44 55 6611 22 888 33 55 6622HINT第i个位置是指从首个元素开始数起的第i个位置,对应数组内下标为i-1的位置Problem B: 数据结构——实验1——顺序表的数据交换Description实现顺序表内的元素交换操作Input第一行输入n表示顺序表包含的·n个数据第二行输入n个数据,数据是小于100的正整数第三行输入两个参数,表示要交换的两个位置第四行输入两个参数,表示要交换的两个位置Output第一行输出创建后,顺序表内的所有数据,数据之间用空格隔开第二行输出执行第一次交换操作后,顺序表内的所有数据,数据之间用空格隔开第三行输出执行第二次交换操作后,顺序表内的所有数据,数据之间用空格隔开注意加入交换位置的合法性检查,如果发现位置不合法,输出error。

数据结构课程实验报告

数据结构课程实验报告

数据结构课程实验报告目录1. 实验简介1.1 实验背景1.2 实验目的1.3 实验内容2. 实验方法2.1 数据结构选择2.2 算法设计2.3 程序实现3. 实验结果分析3.1 数据结构性能分析3.2 算法效率比较3.3 实验结论4. 实验总结1. 实验简介1.1 实验背景本实验是数据结构课程的一次实践性操作,旨在帮助学生加深对数据结构的理解和运用。

1.2 实验目的通过本实验,学生将学会如何选择合适的数据结构来解决特定问题,了解数据结构与算法设计的关系并能将其应用到实际问题中。

1.3 实验内容本实验将涉及对一些经典数据结构的使用,如链表、栈、队列等,并结合具体问题进行算法设计和实现。

2. 实验方法2.1 数据结构选择在实验过程中,需要根据具体问题选择合适的数据结构,比如针对需要频繁插入删除操作的情况可选择链表。

2.2 算法设计针对每个问题,需要设计相应的算法来实现功能,要考虑算法的效率和实际应用情况。

2.3 程序实现根据算法设计,编写相应的程序来实现功能,并进行调试测试确保程序能够正确运行。

3. 实验结果分析3.1 数据结构性能分析在实验过程中,可以通过对不同数据结构的使用进行性能分析,如时间复杂度和空间复杂度等,以便选择最优的数据结构。

3.2 算法效率比较实验完成后,可以对不同算法在同一数据结构下的效率进行比较分析,找出最优算法。

3.3 实验结论根据实验结果分析,得出结论并总结经验教训,为后续的数据结构和算法设计提供参考。

4. 实验总结通过本次实验,学生将对数据结构与算法设计有更深入的了解,并能将所学知识应用到实际问题中,提高自己的实践能力和解决问题的能力。

国开数据结构(本)数据结构课程实验报告(一)

国开数据结构(本)数据结构课程实验报告(一)

国开数据结构(本)数据结构课程实验报告一、实验目的本实验旨在帮助学生掌握数据结构的基本概念,熟练掌握数据结构的基本操作,进一步提高学生的编程能力和数据处理能力。

二、实验内容1. 数据结构的基本概念在实验中,我们首先介绍了数据结构的基本概念,包括数据的逻辑结构和物理结构,以及数据结构的分类和应用场景。

2. 数据结构的基本操作接着,我们介绍了数据结构的基本操作,包括插入、删除、查找等操作,通过具体的案例和代码演示,让学生理解和掌握这些基本操作的实现原理和方法。

3. 编程实践在实验的第三部分,我们组织学生进行数据结构的编程实践,要求学生通过实际编写代码来实现各种数据结构的基本操作,加深对数据结构的理解和掌握。

三、实验过程1. 数据结构的基本概念在本部分,我们通过课堂讲解和案例分析的方式,向学生介绍了数据结构的基本概念,包括线性结构、树形结构、图形结构等,让学生对数据结构有一个整体的认识。

2. 数据结构的基本操作在这一部分,我们通过具体的案例和代码演示,向学生介绍了数据结构的基本操作,包括插入、删除、查找等操作的实现原理和方法,让学生掌握这些基本操作的具体实现。

3. 编程实践最后,我们组织学生进行数据结构的编程实践,要求他们通过实际编写代码来实现各种数据结构的基本操作,加深对数据结构的理解和掌握,同时也提高了他们的编程能力和数据处理能力。

四、实验结果与分析通过本次实验,学生们对数据结构有了更深入的理解和掌握,他们能够熟练地使用各种数据结构的基本操作,编写出高效、稳定的代码,提高了他们的编程能力和数据处理能力。

五、实验总结本实验对于学生掌握数据结构的基本概念和操作起到了很好的辅助作用,通过实际的编程实践,学生们不仅加深了对数据结构的理解和掌握,同时也提高了他们的编程能力和数据处理能力。

这对于他们今后的学习和工作都具有重要的意义。

六、参考文献1. 《数据结构与算法分析》2. 《数据结构(C语言版)》3. 《数据结构与算法》以上是我对“国开数据结构(本)数据结构课程实验报告”的详细报告,希望能够满足您的要求。

《数据结构》课程设计报告

《数据结构》课程设计报告

《数据结构》课程设计报告《数据结构》课程设计报告如下:一、课程设计分析在学习了数据结构课本理论知识后,为了检验自己所学知识的牢固性巩固大家的理论知识,调动大家的编程兴趣;同时为大家提供一个实践自己,检验自己的平台,以增加大家对将来工作的适应能力;也为了锻炼大家的动手实践能力,遂在学期末进行了本次课程设计。

“数据结构”在计算机科学中是一门综合性的专业基础课。

“数据结构”的研究不仅涉及到计算机硬件的研究范围,而且和计算机软件的研究有着密切的关系,无论是编译程序还是操作系统,都涉及到数据元素在存储器中的分配问题。

在研究信息检索时也必须考虑如何组织数据,以便查找和存取数据元素更为方便。

因此,可以认为“数据结构”是介于数学、计算机硬件和计算机软件三者之间的一门核心课程。

在计算机科学中,“数据结构”不仅是一般程序设计的基础,而且是设计和实现编译程序、操作系统、数据库系统及其他系统程序和大型应用程序的重要基础。

我们本着自己的兴趣及挑战自己的态度,也为检验我们理论知识的熟练度,锻炼我们动手实践能力,我们选择了小型图书管理系统的编写。

因为我们生活在大学,图书馆是我们学习的天堂,借书和还书又是必不可少的,一个好的图书管理系统对于我们学生和管理人员都会为大家提供很多便利。

本着挑战和创新的思想,我们进行了此次课程设计程序编写及报告撰写。

二、课程设计基本理论运用所学的数据结构相关内容,设计一个小型图书馆管理系统,我们将运用到的原理有:链表的操作,包括插入,删除等;还有数据的排序;文件的操作等;遍历查找,插入排序等原理。

也运用了c语言的基本图形界面,使用户使用界面更加人性化,更加美观。

数据结构的创建是本课程设计的一个重要内容,我们这里使用的是单链表的数据结构,结合c语言语言特点、实际的图书馆管理系统的基本操作实现了一个简单的图书管理系统的正常运行,实现一些简单的功能。

三、课程算法设计通过对图书管理系统内的图书进行添加和删除操作,实现同学借书和还书的记录工作,通过对图书的查找和按指定方式排序,更有利于同学们挑选自己所需要的图书,借阅借书所需时间。

数据结构文本编辑实验报告1

数据结构文本编辑实验报告1

数据结构文本编辑实验报告四川大学计算机学院学生实验报告实验名称:文本编辑指导老师:孙界平姓名:学号:2015141461019班级:物联网8班日期:2016/12/15实验题目:文本编辑,字符串操作。

实验目的与要求:实现对文本的插入、删除、替换、查找等功能。

掌握C++类的使用。

掌握字符串模式匹配算法,如简单字符串模式匹配算法,首尾字符串模式匹配算法,KMP 字符串模式匹配算法等。

实验的环境:1、Windows 8.1操作系统2、Visual Studio 2015 编译器3、C++库函数4、x86计算机算法描述:在C++中,有string类,它是由char类型实现的一个类,可以表示一段字符,并且有着大量的库函数可以使用,非常方便,因此,我们可以采用它辅助构建我们自己的类,从而实现对字符串的操作,即对文本的编辑。

1、mystring类我们希望能够将我们想要作用在一个串中的操作(函数)封装在一个类中,从而能够非常方便地进行定义、实现。

每次通过mystring类创建一个对象,通过对象可以获得一个string 类的串(文本),对象可以使用类中的函数实现对该对象下的string类串进行操作。

如下是mystring类的定义:#ifndef MYSTRING_H#define MYSTRING_H#includeusing namespace std;classmystring{public:mystring();int search(string P);//查找void exchange(intn,char s);//替换void insert(intn,char s);//插入void del(int n);//删除void show();//输出protected:string T;//主串};#endif可以看到通过mystring的类,我们得到一个受保护的string类型主串“T”,也就是我们想要进行操作的文本。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程设计报告课程设计题目:文章编辑姓名杨博学号201520220205班级1522202指导教师邹国华2016年6月30日东华理工大学课程设计评分表学生姓名:杨博班级:1522202学号:201520220205课程设计题目:文章编辑项目内容满分实评选题能结合所学课程知识、有一定的能力训练。

符合选题要求(5人一题)10 工作量适中,难易度合理10能力水平能熟练应用所学知识,有一定查阅文献及运用文献资料能力10 理论依据充分,数据准确,公式推导正确10能应用计算机软件进行编程、资料搜集录入、加工、排版、制图等10 能体现创造性思维,或有独特见解10成果质量总体设计正确、合理,各项技术指标符合要求。

10 说明书综述简练完整,概念清楚、立论正确、技术用语准确、结论严谨合理;分析处理科学、条理分明、语言流畅、结构严谨、版面清晰10设计说明书栏目齐全、合理,符号统一、编号齐全。

格式、绘图、表格、插图等规范准确,符合国家标准10 有一定篇幅,字符数不少于5000 10总分100指导教师评语:指导教师签名:2016年6月30 日实验题目:简单的文本编辑器1、题目及要求名称:简单的文本编辑器内容:输入一页文字,程序可以统计出文字、数字、空格的个数。

静态存储一页文章,每行最多不超过80个字符,共N行。

要求:(1)分别统计出其中英文字母数和空格数及整篇文章总字数;(2)统计某一字符串在文章中出现的次数,并输出该次数;(3)删除某一字符或者子串,并将后面的字符前移。

(4)插入某一字符或者子串。

(5)查找某一字符或者子串。

存储结构使用线性表,分别用几个子函数实现相应的功能;输入数据的形式和范围:可以输入大写、小写的英文字母、任何数字及标点符号。

输出形式:(1)分行输出用户输入的各行字符;(2)分4行输出"全部字母数"、"数字个数"、"空格个数"、"文章总字数"(3)输出删除某一字符串后的文章。

2、对题目的大概理解:本程序应实现以下功能:(1)文章内容的输入:包括字母、标点符号、数字、空格等;(2)文章内容的统计:包括文章中大写字母、小写字母、数字、标点符号、空格以及文章所有字数的个数的统计;(3)文章内容的处理:包括对文章内容的查找、删除以及对指定位置进行插入操作,其中在查找的过程中统计出该字符或字符串在文章中出现的次数;1、问题分析本程序是对一段英文文章的内容进行处理,存储方式采用链式存储,没有文件操作,故本程序对其文本内容的所有操作都是在链表中进行的。

对于文本的输入,采用头插法将文本信息存储到链表已申请好的存储空间中,在此部分设计中最大的问题在于输入文章过程中输入的字符数大于80时如何换行;对于文本内容的统计,使用循环对已存储的文章进行匹配,大写字母数、小写字母数、空格数、数字数直接通过比较即可得到,标点符号通过ASCⅡ比较即可得到;对于文本内容的处理,查找部分仍是使用循环对已存储的文章进行匹配,判断需要查找的字符或者字符串是否与文章中某部分内容相同,如果存在相同的记录相同的个数及位置并输出个数及位置。

删除部分先使用程序的查找功能对文章中需要删除的字符或者字符串进行查找,然后对其进行删除。

插入部分为通过输入的插入位置(行、列)将字符或者字符串插入到文章制定位置。

一、数据结构选择和概要设计数据结构选择:本程序是对输入的文字进行操作,并要求静态存储一页文本。

由于是一页文本,包括多行,而且相邻两行的字符内容是依次读入该页的。

因此,两行之间的内容要建立相应的联系。

通过一个单链表,来控制该文本的行数,并额外设置一个前驱指针Linklist *pre来与上一行进行有效连接,通过Linklist *next来指向下取得与下一行的连接。

为了控制每行的字符个数,在该链表的数据结构中设置一字符数组 data[80],来存储每行的字符。

设置row和length分别记录行数与列数;使用的数据结构为单链表操作。

根据第一部分的问题分析有该链表操作有3部分:Pre Temp Next另有全局变量*head,作为文章的头指针。

故创建了以下结构体:typedef struct _node{ char data[80]; //记录一行字符int length; //记录一行字符长度struct _node *next; // 后继指针struct _node *pre; //前趋指针int row; //记录整篇文章的行数}LinkList;在文章内容创建部分中使用线性表的链式存储来实现对行的操作,实用行指针所指向的字符数组对每行应输入的字符进行存储,并使用全局变量对文本的各种信息进行存储;文章的内容统计、删除、查找、插入都通过对行指针所指向的一维字符数组的操作来完成。

概要设计:程序框架:********** 简单文本编辑器运行界面************************************************************************ 主菜单************ 1、文本内容输入********** 2、显示当前文本内容********** 3、文本内容统计菜单********** 4、文本内容处理菜单********** 5、退出本系统*****如果选择功能1,则有:1 2 3 4 5图文本内容的输入,Build(),将文本内容输入到已申请的存储空间中显示函数,Display text(),将当前文本中内容显示出来文章内容统计菜单,Counttext(),以菜单形式显示给用户,对文章的内容进行各种方式的统计文章内容处理菜单,Bmenu(),为一子菜单,使用了括Searchtext()、Deletetext()、Inserttext()三个函数,对文章内容进行处理直接退出该系统******************************************** ******** 文本内容输入菜单********** **************************************************** 1、从磁盘文件中读入********* ******** 2、从键盘上直接输入********* ********3、返回主菜单*****************************************************图 2 简单文本编辑器——文本内容输入菜单如选择功能4,则有:1 2 3调用子函数Textinput ();实现从文件读入文本内容的操作调用子函数Buildtext ();实现从键盘上直接输入文本返回主菜单图4 简单的文本编辑器-----文本内容处理菜单根据以上各图,本程序共设计了12个函数。

**************************************************文章内容处理菜单************************************************* **** 1、查找文章中的字符或者字符串**** **** 2、删除文章中的字符或者字符串**** **** 3、向文章中插入字符或者字符串**** **** 4、显示处理后的文本内容**** **** 5、返回主菜单**** ****6、直接退出系统*************************************************判断12 3 4 5 6使用子函数SearchWord(),对存储在链表中的文本进行字符或者字符串查找使用子函数DeleteWord(),对存储在链表中文本进行字符或者字符串的删除使用子函数InsertWord(),对存储在链表中的文本进行字符或者字符串的插入使用函数PrintWord() 将当前文本信息显示出来返回到主菜单继续其他菜单结束整个程序1、Welcome() 标题函数,即一个输出标题,永远出现在程序的最顶端。

2、Textinput() 从指定的磁盘文件读入文本;3、Buildtext() 从键盘直接输入文本内容;4、Build()文本输入菜单;实现主菜单中的功能1,调用Textinput()和Buildtext()分两种方式输入文本5、Displaytext() 当前文本内容输出函数,实现上图1菜单功能2以及图4中功能4,将当前存储在链表中的文本内容输出;6、Counttext() 文章内容统计函数,实现上图1菜单功能3,对存储在链表中文本内容进行统计,包括对文本内容中的大写字母、小写字母、数字、标点符号、空格以及文章所有字数的个数的统计;图2是对其完整描述;7、Searchtext() 文章内容查找函数,实现上图4菜单功能1中查找部分;8、Deletetext() 文章内容删除函数,实现上图4菜单功能2中删除部分;9、Inserttext() 文章内容插入函数,实现上图4菜单功能3中插入部分;10、Bmenu() 第二子菜单函数,实现上图1菜单功能4,图4是此函数实现的结果,它将7、8、9各子函数集合在此函数中;11、menu() 主菜单函数,其结果为图1所显示部分,将1、2、3、4、8、9等函数集合。

12、main()主函数各函数关系用流程图形式绘制如下:一、详细设计及编码1、定义单链表结点类型typedef struct _list //行表结构{char data[80]; //记录一行字符int length; //记录一行字符长度struct _list *next; // 后继指针struct _list *pre; //前趋指针int row; //记录整篇文章的行数}LinkList;2、全局变量的定义int NUM,C,N; //定义全局变量,Num用来记录行号,C用来记录子串在主串中出现的总次数LinkList *head; //定义全局变量*head,文章首行头指针3、各子函数的伪码A)Textinput()读文件文本内容输入函数具体创建过程如下:a、定义LinkList指针变量*temp: LinkList *temp;b、定义文本输入变量ch,记录文本行数变量j,记录每行字符数变量i;c、申请动态存储空间:head->next=(LinkList *)malloc(sizeof(LinkList));d、首行头指针的前驱指针为空:head->pre=NULL;首行指针:temp=head->next;首行指针的前驱指针也为空:temp->pre=NULL;定义没输入字符时文章长度为0:temp->length=0;初始化为字符串结束标志,防止出现乱码:for(i=0;i<80;i++)temp->data[i]='\0';e、从文本“abc.txt”文本文件中读取字符:if((fp=fopen("abc.txt","r"))==NULL) /* 打开一个”abc.txt”文件*/{printf("not open");exit(0);}利用循环进行文本输入for(j=0;j<LINK_INIT_SIZE;j++)// 控制一页{ for(i=0;i<80;i++) //控制一行{ ch=fgetc(fp);putchar(ch);//输出到屏幕temp->data[i]=ch; temp->data[i]=ch; //给temp指向的行赋值····temp->length++;//行中字符长度加 1if(ch==EOF)//文本结束符{NUM=j; break; //文章结束时,Num来记录整个文章的行数}}}在字符输入的过程中,如果在单行输入的字符超过了80个字符,则需要以下操作:输入字符数大于80,重新分配空间建立下一行temp->next=(LinkList *)malloc(sizeof(LinkList)) ;给temp的前驱指针赋值:temp->next->pre=temp;temp指向当前行:temp=temp->next;将下一行初始化为字符串结束标志,防止出现乱码:for(i=0;i<80;i++)temp->data[i]='\0';记录整个文章的行数:temp->row=NUM+1;返回指向最后一行指针:return temp;文本输入部分到此结束。

相关文档
最新文档