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

合集下载

数据结构上机报告3个

数据结构上机报告3个

《数据结构》实验报告一题目:快速排序班级:学号:姓名:日期:程序名:一、上机实验的问题和要求:一趟快速排序示例,关键字序列:{52, 49, 80, 36, 14, 58, 61, 97, 23, 75}二、程序设计的基本思想,原理和算法描述:基本思想快速排序是通过比较关键字,以某个记录为界(称为支点记录),将待排序列分成两个部分。

其中一部分所有记录的关键字大于或等于支点记录的关键字,另一部分所有关键字小于支点记录的关键字。

将待排序列按关键字以支点记录分成两部分的过程,称为一次划分,或一趟快速排序三、源程序及注释:int partition(Record r[ ], int low, int high){int k;r[0]=r[low];k=r[low].key;while(low<high){while(low<high&&r[high].key>=k)high--;r[low]=r[high];while(low<high&&r[low].key<k)low++;r[high]=r[low];}r[low]=r[0];return low;}void main(){Record r[size];int i=1, j, k, low=1, high;printf("输入关键字序列:\n");scanf("%d", &k);while(k!=0){r[i++].key=k;scanf("%d", &k);}high=i-1;partition(r, low, high);printf("一趟快速排序之后的关键字序列为:\n");for(i=1;i<=high;i++)printf("%d ", r[i].key);printf("\n");}四、运行输出结果:五、调试和运行程序过程中产生的问题及采取的措施:六、对算法的程序的讨论、分析,改进设想,其它经验教训:七、对实验方式、组织、设备、题目的意见和建议:。

《数据结构》实验报告

《数据结构》实验报告

《数据结构》实验报告目录一、实验概述 (2)二、实验原理 (2)2.1 数据结构基本概念 (3)2.2 选择的数据结构类型 (4)2.3 实验原理说明 (5)三、实验步骤 (6)3.1 实验准备 (7)3.2 数据结构选择与实现 (7)3.2.1 数据结构类型选择 (9)3.2.2 数据结构实现细节 (9)3.3 实验功能实现 (10)3.3.1 功能一 (11)3.3.2 功能二 (12)四、实验结果与分析 (13)4.1 实验数据 (15)4.2 结果展示 (16)4.2.1 结果一展示 (17)4.2.2 结果二展示 (17)4.3 结果分析 (18)4.3.1 结果一分析 (19)4.3.2 结果二分析 (20)五、实验总结与讨论 (22)5.1 实验总结 (23)5.2 实验中遇到的问题及解决方法 (24)5.3 对数据结构的认识与体会 (25)5.4 对实验教学的建议 (27)一、实验概述本次实验旨在通过实际操作,加深对《数据结构》课程中所学理论知识的理解和掌握。

实验内容围绕数据结构的基本概念、常用算法以及在实际应用中的实现进行设计。

通过本次实验,学生将能够:理解并掌握线性表、栈、队列、链表、树、图等基本数据结构的特点和适用场景。

掌握常用的数据结构操作算法,如插入、删除、查找等,并能够运用这些算法解决实际问题。

学习使用C++、或其他编程语言实现数据结构的操作,提高编程能力和算法设计能力。

本次实验报告将对实验的目的、内容、步骤、结果及分析等方面进行详细阐述,旨在通过实验过程的学习,提高学生对数据结构理论知识的理解和应用能力。

二、实验原理数据结构的基本概念:介绍数据结构的基本定义,包括数据元素、数据集合、数据关系等基本概念,以及数据结构的三要素:逻辑结构、存储结构和运算。

栈和队列:介绍栈和队列的定义、特点、基本运算及其在算法设计中的重要性。

树和二叉树:讲解树的基本概念、二叉树的结构特点、遍历方法、二叉搜索树及其在数据检索中的应用。

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

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

成都信息工程学院计算机系课程实验报告一【上机实验目的】要求功能与界面模拟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.掌握单链表的存储、初始化、插入、删除等操作的程序实现。

2.加深对单链表基本概念,基本理论及相应算法的掌握与理解。

3.了解链表的处理方式,学习体会简单的单链表程序实现相关知识。

二、实验内容1.建立一个链表、设计链表的基本操作实现算法、输出一个链表表,调试并输出结果。

2.编写一个程序实现如下功能:让计算机产生出50个0~9之间的随机数并依次保存到单链表中;输出遍历单链表;从单链表中删除与给定值相等的所有结点;输出遍历单链表;输出单链表长度,调试并输出结果。

三、实验步骤1.定义一个链表结构体。

2.利用插入功能插入一个结点。

3.利用删除功能删除一个结点。

四、程序运行测试1.利用插入功能插入一个结点。

2.利用删除功能删除一个结点。

五、实验报告要求1.绘制链表操作实现的流程图。

2.详细给出程序运行测试结果(包括测试数据和测试结果)。

3.选试验步骤2-3中的任意一个,给出程序的详细注释。

4.参考程序中某一部分功能的改进(选做)5.实验心得与体会6.附录,实验用源程序六、参考源代码#include <iostream.h>#include <malloc.h>typedef struct LNode{int data;struct LNode *next;}Lnode, *LinkList;//假设下面的单链表均为带头结点。

