线性表通讯录实验
浙江大学城市学院实验报告
课程名称数据结构
实验项目名称实验三线性表的应用---通讯录管理系统的设计与实现
组长陈正融专业班级统计学1502学号31503197得分
组员1专业班级学号得分
组员2专业班级学号得分
实验成绩指导老师(签名)日期
一.实验目的和要求
1、掌握线性表的顺序存储结构;
2、掌握线性表的动态分配顺序存储结构及基本操作的实现;
3、掌握线性表的链式存储结构;
4、掌握单链表的基本操作的实现。
5、掌握线性表的应用。
二.实验内容
1、设计并实现日常生活中通讯录的管理系统。该系统需3位同学一组,按模块分工协作完成,系统具体功能需求描述如下:
①输入数据建立通讯录表:在系统使用前先需要创建通讯录,可以一次输入(或文件导入)多个成员的通讯录信息,建立通讯录。要求此表为顺序存储结构。
②查看所有通讯录信息:显示通讯录表中所有成员的通讯录信息。
③查询通讯录中满足要求的信息:可以根据不同方式查询,如按姓名查询、按姓氏查询、按编号查询等。
④新增通讯录信息:每次可添加一个新成员的通讯
】、录信息。
⑤修改通讯录信息:修改通讯录中已有成员的信息。
⑥删除通讯录成员:删除通讯录表中已有的成员,但需要把删除的成员信息放到另一张被删成员表中,以便错误操作后允许恢复。该被删成员表要求采用链式存储。
⑦恢复被删成员信息:一旦发现误删,则可以在被删成员表中找到该成员,重新加入到通讯录表中。
系统实现要求:
①通讯录表必须使用动态分配顺序存储结构,被删成员表必须使用链式存储结构。
②通讯录信息至少包括:编号、姓名、电话1、电话2、邮箱等,其他可自行设置。
③用菜单方式选择相应功能,且各功能的有关操作需通过调用各函数来实现,如:初始化通讯录表用函数void InitAddressBook(SqList &TXL)、浏览所有通讯录成员函数BrowseAddressBook(SqList TSL) 等等,将这些子函数放在头文件test3_Seq.h中。
③建立主函数文件test3.cpp,通过调用上述头文件中的函数来实现该系统。
④给出系统数据类型的定义、存储结构定义以及各个函数之间的调用关系。
⑤实验内容中设置的功能要求必须实现,此外可自行增加合适的功能,可作为额外的实验成绩进行加分:
例如:
●通讯录和被删成员数据可用文件保存,程序运行时可从文件读入相应数
据,程序结束时可写入文件保存。
●通讯录分组,可自行考虑把通讯录成员进行分组,如同学组、亲戚组、
同事组等。
2、以小组为单位认真填写实验报告,实验报告必须包括各类数据类型的结构定义说明,各类数据的组织方式,系统的功能结构,各个操作的定义以及实现方法,运行结果与分析,难点如何解决,存在问题以及可改进之处等。同时,在
实验报告中需写明小组每位同学的分工,得分(小组总分不超过12分)等。实验报告文件取名为report3.doc。每组还必须制作一个答辩PPT,该PPT的命名为PPT_通讯录管理系统_(各小组成员名字).PPT。
3、每位组长上传实验报告文件report3.doc 、源程序文件test3.cpp及
test3_Seq.h、test3_Link.h,以及答辩PPT压缩打包后到BB平台上。
小组分工:陈正融
程序设计
1、抽象数据类型
ADT Sqlist
{ 数据对象:D={a
i |a
i
ElemSet,i=1,2,3,……,n,n≥0}
数据关系:R1={ i-1,a i >|a i-1 ,a i ∈D,i=1,2,3,……,n} 基本操作: (1)int newContactPerson(Sqlist &S) //输入函数 (2)int SearchContacts(Sqlist &S, Linklist L) //查询函数 (3)int Oper_updata(Sqlist &S, Linklist L) //修改函数 (4)int Oper_detele(Sqlist &S, Linklist L) //删除函数 (5)int InitList_Sq(Sqlist &S) //初始化函数 (6)int sort_Sq(Sqlist &S, Contacts i) //排序函数 (7)int DestoryList_Sq(Sqlist &S) //销毁函数 ADT Linklist { 数据对象:D={a i |a i ElemSet,i=1,2,3,……,n,n≥0} 数据关系:R1={ i-1,a i >|a i-1 ,a i ∈D,i=1,2,3,……,n} 基本操作: (1)int insert_L(Linklist L, Contacts i, Sqlist &S) //输入函数 (2)int InitList_L(Linklist &L) //初始化函数 (3)int Browselist(Linklist L) //显示函数 (4)int removeContact(Linklist L, Sqlist &S) //恢复函数 (5)int DestoryList_L(Linklist &L) //销毁函数 2、存储结构 typedef struct { int no; //编号 char name[20]; //信息 char tel_1[20]; //电话1 char tel_2[20]; //电话2 char Email[50]; //邮箱 char group[20]; //分组信息 }Contacts; typedef struct { Contacts *elem; int length; int listsize; }Sqlist; typedef struct Node{ Contacts data; struct Node *next; }LNode, *Linklist; typedef struct { int num; //分组序号 char groname[20]; //分组名 }grouping; typedef struct { grouping *gr; int length; int listsize; }grolist; 3、函数定义 void main_menu() //菜单 int InitList_Sq(Sqlist &S) //顺序表初始化 int InitList_gro(grolist &G) //分组表初始化int DestoryList_Sq(Sqlist &S) //通途录销毁 int DestoryList_Gro(grolist &G) //分组表销毁 int in_Seq(Sqlist &S, Contacts a, int i) //本地输入处理int zero_Sq(Sqlist &S) //通讯录本地输入int zero_Gro(grolist &G) //分组表本地输入int out_Seq(Sqlist &S, Contacts a, int i) //通讯录输出处理int printtotxt_Sq(Sqlist &S) //通讯录输出 int printtotxt_Gro(grolist &G) //分组表输出 Contacts handle(Sqlist &S, Contacts i) //新建信息处理 int sort_Sq(Sqlist &S, Contacts i) //排序 int newContactPerson(Sqlist &S) ///新建联系人 int newGro(grolist &G) //新建分组 int Contactdetails(Sqlist &S, int no) //显示联系人详情 int Delete_Sq(Sqlist &S, Linklist L, int i, int j) //删除联系人 int Delete_Gro(grolist &G, Sqlist &S) //删除分组 int updata_Sq(Sqlist &S, Linklist L, int no) //修改联系人 int BrowseContacts(Sqlist &S) //显示联系人 int BrowseGro(grolist &G) //显示分组 int Operation_2(Sqlist &S, Linklist L, int no) //查询后操作 int find_out(Sqlist &S, int i, int j) //查询输出处理int findContact(Sqlist &S, int no[], char na[]) //查询输出 int BrowseGroCon(Sqlist &S, char na[], int k[20]) //显示分组联系人int SearchContacts(Sqlist &S, Linklist L) //查询联系人 int joingro(grolist &G, Sqlist &S, int i, int j) //分组加入联系人int Oper_updata(Sqlist &S, Linklist L) //修改联系人 int Oper_detele(Sqlist &S, Linklist L) //删除联系人 int Operation_Gro2(Sqlist &S, grolist &G) //分组综合操作int updataGroname(grolist &G, Sqlist &S) //修改分组名 int Operation_Gro(grolist &G, Sqlist &S) //分组操作 int Destory(Sqlist &S, Linklist L, grolist &G) //销毁 int InitList_L(Linklist &L) //初始化链表 int DestoryList_L(Linklist &L) //销毁链表 int Browselist(Linklist L) //显示误删表联系人 int in_link(Linklist p) //本地输入修改 int zero_Link(Linklist L) //本地输入 int out_Link(Linklist p) //本地输出修改 int printotxt_link(Linklist L) //本地输出 int insert_L(Linklist L, Contacts i, Sqlist &S) //插入联系人 int sort_Link(Sqlist &S, Contacts i) //恢复联系人排序 int removeContact(Linklist L, Sqlist &S) //恢复联系人 4、程序描述 本通讯录所有的操作都是基于联系人的编号,未避免编号出错,采用自动编号。主界面直接显示通讯录联系人和操作选项,可直接通过编号进行操作。也可以先查找联系人,然后再进行修改,删除操作。支持本地保存和读取,模糊查找,插入排序 5、实验结果 1、主菜单 2、添加联系人 3、查询联系人 4、修改联系人 5、联系人分组 6、删除联系人 7、恢复删除联系人 6、代码 主函数 #include #include #include #include #define LIST_INIT_SIZE 100 #define LISTINCREMEMT 10 typedef struct { int no; char name[20]; char tel_1[20]; char tel_2[20]; char Email[50]; char group[20]; }Contacts; typedef struct Node{ Contacts data; struct Node *next; }LNode, *Linklist; typedef struct { Contacts *elem; int length; int listsize; }Sqlist; typedef struct { int num; char groname[20]; }grouping; typedef struct { grouping *gr; int length; int listsize; }grolist; #include "test3_link.h" #include "test3_seq.h" int main() { int i = 1; Sqlist S; Linklist L; grolist G; InitList_Sq(S); InitList_L(L); InitList_gro(G); zero_Gro(G); zero_Sq(S); zero_Link(L); while (1) { BrowseContacts(S); main_menu(); printf("输入选项:"); scanf("%d", &i); if(i >= 0 && i <= 6) { switch (i) { case 1: newContactPerson(S); break; case 2: SearchContacts(S, L); break; case 3: Oper_updata(S, L); break; case 4: Operation_Gro(G, S); break; case 5: Oper_detele(S, L); break; case 6: removeContact(L, S);break; case 0: Destory(S, L, G); exit(0); break; default: break; } } else { i = 1; printf("请输入有效数字\n"); system("pause"); } } return 0; } 头文件1 void main_menu() { printf("\t\t菜单\n"); printf("\t\t1.添加联系人\n"); printf("\t\t2.查询联系人\n"); printf("\t\t3.修改联系人\n"); printf("\t\t4.联系人分组\n"); printf("\t\t5.删除联系人\n"); printf("\t\t6.恢复联系人\n"); printf("\t\t0.保存并退出\n"); }//主菜单 int InitList_Sq(Sqlist &S) { S.elem = (Contacts*)malloc(LIST_INIT_SIZE*sizeof(Contacts)); S.length = 0; S.listsize = LIST_INIT_SIZE; return 1; }//构造顺序空表。 int InitList_gro(grolist &G) { G.gr = (grouping*)malloc(LIST_INIT_SIZE*sizeof(grouping)); G.length = 0; G.listsize = LIST_INIT_SIZE; return 1; }//构造分组表 int DestoryList_Sq(Sqlist &S) { if(S.elem) free(S.elem); S.elem = NULL; S.length = S.listsize = 0; return 1; }//销毁顺序表 int DestoryList_Gro(grolist &G) { if(G.gr) free(G.gr); G.gr = NULL; G.length = G.listsize = 0; return 1; }//销毁分组表 int in_Seq(Sqlist &S, Contacts a, int i) { if(!strcmp(https://www.360docs.net/doc/5d11413024.html,,"00000000")) strcpy(S.elem[i].name,"\t"); if(!strcmp(a.tel_1,"00000000")) strcpy(S.elem[i].tel_1,"\t"); if(!strcmp(a.tel_2,"00000000")) strcpy(S.elem[i].tel_2,"\t"); if(!strcmp(a.Email,"00000000")) strcpy(S.elem[i].Email,"\t"); if(!strcmp(a.group,"00000000")) strcpy(S.elem[i].group,"\t"); return 1; } //对值为“00000000”进行处理 int zero_Sq(Sqlist &S) { int i = 0; Contacts a; FILE *fp; if((fp = fopen("Contacts_Sq.txt","r"))==NULL) { printf("File open error!\n"); exit(0); } while(!feof(fp)) { fscanf(fp, "%d%s%s%s%s%s", &S.elem[i].no, S.elem[i].name, S.elem[i].tel_1, S.elem[i].tel_2, S.elem[i].Email, S.elem[i].group); a = S.elem[i]; in_Seq(S, a, i); i++; } S.length = i; fclose(fp); return 1; }//从Contacts_Sq文本初始化 int zero_Gro(grolist &G) { int i = 0; FILE *fp; if((fp = fopen("Contacts_Gro.txt","r")) == NULL) { printf("File open error!\n"); exit(0); } while(!feof(fp)) { fscanf(fp, "%d%s", &G.gr[i].num, G.gr[i].groname); i++; } G.length = i; fclose(fp); return 1; }//从文本Contacts_Gro文本初始化 int out_Seq(Sqlist &S, Contacts a, int i) { if(!strcmp(https://www.360docs.net/doc/5d11413024.html,,"\t")) strcpy(S.elem[i].name,"00000000"); if(!strcmp(a.tel_1,"\t")) strcpy(S.elem[i].tel_1,"00000000"); if(!strcmp(a.tel_2,"\t")) strcpy(S.elem[i].tel_2,"00000000"); if(!strcmp(a.Email,"\t")) strcpy(S.elem[i].Email,"00000000"); if(!strcmp(a.group,"\t")) strcpy(S.elem[i].group,"00000000"); return 1; } //对值为“\t”的数据进行处理 int printtotxt_Sq(Sqlist &S) { if(S.elem == NULL) { return 0; } int i = 0; Contacts a; FILE *fp; fp = fopen("Contacts_Sq.txt","w"); a = S.elem[i]; out_Seq(S, a, i); fprintf(fp, "%d\t%s\t%s\t%s\t%s\t%s", S.elem[i].no, S.elem[i].name, S.elem[i].tel_1, S.elem[i].tel_2, S.elem[i].Email, S.elem[i].group); while(i < S.length) { i++; if((fp = fopen("Contacts_Sq.txt", "a"))==NULL) { printf("File open error!\n"); } a = S.elem[i]; out_Seq(S, a, i); fprintf(fp, "\n%d\t%s\t%s\t%s\t%s\t%s", S.elem[i].no, S.elem[i].name, S.elem[i].tel_1, S.elem[i].tel_2, S.elem[i].Email, S.elem[i].group); } fclose(fp); return 1; } //输出联系人到文本 int printtotxt_Gro(grolist &G) { grouping a; if(G.gr == NULL) { return 0; } int i = 0; FILE *fp; fp = fopen("Contacts_Gro.txt", "w"); fprintf(fp, "%d\t%s", G.gr[i].num, G.gr[i].groname); while(i < (G.length -1)) { i++; if((fopen("Contacts_Gro.txt", "a"))==NULL) { printf("File open error!\n"); } fprintf(fp, "\n%d\t%s", G.gr[i].num, G.gr[i].groname); } fclose(fp); return 1; }//输出分组目录到文本 Contacts handle(Sqlist &S, Contacts i) { if(!strcmp(https://www.360docs.net/doc/5d11413024.html,, "无")) strcpy(https://www.360docs.net/doc/5d11413024.html,, "\t"); if(!strcmp(i.tel_1, "无")) strcpy(i.tel_1,"\t"); if(!strcmp(i.tel_2, "无")) strcpy(i.tel_2,"\t"); if(!strcmp(i.Email, "无")) strcpy(i.Email, "\t"); strcpy(i.group, "\t"); return i; } //对值为空的值进行处理 int sort_Sq(Sqlist &S, Contacts i) { int j = 2, k, ii; char na[5], na2[5]; na[0] = 'a'; na2[0] = 'z'; if((strnicmp(https://www.360docs.net/doc/5d11413024.html,, na, strlen(na)) >= 0 && strnicmp(https://www.360docs.net/doc/5d11413024.html,, na2, strlen(na2)) <= 0)) j = 1; for(k = 0; k < S.length; k++) if(strncmp(S.elem[k].name, https://www.360docs.net/doc/5d11413024.html,, j) >= 0) break; ii = S.length; for(;ii > k; ii--) { S.elem[ii-1].no++; S.elem[ii] = S.elem[ii-1]; } i.no = k + 1; S.elem[k] = i; S.length++; return 1; }//首字母排序 int newContactPerson(Sqlist &S) { int i = 1; Contacts new_person; while(i) { if ( S.length >= S.listsize ) { //若线性表空间满,增加分配 Contacts *newbase; newbase = (Contacts*) realloc(S.elem, (S.listsize+LISTINCREMEMT) *sizeof(Contacts)) ; if (!newbase) exit(OVERFLOW); //存储分配失败 S.elem=newbase; //新基址 S.listsize=S.listsize+LISTINCREMEMT; //新容量 } system("cls"); printf("输入“无”则信息为空\n"); printf("%s", "请输入姓名:"); scanf("%s", new_https://www.360docs.net/doc/5d11413024.html, ); printf("%s", "请输入电话1:"); scanf("%s", new_person.tel_1); printf("%s", "请输入电话2:"); scanf("%s", new_person.tel_2); printf("%s", "请输入邮箱:"); scanf("%s", new_person.Email); printf("输入0不添加,其他数字确认添加:"); scanf("%d", &i); if(i == 0) { return 0; } new_person = handle(S, new_person); sort_Sq(S, new_person); printf("添加成功\n"); printf("输入0退出,其他数字继续添加:"); scanf("%d", &i); } return 1; }//添加联系人 int newGro(grolist &G) { int i = 1; Contacts new_person; while(i) { if ( G.length >= G.listsize ) { //若线性表空间满,增加分配 grouping *newbase; newbase = (grouping*) realloc(G.gr, (G.listsize+LISTINCREMEMT) *sizeof(grouping)) ; if (!newbase) exit(OVERFLOW); //存储分配失败 G.gr=newbase; //新基址 G.listsize=G.listsize+LISTINCREMEMT; //新容量 } system("cls"); printf("%s", "请输入分组名:"); scanf("%s", G.gr[G.length].groname ); G.gr[G.length].num = G.length + 1; G.length++; printf("添加成功\n"); printf("输入0退出,其他数字继续添加:"); scanf("%d", &i); } return 1; }//添加分组 int Contactdetails(Sqlist &S, int no) { system("cls"); printf("编号:%d\n", S.elem[no-1].no); printf("姓名:%s\n", S.elem[no-1].name); printf("电话1:%s\n", S.elem[no-1].tel_1); printf("电话2:%s\n", S.elem[no-1].tel_2); printf("邮箱:%s\n", S.elem[no-1].Email); printf("分组:%s\n", S.elem[no-1].group); return 1; }//显示联系人详细信息 int Delete_Sq(Sqlist &S, Linklist L, int i, int j) { Linklist q; Contacts a; if(i > 0 && i <= S.length) { if(j != 0) { a = S.elem[i-1]; insert_L(L, S.elem[i-1], S); } for(; i < S.length; i++) { S.elem[i].no = S.elem[i].no - 1; S.elem[i-1] = S.elem[i]; } --S.length; } return 1; }//删除联系人 int Delete_Gro(grolist &G, Sqlist &S) { int i = 0, j; printf("请输入要删除的分组编号:"); scanf("%d", &i); for(j = 0; j < S.length; j++) { if(!strcmp(S.elem[j].group, G.gr[i].groname)) { strcmp(S.elem[j].group, "\t"); } } if(i > 0 && i <= G.length) { for(; i < G.length; i++) { G.gr[i].num = G.gr[i].num - 1; G.gr[i-1] = G.gr[i]; } --G.length; } return 1; }//删除分组 int updata_Sq(Sqlist &S, Linklist L, int no) { int j = 1000; Contacts upCon; upCon = S.elem[no-1]; while(j) { if(j != 1000) { printf("是否继续修改,继续输入1,退出输入0:"); scanf("%d", &j); if(j == 0) { break; } } 线性表实验报告 一、实验的目的要求 1、了解线性表的逻辑结构特性,以及这种结构特性在计算机内的两种存储结构。 2、掌握线性表的顺序存储结构的定义及其C语言实现。 3、掌握线性表的链式存储结构——单链表的定义及其C语言实现。 4、掌握线性表在顺序存储结构即顺序表中的各种基本操作。 5、掌握线性表在链式存储结构——单链表中的各种基本操作。 6、认真阅读和掌握实验的程序。 7、上机运行本程序。 8、保存和打印出程序的运行结果,并结合程序进行分析。 二、实验的主要内容 题目:请编制C语言,利用链式存储方式来实现线性表的创建、插入、删除和查找等操作。 具体地说,就是要根据键盘输入的数据建立一个单链表,并输出该单链表;然后根据屏幕 菜单的选择,可以进行数据的插入或删除,并在插入或删除数据后,再输出单链表;最后 在屏幕菜单中选择0,即可结束程序的运行。 三、解题思路分析 在链表中插入数据,不需要进行大量的数据移动,只需要找到插入点即可,可以采用后插入的算法,在插入点的后面添加结点。在链表中删除数据,先找到删除点,然后进行指针赋值操作。 四、程序清单 #include LNode *L; LNode *creat_L(); void out_L(LNode *L); void insert_L(LNode *L,int i,ElemType e); ElemType delete_L(LNode *L,ElemType e); int locat_L(LNode *L,ElemType e); void main() {int i,k,loc; ElemType e,x; char ch; do{printf("\n"); printf("\n 1.建立单链表"); printf("\n 2.插入元素"); printf("\n 3.删除元素"); printf("\n 4.查找元素"); printf("\n 0.结束程序运行"); printf("\n================================"); printf("\n 请输入您的选择(1,2,3,4,0)"); scanf("%d",&k); switch(k) {case 1:{L=creat_L(); out_L(L); }break; case 2:{printf("\n请输入插入位置:"); scanf("%d",&i); printf("\n请输入要插入元素的值:"); 昆明理工大学信息工程与自动化学院学生实验报告 (201 —201 学年第一学期) 课程名称:数据结构开课实验室:年月日年级、专业、班学号姓名成绩 实验项目名称线性表链式存储运算的算法实现指导教师 教 师 评语教师签名: 年月日 一.实验内容: 线性表链式存储运算的算法实现,实现链表的建立、链表的数据插入、链表的数据删除、链表的数据输出。 二.实验目的: 1.掌握线性表链式存储结构的C语言描述及运算算法的实现; 2.分析算法的空间复杂度和插入和删除的时间复杂度; 3.总结比较线性表顺序存储存储与链式存储的各自特点。 三.主要程序代码分析: LinkList creatListR1() //用尾插入法建立带头结点的单链表 { char *ch=new char(); LinkList head=(LinkList)malloc(sizeof(ListNode)); //生成头结点*head ListNode *s,*r,*pp; r=head; //尾指针初值指向头结点 r->next=NULL; scanf("%s",ch); //读入第一个结点的值 while(strcmp(ch,"#")!=0) { //输入#结束 pp=LocateNode(head,ch); if(pp==NULL) { s=(ListNode *)malloc(sizeof(ListNode)); //生成新的结点*s strcpy(s->data,ch); r->next=s; //新结点插入表尾 r=s; //尾指针r指向新的表尾 r->next=NULL; } scanf("%s",ch); //读入下一个结点的值 } return head; //返回表头指针 } int Insert(ListNode *head) //链表的插入 { ListNode *in,*p,*q; int wh; in=(ListNode *)malloc(sizeof(ListNode));in->next=NULL; //生成新结点p=(ListNode *)malloc(sizeof(ListNode));p->next=NULL; q=(ListNode *)malloc(sizeof(ListNode));q->next=NULL; scanf("%s",in->data); //输入插入的数据 scanf("%d",&wh); //输入插入数据的位置 for(p=head;wh>0;p=p->next,wh--); q=p->next; p->next=in; in->next=q; } void DeleteList(LinkList head,char *key) //链表的删除 { ListNode *p,*r,*q=head; p=LocateNode(head,key); //按key值查找结点的 if(p==NULL) exit(0); //若没有找到结点,退出 while(q->next!=p) //p为要删除的结点,q为p的前结点q=q->next; r=q->next; q->next=r->next; free(r); //释放结点*r } 四.程序运行结果: 实验项目名称:线性表的顺序存储结构上的基本运算 (所属课程:数据结构--用C语言描述) 院系:计算机科学与信息工程学院专业班级:网络工程 姓名:000000 学号:0000000000 实验日期:2016.10.20 实验地点:A-06 406 合作者:指导教师:孙高飞 本实验项目成绩:教师签字:日期: (以下为实验报告正文) 一、实验目的 本次实验的目的掌握顺序表的存储结构形式及其描述和基本运算的实现;掌握动 态链表结构及相关算法设计 实验要求:输入和验证程序例题。正确调试程序,记录程序运行结果。完成实验报 告。 二、实验条件 Windows7系统的电脑,vc++6.0软件,书本《数据结构--用c语言描述》 三、实验内容 3.1 根据41页代码,用c语言定义线性表的顺序存储结构。 3.2 根据42页算法2.1实现顺序表的按内容查找。 3.3 根据43页算法2.2实现顺序表的插入运算。 3.4 根据45页算法2.3实现顺序表的删除运算。 四、实验步骤 3.2实验步骤 (1)编写头文件,创建ElemType。 (2)根据根据41页代码,“用c语言定义线性表的顺序存储结构”定义顺序表。 (3)根据42页算法2.1实现顺序表的按内容查找,创建Locate函数。 (4)创建main函数,输入SeqList L的数据元素。 (5)输入要查找的数据元素的值,调用Locate函数,输出结果。 3.3实验步骤 (1)编写头文件,创建ElemType。 (2)根据41页代码,“用c语言定义线性表的顺序存储结构”定义顺序表。 (3)根据43页算法2.2实现顺序表的插入运算,创建InsList函数。 (4)创建printList函数,逐项输出顺序表内的元素及顺序表元素的个数。 (5)创建main函数,输入插入的元素和其位置,调用printLinst函数输出顺序表,调用IntList函数,再次调用printLinst函数输出顺序表。 3.4实验步骤 (1)编写头文件,创建ElemType。 (2)根据根据41页代码,“用c语言定义线性表的顺序存储结构”定义顺序表。 (3)根据45页算法2.3实现顺序表的删除运算,创建DelList函数。 (4)创建printList函数,逐项输出顺序表内的元素及顺序表元素的个数。 (5)创建main函数,输入删除元素的位置,调用printLinst函数输出顺序表,调用DelList函数,再次调用printLinst函数输出顺序表。 五、实验结果 (1)实验3.2顺序表的按内容查找 # include 管理学院信管专业12(1)班学号3112004734 姓名钟臻华协作者:无教师评定_________________ 实验题目线性表的基本操作 实验评分表 实验报告 一、实验目的与要求 1.本实验通过对线性表各种操作的算法设计,理解和掌握线性表的概 念、存储结构及操作要求,体会顺序和链式两种存储结构的特点; 2.根据操作的不同要求,选择合适的存储结构,设计并实现算法,对 算法进行时间复杂度分析,从而达到掌握数据结构的研究方法、算法设计和分析方法的目的。 二、实验内容 1.分别用顺序表、单链表、单循环链表实现约瑟夫问题的求解,并分 析基于不同存储结构算法的时间复杂度。如果采用顺序表实现时,每个元素出环并不执行删除操作,而将相应位置元素值设置为空,但计数时必须跳过值为空的元素,实现这种算法,并分析执行效率。 1.顺序表的不删除出环元素算法实现 public class Josephus3{ public Josephus3(int number,int start,int distance){//创建约瑟夫环并求解,参数指定环长度,起始位置,计数 //采用线性顺序表存储约瑟夫环的元素,元素类型是字符串,构造方法参数指定顺序表的容量 S eqList 实验报告 题目:完成线性表ADT的顺序存储和链式存储方式的实现 一、需求分析 1、本演示程序中,线性表的数据元素类型限定为整型 2、演示程序以用户和计算机的对话方式执行,即在计算机的终端上显示“提 示信息”之后由用户在键盘上键入演示程序规定的运算命令,相应的输出 结果显示在后面。 3、程序的执行命令包括: 创建、撤销、清空、插入、修改、删除、定位等线性表ADT各项基本操作二、概要设计 为实现上述功能,我们给出线性表的抽象数据类型定义,具体的有单向链,双向 链,顺序表等,同时对于上述功能的实现还采用有/无头结点两种方式来实现 1.线性表的抽象数据类型定义为 ADT List{ 数据对象:D={a i|a i∈ElemSet,i=1,2,…,n,n≥0} 数据关系:R1={|ai-1,ai∈D,i=2,…,n} 基本操作: InitList(&L) 操作结果:构造一个空的线性表L DestroyList(&L) 初始条件:线性表L已存在。 操作结果:销毁线性表L。 ClearList(&L) 初始条件:线性表L已存在。 操作结果:将L重置为空表。 ListEmpty(L) 初始条件:线性表L已存在。 操作结果:若L为空表,则返回TRUE,否则返回FALSE。 ListLength(L) 初始条件:线性表L已存在。 操作结果:返回L中的i个数据元素的值。 GetElem(L,i,&e) 初始条件:线性表L已存在,1≤i≤ListLength(L)。 操作结果:用e返回L中第i个数据元素的值。 LocateElem(L,e,compare()) 初始条件:线性表L已存在,compare()是数据元素判定函数 操作结果:返回L中第一个与e满足compare()的数据元素的位序。 若这样的数据元素不存在,则返回值为0. PriorElem(L,cur_e,&pre_e) 初始条件:线性表已存在 操作结果:若cur_e是L的数据元素,且不是第一个,则用pre_e 返回它的前驱,否则操作失败,pre_e无定义。 实验1 线性表的基本操作 一、需求分析 目的: 掌握线性表运算与存储概念,并对线性表进行基本操作。 1.初始化线性表; 2.向链表中特定位置插入数据; 3.删除链表中特定的数据; 4.查找链表中的容; 5.销毁单链表释放空间; 二、概要设计 ●基础题 主要函数: 初始化线性表InitList(List* L,int ms) 向顺序表指定位置插入元素InsertList(List* L,int item,int rc)删除指定元素值的顺序表记录DeleteList1(List* L,int item) 删除指定位置的顺序表记录 DeleteList2(List* L,int rc) 查找顺序表中的元素 FindList(List L,int item) 输出顺序表元素OutputList(List L) 实验步骤: 1,初始化顺序表 2,调用插入函数 3,在顺序表中查找指定的元素 4,在顺序表中删除指定的元素 5,在顺序表中删除指定位置的元素 6,遍历并输出顺序表 ●提高题 要求以较高的效率实现删除线性表中元素值在x到y(x和y自定义)之间的所有元素 方法: 按顺序取出元素并与x、y比较,若小于x且大于y,则存进新表中。 编程实现将两个有序的线性表进行合并,要求同样的数据元素只出现一次。 方法: 分别按顺序取出L1,L2的元素并进行比较,若相等则将L1元素放进L中,否则将L 1,L2元素按顺序放进L。 本程序主要包含7个函数 主函数main() 初始化线性表InitList(List* L,int ms) 向顺序表指定位置插入元素InsertList(List* L,int item,int rc)删除指定元素值的顺序表记录DeleteList1(List* L,int item) 删除指定位置的顺序表记录 DeleteList2(List* L,int rc) 查找顺序表中的元素 FindList(List L,int item) 输出顺序表元素OutputList(List L) 提高题的程序 void Combine(List* L1,List* L2,List* L) void DeleteList3(List* L,int x,int y) 二、详细设计 初始化线性表InitList(List* L,int ms) void InitList(List* L,int ms) { L->list=(int*)malloc(LIST_INIT_SIZE*sizeof(int)); L->size=0; L->MAXSIZE=LIST_INIT_SIZE; 南昌航空大学实验报告 课程名称:数据结构实验名称:实验一线性表的链式存储结构班级:080611 学生姓名:冯武明学号:16 指导教师评定:XXX 签名: XXX 题目:设计并实现以下算法:给出用单链表存储多项式的结构,利用后接法生成多项式的单链表结构,实现两个多项式相加的运算,并就地逆置相加后的多项式链式。 一、需求分析 ⒈先构造两个多项式链表,实现两个多项式的和及删除值为零元素的操作,不同用户输入 的多项式不同。 ⒉在演示过程序中,用户需敲击键盘输入值,即可观看结果。 ⒊程序执行的命令包括: (1)构造多项式链表A (2)构造多项式链表B (3)求两张链表的和(4)删除值为零元素,即不创建链表。 二、概要设计 ⒈为实现上述算法,需要线性表的抽象数据类型: ADT Stack { 数据对象:D={a i:|a i∈ElemSet,i=1…n,n≥0} 数据关系:R1={|a i-1,a i∈D,i=2,…n≥0} 基本操作: init(linklist *L) 操作结果: destroylist(List *L) clearlist(List *L) 初始条件:线性表L已经存在,1≤i≤ListLength(&L) 操作结果:用e返回L中第i个数据元素的值。 insfirst(link h,link s) 初始条件:数据元素e1,e2存在 操作结果:以e1,e2中的姓名项作为判定e1,e2是否相等的依据。 delfirst(link h,link *q) 初始条件:数据元素e1,e2存在 操作结果:以e1,e2中的姓名项(为字符串)的≤来判定e1,e2是否有 ≤的关系。 交通大学《算法与数据结构》课程 实验报告 班级:计算机科学与技术2014级2班 实验项目名称:线性表的顺序储存结构 实验项目性质: 实验所属课程:算法与数据结构 实验室(中心): B01407 指导教师:鲁云平 实验完成时间:2016 年 3 月21 日 一、实验目的 1、实现线性表的顺序存储结构 2、熟悉C++程序的基本结构,掌握程序中的头文件、实现文件和主文件之 间的相互关系及各自的作用 3、熟悉顺序表的基本操作方式,掌握顺序表相关操作的具体实现 二、实验容及要求 对顺序存储的线性表进行一些基本操作。主要包括: (1)插入:操作方式为在指定元素前插入、在指定元素之后插入、在指定位置完成插入 (2)删除:操作方式可分为删除指定元素、删除指定位置的元素等,尝试实现逻辑删除操作。 (3)显示数据 (4)查找:查询指定的元素(可根据某个数据成员完成查询操作) (5)定位操作:定位指定元素的序号 (6)更新:修改指定元素的数据 (7)数据文件的读写操作等。 其它操作可根据具体需要自行补充。 要求线性表采用类的定义,数据对象的类型自行定义。 三、实验设备及软件 VC6.0 四、设计方案 ㈠题目 线性表的顺序存储结构 ㈡设计的主要思路 1、新建SeqList.h头文件,定义SeqList模板类 2、设计类数据成员,包括:T *data(用于存放数组)、int maxSize (最大可容表项的项数)、int last(当前已存表项的最后位置) 3、设计类成员函数,主要包括: int search(T& x)const;//搜索x在表中位置,函数返回表项序号 int Locate(int i)const;//定位第i个表项,函数返回表项序号 bool getData(int i,T& x)const;//去第i个表项的值 void setData(int i,T& x)//用x修改第i个表项的值 bool Insert(int i,T& x);//插入x在第i个表项之后 bool Remove(int i,T& x); //删除第i个表项,通过x返回表项的值 bool IsEmpty();//判表空否,空则返回true;否则返回false bool IsFull();//判表满否,满则返回true;否则返回false void input(); //输入 void output();//输出 void ofile();/存储在文件中 void ifile();//读取文件并显示 ㈢主要功能 1、建立新表 2、对表进行插入(指定元素前、后以及指定位置插入)、删除(指定 元素删除及指定位置删除)、修改等操作 3、显示当前操作表的全部容 4、存储在文件中 5、从文件中读取表 五、主要代码 ㈠SeqList.h中的主要代码: 1、类成员声明部分: protected: T *data; //存放数组 int maxSize; //最大可容纳表项 实验一:线性表逆置(顺序表)实验报告 (一)问题的描述: 实现顺序表的逆置算法 (二)数据结构的设计: 顺序表是线性表的顺序存储形式,因此设计如下数据类型表示线性表: typedef struct { ElemType *elem; /* 存储空间基址*/ int length; /* 当前长度*/ int listsize; /* 当前分配的存储容量(以sizeof(ElemType)为单位) */ }SqList; (三)函数功能、参数说明及概要设计: 1.函数Status InitList(SqList *L) 功能说明:实现顺序表L的初始化 算法设计:为顺序表分配一块大小为LIST_INIT_SIZE的储存空间 2.函数int ListLength(SqList L) 功能说明:返回顺序表L长度 算法设计:返回顺序表中的length变量 3.函数Status ListInsert(SqList *L,int i,ElemType e) 功能说明:将元素e插入到顺序表L中的第i个节点 算法设计:判断顺序表是否已满,已满则加空间,未满则继续,将元素e插入到第i个元素之前,并将后面的元素依次往后移 4.函数Status ListTraverse(SqList L,void(*vi)(ElemType*)) 功能说明:依次对L的每个数据元素调用函数vi() 算法设计:依次对L的每个数据元素调用函数vi() 5.函数void Exchange(SqList *L) 功能说明:实现顺序表L的逆置 算法设计:用for循环将顺序表L中的第i个元素依次与第(i+length)个元素交换6.函数void print(ElemType *c) 功能说明:打印元素c 算法设计:打印元素c 2. (四)具体程序的实现 北京邮电大学电信工程学院 数据结构实验报告 实验名称:实验1——线性表 学生姓名: 班级: 班内序号: 学号: 日期: 1.实验要求 1、实验目的:熟悉C++语言的基本编程方法,掌握集成编译环境的调试方法 学习指针、模板类、异常处理的使用 掌握线性表的操作的实现方法 学习使用线性表解决实际问题的能力 2、实验内容: 题目1: 线性表的基本功能: 1、构造:使用头插法、尾插法两种方法 2、插入:要求建立的链表按照关键字从小到大有序 3、删除 4、查找 5、获取链表长度 6、销毁 7、其他:可自行定义 编写测试main()函数测试线性表的正确性。 2. 程序分析 2.1 存储结构 带头结点的单链表 2.2 关键算法分析 1.头插法 a、伪代码实现:在堆中建立新结点 将x写入到新结点的数据域 修改新结点的指针域 修改头结点的指针域,将新结点加入链表中b、代码实现: Linklist::Linklist(int a[],int n)//头插法 {front=new Node; front->next=NULL; for(int i=n-1;i>=0;i--) {Node*s=new Node; s->data=a[i]; s->next=front->next; front->next=s; } } 2、尾插法 a、伪代码实现:a.在堆中建立新结点 b.将a[i]写入到新结点的数据域 c.将新结点加入到链表中 d.修改修改尾指针 b、代码实现: Linklist::Linklist(int a[],int n,int m)//尾插法 {front=new Node; Node*r=front; for(int i=0;i 实验一线性表及其应用 一、实验目的 1.熟悉C语言的上机环境,进一步掌握C语言的结构特点。 2.掌握线性表的顺序存储结构的定义及C语言实现。 3.掌握线性表的链式存储结构——单链表的定义及C语言实现。 4.掌握线性表在顺序存储结构即顺序表中的各种基本操作。 5.掌握线性表在链式存储结构——单链表中的各种基本操作。 二、实验内容 1.顺序线性表的建立、插入及删除。 2.链式线性表的建立、插入及删除。 三、实验步骤 1.建立含n个数据元素的顺序表并输出该表中各元素的值及顺序表的长度。 2.利用前面的实验先建立一个顺序表L={21,23,14,5,56,17,31},然后在第i个位置插入元素68。 3.建立一个带头结点的单链表,结点的值域为整型数据。要求将用户输入的数据按尾插入法来建立相应单链表。 四、实现提示 1.由于C语言的数组类型也有随机存取的特点,一维数组的机内表示就是顺序结构。因此,可用C语言的一维数组实现线性表的顺序存储。 在此,我们利用C语言的结构体类型定义顺序表: #define MAXSIZE 1024 typedef int elemtype; /* 线性表中存放整型元素*/ typedef struct { elemtype vec[MAXSIZE]; int len; /* 顺序表的长度*/ }sequenlist; 将此结构定义放在一个头文件sqlist.h里,可避免在后面的参考程序中代码重复书写,另外在该头文件里给出顺序表的建立及常量的定义。 2. 注意如何取到第i个元素,在插入过程中注意溢出情况以及数组的下标与位序(顺序表中元素的次序)的区别。 3.单链表的结点结构除数据域外,还含有一个指针域。用C语言描述结点结构如下: typedef int elemtype; typedef struct node #include 姓名学号 ElemType data; //待插入元素 SqList L; //定义SqList类型变量 InitList_Sq(L); //初始化顺序表 printf("※1. 请输入所需建立的线性表的长度:"); scanf_s("%d", &LIST_MAX); printf("※2. 请录入数据:"); for (i = 0; i 数据结构实验一 1、实验目的 ?掌握线性表的逻辑特征 ?掌握线性表顺序存储结构的特点,熟练掌握顺序表的基本运算 2、实验内容: 建立顺序表,完成顺序表的基本操作:初始化、插入、删除、逆转、输出、销毁, 置空表、求表长、查找元素、判线性表是否为空; 1.问题描述:利用顺序表,设计一组输入数据(假定为一组整数),能够对顺序表进行如下操作: ?创建一个新的顺序表,实现动态空间分配的初始化; ?根据顺序表结点的位置插入一个新结点(位置插入),也可以根据给定的值进行插入(值插入),形成有序顺序表; ?根据顺序表结点的位置删除一个结点(位置删除),也可以根据给定的值删除对应的第一个结点,或者删除指定值的所有结点(值删除); ?利用最少的空间实现顺序表元素的逆转; ?实现顺序表的各个元素的输出; ?彻底销毁顺序线性表,回收所分配的空间; ?对顺序线性表的所有元素删除,置为空表; ?返回其数据元素个数; ?按序号查找,根据顺序表的特点,可以随机存取,直接可以定位于第i 个结点,查找该元素的值,对查找结果进行返回; ?按值查找,根据给定数据元素的值,只能顺序比较,查找该元素的位置,对查找结果进行返回; ?判断顺序表中是否有元素存在,对判断结果进行返回; .编写主程序,实现对各不同的算法调用。 2.实现要求: ?“初始化算法”的操作结果:构造一个空的顺序线性表。对顺序表的空间进行动态管理,实现动态分配、回收和增加存储空间; ?“位置插入算法”的初始条件:顺序线性表L 已存在,给定的元素位置为i,且1≤i≤ListLength(L)+1 ; 操作结果:在L 中第i 个位置之前插入新的数据元素e,L 的长度加1; ?“位置删除算法”的初始条件:顺序线性表L 已存在,1≤i≤ListLength(L) ; 操作结果:删除L 的第i 个数据元素,并用e 返回其值,L 的长度减1 ; ?“逆转算法”的初始条件:顺序线性表L 已存在; 操作结果:依次对L 的每个数据元素进行交换,为了使用最少的额外空间,对顺序表的元素进行交换; ?“输出算法”的初始条件:顺序线性表L 已存在; 操作结果:依次对L 的每个数据元素进行输出; ?“销毁算法”初始条件:顺序线性表L 已存在; /////////////////////////////////////////////////////////// //--------------------------------------------------------- // 顺序存储结构线性表基本操作纯C语言实现 // // a simple example of Sq_List by C language // // by wangweinoo1[PG] //--------------------------------------------------------- /////////////////////////////////////////////////////////// #include 数据结构试验报告 线性表 学院: 姓名: 学号: 时间: 专业班级: 线性表 一、实验目的 1.掌握线性结构中顺序表和链表的基本概念、基本操作和应用; 2.掌握线性表的基本操作:建表、插入、删除、输出等运算在顺序存储结构和链式存储结构上的实现。 3.通过本次实习加深对高级语言C语言的使用(特别是函数参数、指针类型、链表的使用)。熟悉线性表的基本运算在两种存储结构(顺序结构和链式结构)上的实现。 二、实验内容 1.编写生成线性表的函数,线性表的元素从键盘输入,分别使用顺序和链式存储结构存储;2.编写在线性表中插入一个元素的函数; 3.编写在线性表中删除一个元素的函数; 4.编写输出线性表的函数; 5.编写主函数,调用以上各函数,以便能观察出原线性表以及作了插入或删除后线性表的屏幕输出。 三、实验报告要求 1.画出程序流程图并做简单分析 2.源代码(包括主要结构、主要语句、函数注释说明) 3.运行结果(包括程序如何使用,输入数据和输出结果) 4.实验体会和问题分析 四、基本原理 (一)线性表是最常用的而且也是最简单的一种数据结构,线性表是N个数据元素的有限序列。 例如26个英文元素的字母表(A,B,C,D,···),其数据结构的描述为: Linear_list=(D,R) 其中,D={ a i |a i属于ElemSet,i=1,2,3,···},R={| i=2,3,4,…… }。 本实验是以数组的形式把线性表存放在计算机内存的一个连续的区域内,这样便有: LOC(a i+1)=LOC(a i)+m LOC(a i)=L0+m*(i-1) 其中,m是存放每个元素所占的内存字数,L0是a的地址,即首地址。 (二)程序说明 插入一个新元素到第i个位置,既把元素a i向后移一个位置,成为元素a i+1,把新元素放入到第i个位置,其他元素依次后移。插入后的表长是n+1(n是原表长)。 修改第i个元素,到第i个位置是把元素a i冲掉后存上新值。 删除第i个元素就是把余后的元素依次向前移一个位置。即:以元素a i+1,a i+2,···, 依次取代a i,a i+1,···。删除后的表长是n-1(n是原表长)。 (三)线性表链式存储(选作)。 五、实验程序 #include 哈尔滨工业大学计算机科学与技术学院 实验报告 课程名称:数据结构与算法 课程类型:必修 实验项目名称:线性表实验 实验题目:算术表达式求值 班级:0903201 学号:1090320110 姓名:王岳 一、实验目的 二、实验要求及实验环境 三、设计思想(本程序中的用到的所有数据类型的定义,主程序的流程图及各程序模块之间的调用关系) 1.逻辑设计 2.物理设计 四、测试结果 五、系统不足与经验体会 六、附录:源代码(带注释) #include else { this -> top--; return this -> ss[this -> top + 1]; } } void push(elementtype x) { if (this -> top == 511) printf("error:full!!!\n"); else { this -> top++; this -> ss[this -> top] = x; } } }; void change(int &i,int &j,double *a,char *input,stack 计算机系数据结构实验报告(1) 实验目的: 帮助学生掌握线性表的基本操作在顺序和链表这两种存储结构上的实现,尤以链表的操作和应用作为重点。 问题描述: 1、构造一个空的线性表L。 2、在线性表L的第i个元素之前插入新的元素e; 3、在线性表L中删除第i个元素,并用e返回其值。 实验要求: 1、分别利用顺序和链表存储结构实现线性表的存储,并设计出在不同的存储结构中线 性表的基本操作算法。 2、在实验过程中,对相同的操作在不同的存储结构下的时间复杂度和空间复杂度进行 分析。 算法分析: 由于两种存储结构都用来创建线性结构的数据表,可采用相同的输出模式和整体结构类似的算法,如下: 实验内容和过程: 顺序存储结构线性表程序清单: //顺序存储结构线性表的插入删除 #include int len; //当前元素个数 int listsize; //当前存储最大容量 }SqList; //构造一个空的线性表L int InitList(SqList &L) { =(ElemType *)malloc(LISTSIZE*sizeof(ElemType)); if (! exit(-2); //分配空间失败 =0; =LISTSIZE; } //在顺序线性表L中第i个位置之前插入新的元素e int ListInsert(SqList &L,int i,ElemType e) { if (i<1||i>+1) return -1; //i值不合法 if >= { ElemType *newelem=(ElemType *)realloc,+CREMENTSIZE)*sizeof(ElemType)); //存储空间已满,增加分配 if(!newelem) exit (-2); //分配失败 =newelem; +=CREMENTSIZE; } ElemType *q=&[i-1]) ; for (ElemType *p=&[]);p>=q;--p) *(p+1)=*p; //插入位置及其后的元素后移 *q=e; ++; return 1; } //在顺序线性表L中删除第i个元素,并用e返回其值 int ListDelete(SqList &L,int i,ElemType&e) { if (i<1||i> return -1; //i值不合法线性表实验报告
数据结构实验报告 实验一 线性表链式存储运算的算法实现
线性表顺序存储结构上的基本运算
完整版信管实验报告(线性表基本操作)
线性表ADT的顺序存储与链式存储实验报告
数据结构_实验1_线性表的基本操作
数据结构实验线性表的顺序存储结构
线性表的顺序储存结构
线性表逆置(顺序表)实验报告
数据结构实验一题目一线性表实验报告
《数据结构》实验一 线性表及其应用
线性表顺序存储实现、插入、删除操作
实验一线性表与应用(I)
数据结构实验一顺序表
顺序存储结构线性表基本操作 纯C语言实现
实验一 线性表
哈工大 数据结构 实验一 线性表的实验
数据结构实验线性表及其应用