void CreatLinkList(LinkList &L,int j){//建立一个单链表L,数据为整数,数据由键盘随机输入。

LinkList p,q;L=(LinkList )malloc(sizeof(Lnode));L->next=NULL;q=L;cout<<"在单链表内输入整数:"<<endl;for(int i=0;i<j;i++) p=(LinkList)malloc(sizeof(Lnode)); cin>>p->data;p->next=q->next;q->next=p;q=p; }int PrintLinkList(LinkList &L){//输出单链表L的数据元素LinkList p;p=L->next;if(L->next==NULL){cout<<"链表没有元素!"<<endl;return 0;}cout<<"单链表的数据元素为:";while(p){cout<<p->data<<" ";p=p->next;}cout<<endl;return 1;}void LinkListLengh(LinkList &L){//计算单链表L的数据元素个数。

(最新版)《数据结构》上机实验报告(模版)

(最新版)《数据结构》上机实验报告(模版)

成都信息工程学院计算机系课程实验报告实验课程:数据结构实验项目:数据结构综合设计之二叉树遍历算法指导教师:李莉丽学生姓名: 梅钲琪学生学号:班级:应用122实验地点: 6308实验时间:实验成绩:评阅老师:一【上机实验目的】1.掌握二叉树的概念,包括二叉树、满二叉树和完全二叉树的定义。

2.掌握二叉树的性质。

3.重点掌握二叉树的存储结构,包括二叉树顺序存储结构和链式存储结构。

4.重点掌握二叉树的基本运算和各种遍历算法的实现。

二【实验环境】PC机1台,,VC++6.0,easyX图形库三【上机实验内容】数据结构综合设计之二叉树遍历算法四【上机调试程序流程图】(用传统流程图的形式表示)程序开始建立空的根节点root输入字符c判断c是否为’#’是否Root->tag=c程序结束Root指向左孩子root=root->lchildRoot指向右孩子root=root->rchild以先序方式建立二叉树程序开始Root指向二叉树当前节点判断root是否为空是否打印当前结点的tag程序结束Root指向左孩子root=root->lchildRoot指向右孩子root=root->rchild递归前序遍历二叉树程序开始Root指向二叉树当前节点判断root是否为空是否Root指向左孩子root=root->lchild程序结束打印当前结点的tagRoot指向右孩子root=root->rchild递归中序遍历二叉树程序开始Root指向二叉树当前节点判断root是否为空是否Root指向左孩子root=root->lchild程序结束Root指向右孩子root=root->rchild打印当前结点的tag递归后序遍历二叉树Root 指向二叉树当前节点判断root 是否为空访问root ,并将root 进栈,然后root=root->lchild建立栈s否非递归前序遍历二叉树程序开始判断栈s 是否为NULLRoot 出栈,并且root=root->rchild结束是是否Root 指向二叉树当前节点判断root 是否为空将root 进栈,然后root=root->lchild建立栈s否非递归中序遍历二叉树程序开始判断栈s 是否为NULLRoot 出栈,并访问root,然后root=root->rchild结束是是否Root 指向二叉树当前节点判断root 是否为空将root 进栈,然后root=root->lchild 建立栈s否非递归后序遍历二叉树程序开始判断栈s 是否为NULLRoot 出栈结束是是否判断右孩子是否存在或者已经访问过访问root ,并标记已经访问,然后root 置空是Root 指向右孩子否root 指向当前结点判断root 是否为Root 入队并访问root左孩子入队程序开始否程序结束是层次遍历二叉树建立队列判断左孩子是否为空判断右孩子是否为空右孩子入队否否是是五【上机调试中出现的错误信息、错误原因及解决办法】非递归后序遍历时出现了问题,不能遍历非完全二叉树,后来用到,右孩子不存在或者已经访问过,root出栈并访问,否则,不出栈,继续访问右孩子层次遍历是开始想的是用栈来实现,但是很麻烦,还有问题,后来用队列,解决了问题六【上机调试后的源程序及还存在的问题】#include<stdio.h>#define MAXN 100#include<windows.h>#include<graphics.h>struct BTNode{char tag;BTNode *left;BTNode *right;};//二叉树结点int X[10]={ 75};int Y[10]={ 20};//动画演示的坐标char B[21]={'A','B','C','#','#','D','E','#','#','F','#','#','G','H','#','#','I','J','#','#','#'};//固定动画演示的char C[10]={'A','B','C','D','E','F','G','H','I','J'};int xx[10]={ 325};//输出结果的横坐标int flag=0;//标记是否进行动画演示,0 代表“不”,1 代表“要”void creatree(BTNode **root)//动画演示先序构造二叉树{static ii=0;if(B[ii] == '#'){*root=NULL;ii++;}else{*root = new BTNode;(*root)->tag = B[ii];ii++;creatree(&(*root)->left);creatree(&(*root)->right);}}/*先序方式创建二叉树*/void BuildBTree(BTNode **root){char c;c = getchar();if(c == '#')*root=NULL;else{*root = new BTNode;(*root)->tag = c;BuildBTree(&(*root)->left);BuildBTree(&(*root)->right);}}void PreVisit(BTNode *root)//递归前序遍历{static ii=0;if(root!=NULL){if (flag == 0)//不动画演示{printf("%c ", root->tag );}else//动画演示{for (int i=0;i<10;i++){if (C[i] == root->tag){setcolor(GREEN);fillcircle(X[i],Y[i],15);setcolor(GREEN);setbkmode(TRANSPARENT);setfont(20, 20,"宋体");outtextxy(X[i]-10, Y[i]-7,C[i]);setbkmode(OPAQUE);outtextxy(xx[ii], 400,C[i]);ii++;break;}}Sleep(1500);}PreVisit(root->left);PreVisit(root->right);}}void InVisit(BTNode *root)//递归中序遍历{static ii=0;if(root!=NULL){InVisit(root->left);if (flag == 0){printf("%c ", root->tag );}else{for (int i=0;i<10;i++){if (C[i] == root->tag){setcolor(500);fillcircle(X[i],Y[i],15);setcolor(500);setbkmode(TRANSPARENT);setfont(20, 20,"宋体");outtextxy(X[i]-10, Y[i]-7,C[i]);setbkmode(OPAQUE);outtextxy(xx[ii], 400,C[i]);ii++;break;}}Sleep(1500);}InVisit(root->right);}}void PostVisit(BTNode *root)//递归后序遍历{static ii=0;if(root!=NULL){PostVisit(root->left);PostVisit(root->right);if (flag == 0){printf("%c ", root->tag );}else{for (int i=0;i<10;i++){if (C[i] == root->tag){setcolor(GREEN);fillcircle(X[i],Y[i],15);setcolor(GREEN);setbkmode(TRANSPARENT);setfont(20, 20,"宋体");outtextxy(X[i]-10, Y[i]-7,C[i]);setbkmode(OPAQUE);outtextxy(xx[ii], 400,C[i]);ii++;break;}}Sleep(1500);}}}void NR_PreVisit(BTNode *root)//非递归前序遍历{BTNode *s[MAXN]; //栈int top=0; //头指针while(top!=0 ||root!=NULL) //如果结点不为空或栈不为空{while(root!=NULL) //如果结点不为空{s[top] = root; //压栈printf("%c ", s[top]->tag); //输出结点top++;root = root->left; //指向左孩子}if(top>0)//如果栈不为空{top--; //出栈root = s[top];root = root->right;//指向右孩子}}}void NR_InVisit(BTNode *root)//非递归中序遍历{BTNode *s[MAXN]; //栈int top=0; //头指针while(top!=0 || root!=NULL) //如果结点不为空或栈不为空{while(root!=NULL)//如果结点不为空{s[top++]=root;//压栈root = root->left; //指向左孩子}if(top>0)//如果栈不为空{root = s[--top];printf("%c ", root->tag);root = root->right;}}}void NR_PostVisit(BTNode *root)//非递归后序遍历{BTNode *s[MAXN], *tmp=NULL;int top=0;while(top!=0 || root!=NULL){while(root!=NULL){s[top++]=root;root=root->left;}if(top>0){root = s[--top];/*右孩子不存在或者已经访问过,root出栈并访问*/if( (root->right == NULL) || (root->right == tmp) ){printf("%c ", root->tag);tmp = root; //保存root指针root=NULL; //当前指针置空,防止再次入栈}/*不出栈,继续访问右孩子*/else{top++; //与root=s[--top]保持平衡root = root->right;}}}}void Cengci(BTNode *root) /* 按层次遍历*/{static ii=0;BTNode *V[MAXN],*p;int front=0,area=0;//队列if (root!=NULL){area++;V[area]=root;while (front<area){front++;p=V[front];if (flag == 0){printf("%c ", p->tag);}else{for (int i=0;i<10;i++){if (C[i] == p->tag){setcolor(500);fillcircle(X[i],Y[i],15);setcolor(500);setbkmode(TRANSPARENT);setfont(20, 20,"宋体");outtextxy(X[i]-10, Y[i]-7,C[i]);setbkmode(OPAQUE);outtextxy(xx[ii], 400,C[i]);ii++;break;}}Sleep(1500);}if(p->left!=NULL){area++;V[area]=p->left;}if(p->right!=NULL){area++;V[area]=p->right;}}}return;}int main(){BTNode *root=NULL,*T=NULL;BuildBTree(&root); //头指针的地址/*非动画演示部分*/printf("递归前序遍历:");//递归遍历PreVisit(root);printf("\n");printf("递归中序遍历:");InVisit(root);printf("\n");printf("递归后序遍历:");PostVisit(root);printf("\n\n");printf("非递归前序遍历:");//非递归遍历NR_PreVisit(root);printf("\n");printf("非递归中序遍历:");NR_InVisit(root);printf("\n");printf("非递归后序遍历:");NR_PostVisit(root);printf("\n\n");printf("层次遍历:");//层次遍历Cengci(root);printf("\n\n");printf("\n\n按任意键进行特例动画演示。

数据结构上机实验报告

数据结构上机实验报告

数据结构上机实验报告学院:电子工程学院专业:信息对抗技术姓名:学号:教师:饶鲜日期:目录实验一线性表 ........................................................................................................ - 4 -一、实验目的.................................................................................................... - 4 -二、实验代码.................................................................................................... - 4 -三、实验结果.................................................................................................. - 14 -四、个人思路.................................................................................................. - 15 - 实验二栈和队列 .................................................................................................. - 15 -一、实验目的.................................................................................................. - 15 -二、实验代码.................................................................................................. - 16 -三、实验结果.................................................................................................. - 24 -四、个人思路.................................................................................................. - 25 - 实验三数组 .......................................................................................................... - 26 -一、实验目的.................................................................................................. - 26 -二、实验代码.................................................................................................. - 26 -三、实验结果.................................................................................................. - 28 -四、个人思路.................................................................................................. - 28 - 实验四树 .............................................................................................................. - 29 -一、实验目的.................................................................................................. - 29 -二、实验代码.................................................................................................. - 29 -三、实验结果.................................................................................................. - 39 -四、个人思路.................................................................................................. - 39 -实验一线性表一、实验目的1.熟悉线性表的顺序和链式存储结构2.掌握线性表的基本运算3.能够利用线性表的基本运算完成线性表应用的运算二、实验代码1.设有一个线性表E={e1, e2, … , e n-1, e n},设计一个算法,将线性表逆置,即使元素排列次序颠倒过来,成为逆线性表E’={ e n, e n-1 , … , e2 , e1 },要求逆线性表占用原线性表空间,并且用顺序表和单链表两种方法表示,分别用两个程序来完成。

数据结构上机实习报告

数据结构上机实习报告

上机实习报告班号:116112姓名:**学号:***********实习报告【实习一】线性表及其应用n(n>20)的阶乘【问题描述】大数运算——计算n的阶乘(n>=20)。

【基本要求】(1)数据的表示和存储:(1.1)累积运算的中间结果和最终的计算结果的数据类型要求是整型——这是问题本身的要求;(1.2)试设计合适的存储结构,要求每个元素或结点最多存储数据的3位数值。

(2)数据的操作及其实现:基于设计的存储结构实现乘法操作,要求从键盘上输入n值,在屏幕上显示最终计算结果。

【问题分析】(1)设计数据的存储结构:介于乘运算的精确性以及实型数据表示的不精确性,本题不能采用实型表示累积运算的中间结果和最终的计算结果,而只能用整型。

然而由于普通整型和长整型所能表述数的范围受其字长的限制,不能表示大数阶乘的累积结果,故必须设计一个合适的数据结构实现对数据的存储,例如可以让每个元素或结点存储数据的若干位数值。

从问题描述不难看出n值为任意值,故为使程序尽量不受限制,应采用动态存储结构。

累积运算的特点是当前的计算结果是下次乘法运算的乘数。

实现两个数的乘法运算须考虑:(1)乘数的各位数都要与被乘数进行乘法运算;(2)乘法过程中的进位问题及其实现;(3)因每个元素或结点最多存储数据的3位数值,故当元素或结点中的数值大于999,需向前一个元素或结点进位。

综合以上几点,我采用了单链表的储存结构形式。

(2)阶乘算法的实现:1. 链表型数据乘法的具体实现描述:(1)初始算法顺序访问对每个节点上的数据乘以要乘的数后在顺序访问查看是否需要进位,大于999则向前进位,如果前面没有节点则添加新节点储存进位的数(2)改进算法将原始算法的乘操作和进位操作合在一起进行,提高程序效率.2. 数据输出算法具体实现描述从高位向低位顺序输出节点上储存的数据,注意补零,最高位的节点不补,其它节点要补。

对于最后的结果,因为我采用的是普通的单链表算法,因此我添加了一个逆置的算法。

数据结构上机实验报告

数据结构上机实验报告

数据结构上机实验报告数据结构上机实验报告1. 实验目的数据结构是计算机科学中非常重要的一门课程,通过本次上机实验,旨在帮助学生巩固和应用所学的数据结构知识,培养学生分析和解决实际问题的能力。

2. 实验背景本次实验涉及到两个常用的数据结构:栈和队列。

栈是一种后进先出(Last In First Out,LIFO)的数据结构,而队列是一种先进先出(First In First Out,FIFO)的数据结构。

通过实验,我们将学习如何使用这两种数据结构来解决实际问题。

3. 实验内容本次实验分为两个部分:栈的应用和队列的应用。

3.1 栈的应用在栈的应用部分,我们将实现一个简单的括号匹配算法。

该算法可以判断一个字符串中的括号是否匹配。

具体实现步骤如下:3.1.1 创建一个栈来存储括号字符;3.1.2 遍历字符串中的每个字符;3.1.3 如果遇到左括号,则将其入栈;3.1.4 如果遇到右括号,则判断栈顶元素是否是对应的左括号;3.1.5 如果栈为空或栈顶元素不是对应的左括号,则括号不匹配;3.1.6 如果栈顶元素是对应的左括号,则将其出栈;3.1.7 遍历完字符串后,如果栈为空,则括号匹配,否则括号不匹配。

通过实现这个算法,我们可以学习到如何使用栈来解决实际问题,并且理解栈的后进先出的特性。

3.2 队列的应用在队列的应用部分,我们将实现一个简单的任务调度算法。

该算法可以模拟多个任务按照一定的优先级进行调度的过程。

具体实现步骤如下:3.2.1 创建一个队列来存储任务;3.2.2 每个任务包含两个属性:任务名称和优先级;3.2.3 向队列中添加任务,并按照优先级进行排序;3.2.4 从队列中取出优先级最高的任务,并执行;3.2.5 执行完任务后,继续从队列中取出下一个优先级最高的任务,并执行,直到队列为空。

通过实现这个算法,我们可以学习到如何使用队列来实现任务调度,并且理解队列的先进先出的特性。

4. 实验结果与分析通过实验,我们成功实现了括号匹配算法和任务调度算法,并得到了正确的结果。

数据结构上机实验报告6

数据结构上机实验报告6
三、实验内容
队列的实现(要求有出队和入队函数)
①创建最大长度为10的循环顺序队列。②将a、b、c、d、e、f依次入队,边入队,直到入队完毕。③若队列不空,将元素边出队,边打印输出。④再依次将g、h、i、j、j入队;出队和入队操作时要求输出当前队列的对头和队尾位置。
四、算法描述及实验步骤
用算法表示方法,流程图等形式表达算法设计思想与算法实现步骤
五、调试过程及实验结果
详细记录程序在调试过程中出现的问题及解决方法。
记录程序执行的结果。
六、总结
对上机实践结果进行分析,上机的心得体会。
七、附录(源程序清单)
数据结构上机实验报告6—AAXXX
课程名称:数据结构
年级:
实验日期:
姓名:xxx
学号:AA
班级:
实验名称:队列ቤተ መጻሕፍቲ ባይዱ操作
实验序号:实验六
成员人数:
一、实验目的及要求
1.了解C语言程序的特点
2.掌握简单的C语言程序结构
3.熟练掌握运行C程序的步骤和方法
4.掌握队列的概念和应用
二、实验环境
Turbo 2.0或相近的环境

《数据结构》课程设计上机实习报告课设报告模板

《数据结构》课程设计上机实习报告课设报告模板

《数据结构》课程设计上机实习报告课设题目系部班级学生姓名学号序号指导教师时间信息系 计算机 61101xxxx 2013.12.23~2013.1.4自己的题目一、设计目的1.进一步熟悉 VC++开发环境,熟悉用 C 语言完成一个应用程序的设计过程, 掌握有关编辑、调试和整合程序的方法和技巧。

2.通过此设计,了解《数据结构》课程中图的逻辑结构和物理结构;掌握有 关图的相关实际应用以及对应算法的原理与具体实现;体会数据结构在解决现实 问题中的作用和重要性。

3.通过此设计,学会分析算法时间复杂度和空间复杂度的方法,针对求解相 同问题的不同算法,掌握对其性能的比较策略。

可结合实际进行补充二、设计内容1. 2. 3. 请将自己的需求描述清楚。

先对本设计的问题进行描述(做这个设计能实现什么 功能、达到什么目的),再分条描述基本要求,需要给出总体框图。

可参考下面内容。

设计内容 1.设计题目:简易城市交通咨询系统的设计 2.问题描述: 出于不同目的的旅客对交通工具有不同的要求,例如,因出公差的旅客希望在旅途中的时间尽可能短,出门旅游的旅客则期望旅费尽可能省,而老年旅客则 要求中转次数最少。

要求编制一个简易城市交通咨询系统,为旅客提供两种或者 三种最优决策的交通咨询。

按图 1 所示城市交通网(图中边上的权值表示城市之 间的距离),实现系统各个功能。

第 1 页(共 6 页)图 1 城市交通信息网3. 基本要求 用图的邻接矩阵或邻接表的表示方法存储图 1 所示的城市交通信息网。

在主 函数中设计功能菜单,利用菜单调用各个函数,分别完成图 2 所示各功能:图 2 系统功能模块图1) 设计在相应存储结构(邻接矩阵或邻接表)下的图的类型声明。

2)根据图 1 所示交通网,创建交通信息。

A、新建交通信息:通过用户输入, 新建城市交通信息,并能够将所创建的交通网的顶点和边的信息存储于文件中; B、读取交通信息:从指定位置文件中读取顶点和边的信息,生成交通信息网。

数据结构文本编辑实验报告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”,也就是我们想要进行操作的文本。

数据结构上机实验报告

数据结构上机实验报告

实验名称:数据结构实验实验时间:2021年X月X日实验地点:计算机实验室实验目的:1. 理解并掌握基本数据结构(线性表、栈、队列、链表、树、图)的概念和操作。

2. 能够运用C语言实现基本数据结构的各种操作。

3. 培养编程能力和问题解决能力。

实验内容:1. 线性表2. 栈3. 队列4. 链表5. 树6. 图实验环境:1. 操作系统:Windows 102. 编程语言:C语言3. 开发环境:Visual Studio 2019实验步骤:一、线性表1. 实现线性表的创建、插入、删除、查找和遍历等基本操作。

2. 编写代码,实现以下功能:- 创建一个线性表,包含10个元素。

- 在第3个位置插入一个新元素。

- 删除第5个位置的元素。

- 查找线性表中的第7个元素。

- 遍历线性表,并打印所有元素。

二、栈1. 实现栈的创建、入栈、出栈、判空和求栈顶元素等基本操作。

2. 编写代码,实现以下功能:- 创建一个栈。

- 向栈中依次入栈元素1、2、3、4、5。

- 判断栈是否为空。

- 求栈顶元素。

- 出栈元素,并打印出栈的元素。

三、队列1. 实现队列的创建、入队、出队、判空和求队头元素等基本操作。

2. 编写代码,实现以下功能:- 创建一个队列。

- 向队列中依次入队元素1、2、3、4、5。

- 判断队列是否为空。

- 求队头元素。

- 出队元素,并打印出队的元素。

四、链表1. 实现单链表、双向链表和循环链表的创建、插入、删除、查找和遍历等基本操作。

2. 编写代码,实现以下功能:- 创建一个单链表,包含元素1、2、3、4、5。

- 在第2个位置插入一个新元素。

- 删除第3个位置的元素。

- 查找链表中的第4个元素。

- 遍历链表,并打印所有元素。

五、树1. 实现二叉树的创建、插入、删除、查找和遍历等基本操作。

2. 编写代码,实现以下功能:- 创建一个二叉树,包含元素1、2、3、4、5。

- 在第2个位置插入一个新元素。

- 删除第3个位置的元素。

数据结构上机实验报告

数据结构上机实验报告

数据结构上机实验报告一、实验目的本次数据结构上机实验的主要目的是通过实际编程操作,深入理解和掌握常见的数据结构及其基本操作,提高解决实际问题的能力和编程技能。

具体目标包括:1、熟练掌握线性表、栈、队列、树、图等数据结构的基本概念和存储方式。

2、学会运用数据结构的相关算法进行数据的插入、删除、查找、排序等操作。

3、培养分析问题、设计算法、编写代码和调试程序的综合能力。

4、增强对数据结构在实际应用中的认识,提高解决复杂问题的思维能力。

二、实验环境1、操作系统:Windows 102、编程环境:Visual Studio 20193、编程语言:C++三、实验内容本次实验共包括以下几个部分:1、线性表的操作实现顺序表和链表的创建、插入、删除、查找和遍历操作。

比较顺序表和链表在不同操作下的性能差异。

2、栈和队列的应用利用栈实现表达式求值。

用队列模拟银行排队系统。

3、树的遍历实现二叉树的先序、中序和后序遍历算法,并输出遍历结果。

构建哈夫曼树,并进行编码和解码操作。

4、图的基本操作用邻接矩阵和邻接表存储图,并实现图的深度优先搜索和广度优先搜索算法。

四、实验步骤及结果1、线性表的操作顺序表的实现:```cppinclude <iostream>using namespace std;define MAXSIZE 100 //顺序表的最大长度class SeqList {private:int dataMAXSIZE; //存储顺序表元素的数组int length; //顺序表的当前长度public:SeqList(){//构造函数,初始化顺序表length = 0;}//插入元素bool insert(int pos, int element) {if (pos < 0 || pos > length || length == MAXSIZE) {return false;}for (int i = length; i > pos; i) {datai = datai 1;}datapos = element;length++;return true;}//删除元素bool remove(int pos) {if (pos < 0 || pos >= length) {return false;}for (int i = pos; i < length 1; i++){datai = datai + 1;}length;return true;}//查找元素int search(int element) {for (int i = 0; i < length; i++){if (datai == element) {return i;}}return -1;}//遍历输出顺序表void traverse(){for (int i = 0; i < length; i++){cout << datai <<"";}cout << endl;}};int main(){SeqList list;listinsert(0, 10);listinsert(1, 20);listinsert(2, 30);listtraverse();listremove(1);listtraverse();int position = listsearch(30);if (position!=-1) {cout <<"元素 30 在位置"<< position << endl;} else {cout <<"未找到元素 30" << endl;}return 0;}```链表的实现:```cppinclude <iostream>using namespace std;class Node {public:int data;Node next;Node(int element) {data = element;next = NULL;}};class LinkedList {private:Node head;public:LinkedList(){head = NULL;}//插入元素void insert(int element) {Node newNode = new Node(element);if (head == NULL) {head = newNode;} else {Node current = head;while (current>next!= NULL) {current = current>next;}current>next = newNode;}}//删除元素void remove(int element) {if (head == NULL) {return;}if (head>data == element) {Node temp = head;head = head>next;delete temp;return;}Node current = head;Node prev = NULL;while (current!= NULL && current>data!= element) {prev = current;current = current>next;}if (current!= NULL) {prev>next = current>next;delete current;}}//查找元素bool search(int element) {Node current = head;while (current!= NULL) {if (current>data == element) {return true;}current = current>next;}return false;}//遍历输出链表void traverse(){Node current = head;while (current!= NULL) {cout << current>data <<"";current = current>next;}cout << endl;}};int main(){LinkedList list;listinsert(10);listinsert(20);listinsert(30);listtraverse();listremove(20);listtraverse();if (listsearch(30)){cout <<"找到元素 30" << endl;} else {cout <<"未找到元素 30" << endl;}return 0;}```性能比较:在插入和删除操作中,顺序表在表头或中间位置操作时需要移动大量元素,时间复杂度较高;而链表只需要修改指针,时间复杂度较低。

数据结构上机实验报告

数据结构上机实验报告
四、 详细设计 1. 实现概要设计中的数据结构 ADT :无 2. 核心函数伪码 : Find(string S, string P, int linenumb)
{ while (i<S.size() && j<P.size())//当找到或者找到头时循环结束 { if (S[i] == P[j]) { i++; j++;} else{ i = i - j + 1; j = 0; }//失配时从下一位继续找 } if (j == P.size()){//找到就输出这一行 cout << "第" << linenumb << "行" << S << endl; }
}
3. 主程序的伪码 :
void main(){ cout << "请输入文件名" << endl; cin >> filename;
ifstream infile(filename.c_str()); cout << "请输入待查找的字符串" << endl; cin >> P; while (getline(infile, S))//读完所有行结束 {
linenumb++; Find(S, P, linenumb); } infile.close(); } int Find(string S, string P, int linenumb) { int i = 0, j = 0; while (i<S.size() && j<P.size())//当找到或者找到头时循环结束 { if (S[i] == P[j]) {

数据结构上机实验报告

数据结构上机实验报告

数据结构上机实验报告一.设计人员相关信息1.设计者姓名:XXX;学号:XXXX班号:XXXX2.设计日期:2008-06-183.上机环境:Dev-c++二.程序设计相关信息(一)1实验题目:实验题2.7 编写一个程序用单链表存储多项式,并实现两个多项式相加的函数2实验项目组成:多项式相加,若指数相等,则将两项的系数直接相加作为新链表的项的系数,指数为原来项的指数;若指数不相等,则根据大小判断,将具有较小指数的项插入到生成的新多项式链表中。

定义节点类型:每个节点有系数和指数两部分组成。

其中,系数为浮点类型,指数为整数类型。

定义为term数据类型。

typedef struct{float coef; /*系数*/int expn; /*指数*/}term;定义多项式结构:定义为链表结构。

且其中数据元素的数据类型为刚定义的term。

typedef struct LNode{term data; /*多项式的值*/struct LNode *next;}LNode,*LinkList;3实验项目的程序结构:Scanf( )调用create()Main()调用Printf()调用Printf()调用cmp()来比较pa、pb4实验项目包含的各个文件中的函数的功能描述:(1)cmp()函数:比较多项式指数的大小。

(2)create()函数:建立多项式链表结构。

(3)add()函数:两多项式相加得到新的多项式。

(4)Printf()函数:输出多项式链表。

其中,多项式的最终表示方式为系数(指数)+系数(指数)…(5)main()函数:调用前面所定义的函数,以实现两个多项式的相加和输出。

5算法描述和流程图:(1)cmp()函数:对于两个多项式的相加,必须比较多项式的指数。

对于多项式二节点a、b,若a.expn < b.expn,则设置标志flag=-1;若a.expn = b.expn,则设置标志flag=0;若a.expn > b.expn,则设置标志flag=1;且函数的返回类型为整数类型,即返回flag值。

数据结构上机实验报告

数据结构上机实验报告

数据结构上机实验报告1. 实验目的本次实验旨在通过编写程序,掌握和理解常见的数据结构及其应用。

2. 实验环境与工具- 操作系统:Windows 10- 开发语言:C++- 集成开发环境(IDE):Visual Studio Code3. 实验内容及步骤3.1 线性表操作演示程序设计与分析步骤:a) 设计一个线性表类,并包含以下基本功能:i) 初始化线性表;ii) 插入元素到指定位置;iii) 删除指定位置的元素;iv) 获取指定位置处的元素值。

b)使用该线性表类进行一系列测试,验证各个功能是否正常运行。

记录并分析每个函数调用所消耗时间以评估算法效率。

3.2 栈和队列综合应用设计与模拟步骤:a)根据给出问题需求,在已有栈、队列等相关代码基础上完成如下任务:i)利用两个堆栈来模拟浏览器前进后退功能;ii)使用循环链式存储结构表示双向链队, 并对其进行初始化、入队、出队等操作。

b). 运行以上代码片段,并输出相应结果。

同时分析算法的时间复杂度和空间复杂度。

4. 实验结果与讨论a) 线性表操作演示程序设计与分析实验结果:- 初始化线性表所需时间为X秒;- 插入元素到指定位置平均耗时Y毫秒;- 删除指定位置的元素平均耗时Z毫秒。

b)栈和队列综合应用设计与模拟实验结果:i) 浏览器前进后退功能测试:共浏览N个网页,前进M 次、后退K次。

运行总体消耗时间T1;ii) 双向链队初始化、入队、出对等操作测试: 共进行P 组数据处理, 运行总体消耗时间T2.5. 结论通过本次上机实验,我们掌握了线性表及其相关基本操作,并且成功完成了栈和队列在特定场景下的应用。

同时,在代码编写过程中也深刻理解并评估了各种算法效率。

6. 致谢感谢老师们给予我宝贵意见以及同学们之间相互交流合作提供支持。

7. 附件8. 法律名词及注释在此处添加涉及到的法律名词或术语,并提供简要注释。

数据结构第一次上机实验报告

数据结构第一次上机实验报告

数据结构第一次上机实验报告(线性表)实验要求:1、实现顺序表结构的创建、插入、删除、查找等操作;2、利用上述顺序表操作实现如下程序:建立两个顺序表表示的集合(集合中无重复的元素),并求这样的两个集合的并、交和源程序://C++实现//visual studi o 2010下编译通过#include<iostream>#include<vector>#include<algorithm>using namespace std;const size_t MaxSize=20;//顺序表初始分配量class SqList//顺序表类{//privata:int data[MaxSize];int length;//顺序表长度public:void InitList();//初始化void CreatList(int a[],int n);//创建void SearhList();//查找void InsertList();//插入void DeleteList(); //删除};//初始化线性表void SqList::InitList(){length=0;}//创建线性表void SqList::CreatList(int a[],int n){ cout<<"创建的顺序表:\n";for(int i=0;i<n;++i){data[i]=a[i];cout<<data[i]<<" ";}cout<<endl;length=n;}//顺序表的查找void SqList::SearhList(){int k=0;int number;//要查找的数据if(length==0)cout<<"空表"<<endl;else{cout<<"输入要查找的数据:"<<endl;cin>>number;for(int i=0;i<length;++i){if(data[i]==number){k=1;cout<<"查找成功,下标为:"<<i<<endl;break;}//if}//for}//el se}//顺序表的插入void SqList::InsertList(){int i,number;cout<<"请输入要插入的数据:"<<endl;cin>>number;cout<<"输入插入的位置:"<<endl;cin>>i;while(i<1||i>length){cout<<"越界,请重新输入插入位置:"<<endl;cin>>i;}i=i-1;for(int j=length+1;j>i;--j)data[j]=data[j-1];//插入位置后面的元素后移一位data[i]=number;//插入元素length=length+1;//表长加1cout<<"插入元素的线性表:\n";for(int k=0;k<length;++k)cout<<data[k]<<" ";cout<<endl;}//顺序表的删除void SqList::DeleteList(){int i;cout<<"输入要删除的位置:"<<endl;cin>>i;while(i<1||i>length){cout<<"越界,请重新输入要删除的位置:"<<endl;cin>>i;}i=i-1;for(int j=i;j<length-1;++j)data[j]=data[j+1];length=length-1;cout<<"删¦除后的顺序表:\n";for(int k=0;k<length;++k)cout<<data[k]<<" ";cout<<endl;}int main(){SqList L;L.InitList();//初始化int a[10];cout<<"向线性表输入数据(10个各不相等Ì的整数):"<<endl;for(int m=0;m<10;++m)cin>>a[m];L.CreatList(a,10);L.SearhList();L.InsertList();L.DeleteList();cout<<"线性表集合操作"<<endl;vector<int> ivec1;vector<int> ivec2;cout<<"向线性表输入数据(10个各不相等的整数):"<<endl;//以矢量容器的形式存储线性表for(int n=0;n<10;++n){while(cin>>a[n]){ivec1.push_back(a[n]);break;}}cin.clear();cout<<"向线性表输入数据(10个各不相等的整数):"<<endl;for(int n=0;n<10;++n){while(cin>>a[n]){ivec2.push_back(a[n]);break;}}//对线性表进行排序sort(ivec1.begin(),ivec1.end());sort(ivec2.begin(),ivec2.end());cout<<"线性表1排序后:"<<endl;for(vector<int>::iterator iter1=ivec1.begin();iter1!=ivec1.end();++iter1) cout<<*iter1<<" ";cout<<endl;cout<<"线性表2排序后¨:"<<endl;for(vector<int>::iterator iter2=ivec2.begin();iter2!=ivec2.end();++iter2) cout<<*iter2<<" ";cout<<endl;//两线性表的交void AND(vector<int> &ivec1,vector<int> &ivec2);{vector<int> ivec;for(vector<int>::iterator it1=ivec1.begi n();it1!=ivec1.end();++it1){for(vector<int>::iterator it2=ivec2.begi n();it2!=ivec2.end();++it2){if(*it1==*it2)ivec.push_back(*it1);}}cout<<"两线性表的交:"<<endl;if(ivec.empty()) cout<<"为空";else{for(vector<int>::iterator it=ivec.begin();it!=ivec.end();++it)cout<<*it<<" ";}cout<<endl;}//两线性表的并void OR(vector<int> &ivec1,vector<int> &ivec2);{vector<int> ivec;for(vector<int>::iterator it1=ivec1.begi n();it1!=ivec1.end();++it1)ivec.push_back(*it1);for(vector<int>::iterator it2=ivec2.begin();it2!=ivec2.end();++it2)ivec.push_back(*it2);sort(ivec.begin(),ivec.end());vector<int>::iterator end_unique=unique(ivec.begin(),ivec.end());//uni que函数将相同数据中的一个放入最后ivec.erase(end_unique,ivec.end());//erase删除unique函数返回位置到表最后的所有元素cout<<"两线性表的并:"<<endl;for(vector<int>::iterator it=ivec.begin();it!=ivec.end();++it)cout<<*it<<" ";cout<<endl;}//两线性表的差void cha(vector<int> &ivec1,vector<int> &ivec2);{vector<int>::iterator iter1;vector<int>::iterator iter2;int flag = 0;cout<<"线性表1对线性表2的差:"<<endl;for(iter1=ivec1.begin();iter1!=ivec1.end();++iter1){flag = 0;for(iter2=ivec2.begin();iter2!=ivec2.end();++iter2){if((*iter1)==(*iter2)){flag = 1;}}if(flag==0){cout << *iter1 << " ";}}if(flag==1)cout << "为空" << endl;else cout << endl;}}结果:。

数据结构上机报告

数据结构上机报告

Practice Report for Data Structures and Algorithm AnalysisData Structures Course ReportCandidate:Student Number:Major : Communication EngineeringSupervisor : Wu rangzhongChina University of Geosciences(Wuhan)Wuhan, Hubei 430074, P. R. ChinaDecember 31, 2013链表实现线性表一、实验目的与要求1、实现单链表的建立;2、掌握单链表的插入、删除和查找运算;3、熟练进行C语言源程序的编辑调试。

二、实验内容(1)建立带表头结点的单链表;首先输入结束标志,然后建立循环逐个输入数据,直到输入结束标志。

(2)输出单链表中所有结点的数据域值;首先获得表头结点地址,然后建立循环逐个输出数据,直到地址为空。

(3)输入x,y在第一个数据域值为x的结点之后插入结点y,若无结点x,则在表尾插入结点y;建立两个结构体指针,一个指向当前结点,另一个指向当前结点的上一结点,建立循环扫描链表。

当当前结点指针域不为空且数据域等于x的时候,申请结点并给此结点数据域赋值为y,然后插入当前结点后面,退出函数;当当前结点指针域为空的时候,申请结点并给此结点数据域赋值为y,插入当前结点后面,退出函数。

(4)输入k,删除单链表中所有的结点k,并输出被删除结点的个数。

建立三个结构体指针,一个指向当前结点,另一个指向当前结点的上一结点,最后一个备用;建立整形变量l=0;建立循环扫描链表。

当当前结点指针域为空的时候,如果当前结点数据域等于k,删除此结点,l++,跳出循环,结束操作;如果当前结点数据域不等于k,跳出循环,结束操作。

当当前结点指针域不为空的时候,如果当前结点数据域等于k,删除此结点,l++,继续循环操作;如果当前结点数据域不等于k,指针向后继续扫描。

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

成都信息工程学院计算机系课程实验报告一【上机实验目的】要求功能与界面模拟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);}}}七【上机实验中的其他它问题及心得】此编辑器主要采用的是用链表的作为他的存储结构,此编辑器用了三个结构体来分别存储行(主要作用是存储列单链表的首地址)、每列的字符还有存储复制、剪切的字符。

相关文档
最新文档