线性表实验--归并两个递增顺序表合并为一个递减的顺序表

合集下载

1.将两个递增的有序链表合并为一个递增的有序链表。要求结果链表仍使用原来两个链表的存储空间。。。

1.将两个递增的有序链表合并为一个递增的有序链表。要求结果链表仍使用原来两个链表的存储空间。。。

1.将两个递增的有序链表合并为⼀个递增的有序链表。

要求结果
链表仍使⽤原来两个链表的存储空间。

1.这两个递增的链表都是有头节点的。

2.当有两个互相⽐较完之后还有剩余的情况,直接链接剩余的。

因为剩余的本⾝递增,本⾝没有重复的元素,不需要处理
void MeregeList(Linklist &La,LinkList &Lb,LinkLinst &Lc)
{
pa=La->next;pb=Lb->next;
Lc=pc=la;
while(pa&&pb)
{
if(pa->data < pb->data){pc->next=pa;pc=pa;pa=pa->next;}
else if(pa->data >pb->data){pc->next=pb;pc=pb;pb=pb->next;}
else{
pc->next=pa;pc=pa;pa=pa->next;
q=pb->next;delete pb;pb=q}
}
pc->next=pa?pa:pb;
delete Lb;
}。

数据结构:线性表期末单元测试与答案

数据结构:线性表期末单元测试与答案

线性表期末单元测试与答案顺序存储结构一、单选题1、顺序表中第一个元素的存储地址是100,每个元素的长度为2,则第5个元素的地址是()。

A.120B.100C.108D.110正确答案:C2、在n个结点的顺序表中,算法的时间复杂度是O(1)的操作是()。

A.将n个结点从小到大排序B.在第i个结点后插入一个新结点(1≤i≤n)C.访问第i个结点(1≤i≤n)和求第i个结点的直接前驱(2≤i≤n)D.删除第i个结点(1≤i≤n)正确答案:C3、向一个有127个元素的顺序表中插入一个新元素并保持原来顺序不变,平均要移动的元素个数为()。

A.8B.63.5C.7D.63正确答案:B4、将两个各有n个元素的有序顺序表归并成一个有序表,其最少的比较次数是()。

A.2n-1B.n-1C.2nD.n正确答案:D5、在一个长度为n的顺序表中,在第i个元素(1≤i≤n+1)之前插入一个新元素时须向后移动()个元素。

A.iB.n-i-1C.n-i+1D.n-i正确答案:C6、线性表L=(a1,a2,……an),下列说法正确的是()。

A.除第一个和最后一个元素外,其余每个元素都有一个且仅有一个直接前驱和直接后继B.线性表中至少有一个元素C.表中诸元素的排列必须是由小到大或由大到小D.每个元素都有一个直接前驱和一个直接后继正确答案:A7、在长度为n的顺序表中插入一个元素的时间复杂度为()。

A.O(log2n)B. O(n)C.O(1)D.O(n2)正确答案:B8、在长度为n的顺序表中删除一个元素的时间复杂度为()。

A.O(log2n)B. O(n2)C.O(n)D.O(1)正确答案:C9、将两个长度分别为n、m的递增有序顺序表归并成一个有序顺序表,其最少的比较次数是()(MIN表示取最小值)。

A.mB.m+nC.nD.MIN(m,n)正确答案:D10、下述()是顺序存储结构的优点。

A.方便地运用于各种逻辑结构的存储表示B.存储密度大C.删除运算方使D.插入运算方便正确答案:B11、线性表的顺序存储结构是一种()。

数据结构实验报告-线性表(顺序表实现)

数据结构实验报告-线性表(顺序表实现)

实验1:线性表(顺序表的实现)一、实验项目名称顺序表基本操作的实现二、实验目的掌握线性表的基本操作在顺序存储结构上的实现。

三、实验基本原理顺序表是由地址连续的的向量实现的,便于实现随机访问。

顺序表进行插入和删除运算时,平均需要移动表中大约一半的数据元素,容量难以扩充四、主要仪器设备及耗材Window 11、Dev-C++5.11五、实验步骤1.导入库和一些预定义:2.定义顺序表:3.初始化:4.插入元素:5.查询元素:6.删除元素:7.销毁顺序表:8.清空顺序表:9.顺序表长度:10.判空:11.定位满足大小关系的元素(默认小于):12.查询前驱:13.查询后继:14.输出顺序表15.归并顺序表16.写测试程序以及主函数对顺序表的每一个操作写一个测试函数,然后在主函数用while+switch-case的方式实现一个带菜单的简易测试程序,代码见“实验完整代码”。

实验完整代码:#include <bits/stdc++.h>using namespace std;#define error 0#define overflow -2#define initSize 100#define addSize 10#define compareTo <=typedef int ElemType;struct List{ElemType *elem;int len;int listsize;}L;void init(List &L){L.elem = (ElemType *) malloc(initSize * sizeof(ElemType)); if(!L.elem){cout << "分配内存失败!";exit(overflow);}L.len = 0;L.listsize = initSize;}void destroy(List &L){free(L.elem);L.len = L.listsize = 0;}void clear(List &L){L.len = 0;}bool empty(List L){if(L.len == 0) return true;else return false;}int length(List L){return L.len;}ElemType getElem(List L,int i){if(i < 1 || i > L.len + 1){cout << "下标越界!";exit(error);}return L.elem[i - 1];}bool compare(ElemType a,ElemType b) {return a compareTo b;}int locateElem(List L,ElemType e) {for(int i = 0;i < L.len;i++){if(compare(L.elem[i],e))return i;}return -1;}int check1(List L,ElemType e){int idx = -1;for(int i = 0;i < L.len;i++)if(L.elem[i] == e)idx = i;return idx;}bool check2(List L,ElemType e){int idx = -1;for(int i = L.len - 1;i >= 0;i--)if(L.elem[i] == e)idx = i;return idx;}int priorElem(List L,ElemType cur_e,ElemType pre_e[]) {int idx = check1(L,cur_e);if(idx == 0 || idx == -1){string str = "";str = idx == 0 ? "无前驱结点" : "不存在该元素";cout << str;exit(error);}int cnt = 0;for(int i = 1;i < L.len;i++){if(L.elem[i] == cur_e){pre_e[cnt ++] = L.elem[i - 1];}}return cnt;}int nextElem(List L,ElemType cur_e,ElemType next_e[]){int idx = check2(L,cur_e);if(idx == L.len - 1 || idx == - 1){string str = "";str = idx == -1 ? "不存在该元素" : "无后驱结点";cout << str;exit(error);}int cnt = 0;for(int i = 0;i < L.len - 1;i++){if(L.elem[i] == cur_e){next_e[cnt ++] = L.elem[i + 1];}}return cnt;}void insert(List &L,int i,ElemType e){if(i < 1 || i > L.len + 1){cout << "下标越界!";exit(error);}if(L.len >= L.listsize){ElemType *newbase = (ElemType *)realloc(L.elem,(L.listsize + addSize) * sizeof(ElemType));if(!newbase){cout << "内存分配失败!";exit(overflow);}L.elem = newbase;L.listsize += addSize;for(int j = L.len;j > i - 1;j--)L.elem[j] = L.elem[j - 1];L.elem[i - 1] = e;L.len ++;}void deleteList(List &L,int i,ElemType &e){if(i < 1 || i > L.len + 1){cout << "下标越界!";exit(error);}e = L.elem[i - 1];for(int j = i - 1;j < L.len;j++)L.elem[j] = L.elem[j + 1];L.len --;}void merge(List L,List L2,List &L3){L3.elem = (ElemType *)malloc((L.len + L2.len) * sizeof(ElemType)); L3.len = L.len + L2.len;L3.listsize = initSize;if(!L3.elem){cout << "内存分配异常";exit(overflow);}int i = 0,j = 0,k = 0;while(i < L.len && j < L2.len){if(L.elem[i] <= L2.elem[j])L3.elem[k ++] = L.elem[i ++];else L3.elem[k ++] = L2.elem[j ++];}while(i < L.len)L3.elem[k ++] = L.elem[i ++];while(j < L2.len)L3.elem[k ++] = L2.elem[j ++];}bool visit(List L){if(L.len == 0) return false;for(int i = 0;i < L.len;i++)cout << L.elem[i] << " ";cout << endl;return true;}void listTraverse(List L){if(!visit(L)) return;}void partion(List *L){int a[100000],b[100000],len3 = 0,len2 = 0; memset(a,0,sizeof a);memset(b,0,sizeof b);for(int i = 0;i < L->len;i++){if(L->elem[i] % 2 == 0)b[len2 ++] = L->elem[i];elsea[len3 ++] = L->elem[i];}for(int i = 0;i < len3;i++)L->elem[i] = a[i];for(int i = 0,j = len3;i < len2;i++,j++) L->elem[j] = b[i];cout << "输出顺序表:" << endl;for(int i = 0;i < L->len;i++)cout << L->elem[i] << " ";cout << endl;}//以下是测试函数------------------------------------void test1(List &list){init(list);cout << "初始化完成!" << endl;}void test2(List &list){if(list.listsize == 0)cout << "线性表不存在!" << endl;else{int len;ElemType num;cout << "选择插入的元素数量:" << endl;cin >> len;cout << "依次输入要插入的元素:" << endl;for(int i = 1;i <= len;i++){cin >> num;insert(list,i,num);}cout << "操作成功!" << endl;}}void test3(){if(L.listsize == 0)cout << "线性表不存在!" << endl;else{cout << "请输入要返回的元素的下标" << endl;int idx;cin >> idx;cout << "线性表中第" << idx << "个元素是:" << getElem(L,idx) << endl;}}void test4(){if(L.listsize == 0)cout << "线性表不存在!" << endl;else{int idx;ElemType num;cout << "请输入要删除的元素在线性表的位置" << endl;cin >> idx;deleteList(L,idx,num);cout << "操作成功!" << endl << "被删除的元素是:" << num << endl; }}void test5(){if(L.listsize == 0)cout << "线性表不存在!" << endl;else{destroy(L);cout << "线性表已被销毁" << endl;}}void test6(){if(L.listsize == 0)cout << "线性表不存在!" << endl;else{clear(L);cout << "线性表已被清空" << endl;}}void test7(){if(L.listsize == 0)cout << "线性表不存在!" << endl;else cout << "线性表的长度现在是:" << length(L) << endl;}void test8(){if(L.listsize == 0)cout << "线性表不存在!" << endl;else if(empty(L))cout << "线性表现在为空" << endl;else cout << "线性表现在非空" << endl;}void test9(){if(L.listsize == 0)cout << "线性表不存在!" << endl;else{ElemType num;cout << "请输入待判定的元素:" << endl;cin >> num;cout << "第一个与目标元素满足大小关系的元素的位置:" << locateElem(L,num) << endl;}}void test10(){if(L.listsize == 0)cout << "线性表不存在!" << endl;else{ElemType num,num2[initSize / 2];cout << "请输入参照元素:" << endl;cin >> num;int len = priorElem(L,num,num2);cout << num << "的前驱为:" << endl;for(int i = 0;i < len;i++)cout << num2[i] << " ";cout << endl;}}void test11(){if(L.listsize == 0)cout << "线性表不存在!" << endl;else{ElemType num,num2[initSize / 2];cout << "请输入参照元素:" << endl;cin >> num;int len = nextElem(L,num,num2);cout << num << "的后继为:" << endl;for(int i = 0;i < len;i++)cout << num2[i] << " ";cout << endl;}}void test12(List list){if(L.listsize == 0)cout << "线性表不存在!" << endl;else{cout << "输出线性表所有元素:" << endl;listTraverse(list);}}void test13(){if(L.listsize == 0)cout << "初始线性表不存在!" << endl; else{List L2,L3;cout << "初始化一个新线性表" << endl;test1(L2);test2(L2);cout << "归并两个线性表" << endl;merge(L,L2,L3);cout << "归并成功!" << endl;cout << "输出合并后的线性表" << endl;listTraverse(L3);}}void test14(){partion(&L);cout << "奇偶数分区成功!" << endl;}int main(){std::ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);int op = 0;while(op != 15){cout << "-----------------menu--------------------" << endl;cout << "--------------1:初始化------------------" << endl;cout << "--------------2:插入元素----------------" << endl;cout << "--------------3:查询元素----------------" << endl;cout << "--------------4:删除元素----------------" << endl;cout << "--------------5:销毁线性表--------------" << endl;cout << "--------------6:清空线性表--------------" << endl;cout << "--------------7:线性表长度--------------" << endl;cout << "--------------8:线性表是否为空----------" << endl;cout << "--------------9:定位满足大小关系的元素--" << endl;cout << "--------------10:查询前驱---------------" << endl;cout << "--------------11:查询后继---------------" << endl;cout << "--------------12:输出线性表-------------" << endl;cout << "--------------13:归并线性表-------------" << endl;cout << "--------------14:奇偶分区---------------" << endl;cout << "--------------15: 退出测试程序-----------" << endl;cout << "请输入指令编号:" << endl; if(!(cin >> op)){cin.clear();cin.ignore(INT_MAX,'\n');cout << "请输入整数!" << endl;continue;}switch(op){case 1:test1(L);break;case 2:test2(L);break;case 3:test3();break;case 4:test4();break;case 5:test5();break;case 6:test6();break;case 7:test7();break;case 8:test8();break;case 9:test9();break;case 10:test10();break;case 11:test11();break;case 12:test12(L);break;case 13:test13();break;case 14:test14();break;case 15:cout << "测试结束!" << endl;default:cout << "请输入正确的指令编号!" << endl;}}return 0;}六、实验数据及处理结果1.初始化:2.插入元素3.查询元素(返回的是数组下标,下标从0开始)4.删除元素(位置从1开始)5.销毁顺序表6.清空顺序表7.顺序表长度(销毁或清空操作前)8.判空(销毁或清空操作前)9.定位满足大小关系的元素(销毁或清空操作前)说明:这里默认找第一个小于目标元素的位置且下标从0开始,当前顺序表的数据为:1 4 2 510.前驱(销毁或清空操作前)11.后继(销毁或清空操作前)12.输出顺序表(销毁或清空操作前)13.归并顺序表(销毁或清空操作前)七、思考讨论题或体会或对改进实验的建议通过本次实验,我掌握了定义线性表的顺序存储类型,加深了对顺序存储结构的理解,进一步巩固和理解了顺序表的基本操作,如建立、查找、插入和删除等。

例2.2设计一个算法,将x插入到一个有序(从小到大排序)的

例2.2设计一个算法,将x插入到一个有序(从小到大排序)的

SqList *merge(SqList *p, SqList *q) { SqList *r; int i=0,j=0,k=0; r=(SqList *)malloc(sizeof(SqList)); while (i<p->length && j<q->length) { if (p->data[i]<q-> data[j]) { r-> data[k]=p-> data[i]; i++;k++; } else { r-> data[k]=q-> data[j]; j++;k++; } }
本算法实际上是采用尾插法建立两个新表。 所以,尾插法建表算法是很多类似习题的基础!
例2.6 有一个带头结点的单链表head,其ElemType 类型为char,设计一个算法使其元素递增有序。
解:若原单链表中有一个或以上的数据结点 ,先构 造只含一个数据结点的有序表 (只含一个数据结点的 单链表一定是有序表 ) 。扫描原单链表余下的结点 *p( 直到 p==NULL 为止 ), 在有序表中通过比较找插入 *p 的前驱结点 *q, 然后将 *p 插入到 *q 之后 ( 这里实际 上采用的是直接插入排序方法)。
答:可以简单地推算,得容易得出D,A,B,C是 不可能的,因为D先出来,说明A,B,C,D均在栈中, 按照入栈顺序,在栈中顺序应为D,C,B,A,出栈的 顺序只能是D,C,B,A。所以本题答案为D。
例 3.3 已知一个栈的进栈序列是 1,2,3,…,n, 其输出 序列是p1,p2,…,pn,若p1=n,则pi的值 。 (A) i (B) n-i
/*r保存*p结点后继结点的指针*/

[数据结构]线性表合并

[数据结构]线性表合并

[数据结构]线性表合并⼀、问题描述线性表合并是程序设计语⾔编译中的⼀个最基本的问题,现在有两个线性表LA和LB,其中的元素都是按照⾮递减有序排列的,要将两个LA 和LB归并为⼀个新的线性表LC,使得LC中的元素仍然是⾮递减有序的。

本实验的合并⽅式有两种。

第⼀种是分别取LA和LB的第⼀个元素,即各⾃的最⼩的元素进⾏⽐较,选择较⼩的元素加⼊LC尾部,然后重复以上步骤;当LA表空了或者LB表空了的时候,将另⼀个表剩下的元素按照顺序加⼊LC的尾部,从⽽保证LC中元素有序。

第⼆种⽅式是以LA为母表,将LB中的元素向LA中插⼊,直到LB表空,得到的新的LA表就是最终需要的LC表。

本实验采⽤线性表实现,采⽤了链式表⽰和顺序表⽰两种实现⽅式。

根据各⾃的特点,链式表⽰对应了第⼆种合并⽅式,⽽顺序表⽰对应了第⼀种合并⽅式。

⼆、数据结构——线性表1、链式表⽰:链式表⽰的特点是⽤⼀组任意的存储单元存储线性表的数据元素,每个元素包括两个域——数据域和指针域。

其中数据域是存储数据信息的域,本实验中默认所处理的数据元素都是在整型(int)范围内的数据;指针域中存储⼀个指针,指向当前元素的下⼀个元素的地址。

n个结点按照如上关系连接起来,形成⼀个链表,就是线性表的链式表⽰。

由于链式表⽰对于数据的插⼊、删除操作⽐较⽅便,⽽查找⼀个元素的效率⽐较低下,于是选择⽤第⼆种合并⽅式,即以LA为母表,将LB 中的元素⼀个⼀个插⼊LA中。

⾸先,每个结点的是⼀个node型的变量,包含⼀个int型变量Num和⼀个node*型的指针变量next。

正如上⽂所描述,Num保存该结点的数值,next保存逻辑上下⼀个结点的地址。

然后定义了⼀个名叫MyList的类,其中有private型的变量包含线性表⾃⾝的基本变量,⽐如元素个数、⾸地址等等;还包括public型的线性表的基本操作函数,⽐如初始化(InitList)、清除(ClearList)、打印(PrintList)等等。

实验一 线性表操作实验题目

实验一 线性表操作实验题目

实验一线性表操作实验目的:(1)掌握在顺序、链式存储结构上实现线性表的各种基本运算。

(2)重点掌握单链表的基本操作及应用。

(3)学会综合运用C语言中函数、指针、结构体等知识进行编程。

本次实验中,下列实验项目选做一。

1、顺序表的综合操作[问题描述]设计算法,实现线性结构上的顺序表的建立以及元素的查找、插入、删除等操作。

[基本要求及提示](1)从键盘输入10个整数,建立顺序表。

(2)从键盘输入1个整数,在顺序表中查找该结点的位置。

若找到,输出结点的位置;若找不到,则显示“找不到”。

(3)从键盘输入2个整数,一个表示欲插入的位置i,另一个表示欲插入的数值x,将x插入在对应位置上,输出顺序表所有结点值,观察输出结果。

(4)从键盘输入1个整数,表示欲删除结点的位置,输出顺序表所有结点值,观察输出结果。

(5)要求程序通过一个主菜单进行控制,在主菜单界面通过选择菜单项的序号来调用各功能函数。

2、线性表的逆置[问题描述](1)以顺序存储结构实现线性表的就地逆置。

(2)以链式存储结构实现线性表的就地逆置。

注:线性表的就地逆置就是在原表的存储空间内将线性表(a1,a2,a3,…,an)逆置为(an,an-1,…,a2,a1)。

[基本要求及提示](1)从键盘输入10个整数,建立顺序表。

(2)实现顺序表逆置,并将结果输出。

(3)从键盘输入10个整数,建立链表。

(4)实现链表逆置,并将结果输出。

(5)要求程序通过一个主菜单进行控制,在主菜单界面通过选择菜单项的序号来调用各功能函数。

也可以将顺序表和链表上的操作分开,做成两个程序。

3、线性表的元素分类[问题描述]已知线性表中元素均为正整数,设计算法将其调整为前后两部分,前边均为奇数,后边均为偶数。

即实现线性表的元素的分类。

[基本要求及提示](6)从键盘输入10个整数,建立顺序表。

(7)实现顺序表上的元素分类,并输出结果。

(8)从键盘输入10个整数,建立链表。

(9)实现链表的元素分类,并输出结果。

数据结构实验两个有序顺序表的合并

数据结构实验两个有序顺序表的合并

南昌大学实验报告学生姓名:李木子学号:8000113146 专业班级:软工133 实验类型:□验证□综合□设计□创新实验日期:实验成绩:一、实验项目名称两个有序顺序表的结合二、实验目的顺序表的创建1.实现顺序表的追加2.实现顺序表的显示3.两顺序表的合并三、实验基本原理四、主要仪器设备及耗材电脑,VC6.0五、实验步骤/*******************************************//* 顺序表的创建 *//* 1.实现顺序表的追加 *//* 2.实现顺序表的显示 *//* 3.两顺序表的合并 *//*******************************************/#include <stdio.h>#include <stdlib.h>#define MAXSIZE 100typedef int datatype;/************************************//* 顺序表结构体的定义 *//************************************/typedef struct{datatype a[MAXSIZE];int size;}sequence_list;/************************************//* 函数声明 *//************************************/void init(sequence_list *slt);void append(sequence_list *slt,datatype x);void display(sequence_list slt);int find(sequence_list slt ,datatype x);void dele(sequence_list *slt,datatype x);void sort(sequence_list *s);void combine( sequence_list *s1 ,sequence_list *s2 ,sequence_list *s3);/************************************//* 顺序表的初始化函数 *//************************************/void init(sequence_list *slt){slt->size=0;}/************************************//* 顺序表的追加函数 *//************************************/void append(sequence_list *slt,datatype x){if(slt->size==MAXSIZE){printf("\n顺序表是满的!");exit(1);}slt->a[slt->size]=x ;slt->size=slt->size+1;}/************************************/ /* 顺序表的显示函数 */ /************************************/ void display(sequence_list slt){int i;if(!slt.size){printf("\n顺序表为空");}else{for(i=0;i<slt.size;i++)printf("\n%d\n",slt.a[i]);}}/************************************/ /* 顺序表的查找函数 */ /* 返回所查数据的下标 */ /************************************/ int find(sequence_list slt ,datatype x) {int i=0;while(i<slt.size &&slt.a[i]!=x)i++;return(i<slt.size? i:-1);}/************************************/ /* 顺序表的删除函数 */ /************************************/ void dele(sequence_list *slt,datatype x) {int i=0;i=find(*slt,x);for(;i<slt->size-1;i++)slt->a[i]=slt->a [i+1];slt->size--;}/************************************//* 顺序表的插入函数 *//************************************/ void insert(sequence_list *slt,datatype x) {int i=0;i=find(*slt,x);for(;i<slt->size-1;i++)slt->a[i+1]=slt->a [i];slt->size++;}/************************************//* 顺序表排序 *//************************************/ void sort(sequence_list *s){int i ;int j ;int temp ;for(i=0;i<s->size-1;i++){for(j=i+1;j<s->size;j++){if(s->a[i]>=s->a[j]){temp=s->a[i];s->a[i]=s->a[j];s->a[j]=temp;}}}}/************************************//* 两个有序顺序表连接函数 *//************************************/void combine( sequence_list *s1 , sequence_list *s2 , sequence_list *s3 ) {int i=0;int j=0;int k=0;while( i < s1->size && j < s2->size){if(s1->a[i]<=s2->a[j]){s3->a[k]=s1->a[i];i++;}else{s3->a[k]=s2->a[j];j++;}k++;}if(i==s1->size){while(j<s2->size){s3->a[k]=s2->a[j];k++;j++;}}if(j==s2->size){while(i<s1->size){s3->a[k]=s1->a[i];k++;}}s3->size=k;}/************************************/ /* 主函数 */ /************************************/ int main(){int i ;int j ;int x ;int n ;sequence_list list1 ;sequence_list list2 ;sequence_list list3 ;init(&list1);printf("第一个顺序表元素个数:\n");scanf("%d",&n);printf("第一个顺序表输入:\n");for(i=0; i<n ; i++){scanf("%d",&list1.a[i]);list1.size++;}sort(&list1);printf("排序后\n");display(list1);init(&list2);printf("第二个顺序表元素个数:\n");scanf("%d",&n);printf("第二个顺序表输入:\n");for(i=0; i<n ; i++){scanf("%d",&list2.a[i]);list2.size++;}sort(&list2);printf("排序后\n");display(list2);init(&list3);combine(&list1 ,&list2 ,&list3);printf("表一与表二连接后:\n");display(list3);return0;}六、实验数据及处理结果七、思考讨论题或体会或对改进实验的认识八、参考资料[1]《数据结构(c语言版)(第三版)》,李云清,人民邮电出版社[2]《C语言程序设计》,苏小红,高等教育出版社教你如何用WORD文档(2012-06-27 192246)转载▼标签:杂谈1. 问:WORD 里边怎样设置每页不同的页眉?如何使不同的章节显示的页眉不同?答:分节,每节可以设置不同的页眉。

实验一顺序表的基本操作实验报告

实验一顺序表的基本操作实验报告

元素之后的所有数据都前移一个位置,最将线性表长减1。

3.顺序表查找操作的基本步骤:要在顺序表中查找一个给定值的数据元素则可以采用顺序查找的方法,从表中第 1 个数据元素开始依次将值与给定值进行比较,若相等则返回该数据元素在顺序表中的位置,否则返回0 值。

线性表的动态分配顺序存储结构—C语言实现#define MaxSize 50//存储空间的分配量Typedef char ElemType;Typedef struct{ElemType data[MaxSize];int length; //表长度(表中有多少个元素)}SqList;动态创建一个空顺序表的算法:void InitList(SqList *&L) //初始化线性表{L=(SqList *)malloc(sizeof(SqList)); //分配存放线性表的空间L->length=0; //置空线性表长度为0}线性表的插入:status Sqlist_insert(Sqlist &L,int i,Elemtype x)/*在顺序表L中第i个元素前插入新元素x*/{ if (i<1||i>L.length+1) return ERROR; /*插入位置不正确则出错*/if (L.length>=MAXLEN)return OVERFLOW;/*顺序表L中已放满元素,再做插入操作则溢出*/for(j=L.length-1;j>=i-1;j--)L.elem[j+1]=L.elem[j]; /*将第i个元素及后续元素位置向后移一位*/L.elem[i-1]=x; /*在第i个元素位置处插入新元素x*/L.length++; /*顺序表L的长度加1*/return OK;}线性表的删除:status Sqlist_delete(Sqlist &L,int i,Elemtype &e)/*在顺序表L中删除第i个元素*{ if (i<1||i>L.length) return ERROR; /*删除位置不正确则出错*/for(j=i;j<=L.length-1;j++)L.elem[j-1]=L.elem[j]; /*将第i+1个元素及后继元素位置向前移一位*/L.length--;/*顺序表L的长度减1*/return OK;}线性表元素的查找:int LocateElem(SqList *L, ElemType e) //按元素值查找{int i=0;while (i<L->length && L->data[i]!=e)i++; //查找元素eif (i>=L->length) //未找到时返回0return 0;elsereturn i+1; //找到后返回其逻辑序号}输出线性表:void DispList(SqList *L) //输出线性表{int i;if (ListEmpty(L)) return;for (i=0;i<L->length;i++)printf("%c ",L->data[i]);printf("\n");}输出线性表第i个元素的值:bool GetElem(SqList *L,int i,ElemType &e)//求线性表中某个数据元素值{if (i<1 || i>L->length)return false; //参数错误时返回falsee=L->data[i-1]; //取元素值return true; //成功找到元素时返回true}代码:#include <stdio.h>#include <malloc.h>#define MaxSize 50typedef char ElemType;typedef struct{ElemType data[MaxSize];int length;} SqList;void InitList(SqList *&L);void DestroyList(SqList *L);bool ListEmpty(SqList *L);int ListLength(SqList *L);void DispList(SqList *L);bool GetElem(SqList *L,int i,ElemType &e);int LocateElem(SqList *L, ElemType e);bool ListInsert(SqList *&L,int i,ElemType e);bool ListDelete(SqList *&L,int i,ElemType &e);void InitList(SqList *&L)//初始化线性表{L=(SqList *)malloc(sizeof(SqList));//分配存放线性表的空间L->length=0;//置空线性表长度为0 }void DestroyList(SqList *L)//销毁线性表{free(L);}bool ListEmpty(SqList *L)//判线性表是否为空表{return(L->length==0);}int ListLength(SqList *L)//求线性表的长度{return(L->length);}void DispList(SqList *L)//输出线性表{int i;if (ListEmpty(L)) return;for (i=0;i<L->length;i++)printf("%c ",L->data[i]);printf("\n");}bool GetElem(SqList *L,int i,ElemType &e)//求线性表中某个数据元素值{if (i<1 || i>L->length)return false;//参数错误时返回falsee=L->data[i-1];//取元素值return true;//成功找到元素时返回true}int LocateElem(SqList *L, ElemType e)//按元素值查找{int i=0;while (i<L->length && L->data[i]!=e)i++;//查找元素eif (i>=L->length)//未找到时返回0return 0;elsereturn i+1;//找到后返回其逻辑序号}bool ListInsert(SqList *&L,int i,ElemType e)//插入数据元素{int j;if (i<1 || i>L->length+1)return false;//参数错误时返回falsei--;//将顺序表逻辑序号转化为物理序号for (j=L->length;j>i;j--)//将data[i]及后面元素后移一个位置L->data[j]=L->data[j-1];L->data[i]=e;//插入元素eL->length++;//顺序表长度增1return true;//成功插入返回true}bool ListDelete(SqList *&L,int i,ElemType &e)//删除数据元素{int j;if (i<1 || i>L->length)//参数错误时返回falsereturn false;i--;//将顺序表逻辑序号转化为物理序号e=L->data[i];for (j=i;j<L->length-1;j++)//将data[i]之后的元素前移一个位置L->data[j]=L->data[j+1];L->length--;//顺序表长度减1return true;//成功删除返回true}void main(){SqList *L;ElemType e;printf("顺序表的基本运算如下:\n");printf(" (1)初始化顺序表L\n");InitList(L);printf(" (2)依次采用尾插法插入a,b,c,d,e元素\n");ListInsert(L,1,'a');ListInsert(L,2,'b');ListInsert(L,3,'c');ListInsert(L,4,'d');ListInsert(L,5,'e');printf(" (3)输出顺序表L:");DispList(L);printf(" (4)顺序表L长度=%d\n",ListLength(L));printf(" (5)顺序表L为%s\n",(ListEmpty(L)?"空":"非空"));GetElem(L,3,e);printf(" (6)顺序表L的第3个元素=%c\n",e);实验结果:心得体会:通过本次实验,实现了数据结构在程序设计上的作用,了解了数据结构语言,加深了对c语言的认识掌并掌握了线性表的顺序存储结构的表示和实现方法,掌握顺序表基本操作的算法实现,同时了解了顺序表的应用。

线性表的基本操作实验报告

线性表的基本操作实验报告

线性表的基本操作实验报告实验一:线性表的基本操作【实验目的】学习掌握线性表的顺序存储结构、链式存储结构的设计与操作。

对顺序表建立、插入、删除的基本操作,对单链表建立、插入、删除的基本操作算法。

【实验内容】1.顺序表的实践1) 建立4个元素的顺序表s=sqlist[]={1,2,3,4,5},实现顺序表建立的基本操作。

2) 在sqlist []={1,2,3,4,5}的元素4和5之间插入一个元素9,实现顺序表插入的基本操作。

3) 在sqlist []={1,2,3,4,9,5}中删除指定位置(i=5)上的元素9,实现顺序表的删除的基本操作。

2.单链表的实践3.1) 建立一个包括头结点和4个结点的(5,4,2,1)的单链表,实现单链表建立的基本操作。

2) 将该单链表的所有元素显示出来。

3) 在已建好的单链表中的指定位置(i=3)插入一个结点3,实现单链表插入的基本操作。

4) 在一个包括头结点和5个结点的(5,4,3,2,1)的单链表的指定位置(如i=2)删除一个结点,实现单链表删除的基本操作。

5) 实现单链表的求表长操作。

【实验步骤】1.打开VC++。

2.建立工程:点File->New,选Project标签,在列表中选Win32 Console Application,再在右边的框里为工程起好名字,选好路径,点OK->finish。

至此工程建立完毕。

3.创建源文件或头文件:点File->New,选File标签,在列表里选C++ Source File。

给文件起好名字,选好路径,点OK。

至此一个源文件就被添加到了刚创建的工程之中。

4.写好代码5.编译->链接->调试1、#include "stdio.h"#include "malloc.h"#define OK 1#define OVERFLOW -2#define ERROR 0#define LIST_INIT_SIZE 100#define LISTINCREMENT 10typedef int ElemType;typedef int Status;typedef struct {ElemType *elem;int length;int listsize;} SqList;Status InitList( SqList &L ) {int i,n;L.elem = (ElemType*) malloc (LIST_INIT_SIZE*sizeof (ElemType)); if (!L.elem) return(OVERFLOW);printf("输入元素的个数:");scanf("%d",&n);printf("输入各元素的值:");for(i=0;i<n;i++)scanf("%d",&L.elem[i]);L.length = n;L.listsize = LIST_INIT_SIZE;return OK;}Status ListInsert(SqList &L, int i, ElemType e) {ElemType *newbase,*p,*q;if (i < 1 || i > L.length+1) return ERROR;if (L.length >= L.listsize) {newbase = (ElemType *)realloc(L.elem, (L.listsize+LISTINCREMENT)*sizeof (ElemType));if (!newbase) return(OVERFLOW);L.elem = newbase;L.listsize += LISTINCREMENT;}q = &(L.elem[i-1]);for (p = &(L.elem[L.length-1]); p >= q; --p)*(p+1) = *p;*q = e;++L.length;return OK;}Status ListDelete(SqList &L, int i, ElemType &e) {ElemType *p,*q;if((i < 1) || (i > L.length)) return ERROR;p = &(L.elem[i-1]);e = *p;q = L.elem+L.length-1;for (++p; p <= q; ++p) *(p-1) = *p;--L.length;return OK;}void VisitList(SqList L){ int i;for(i=0;i<L.length;i++)printf("%d\t",L.elem[i]);}void main(){int i,e;SqList L;InitList(L) ;VisitList(L);printf("输入插入位置和值:");scanf("%d,%d",&i,&e);printf("插入元素后,表中的值:"); ListInsert(L,i,e);VisitList(L);printf("输入删除位置:");scanf("%d",&i);printf("删除元素后,表中的值:"); ListDelete(L,i,e);VisitList(L);}2、#include "stdio.h"#include "malloc.h"#define OK 1#define OVERFLOW -2#define LIST_INIT_SIZE 100 #define LISTINCREMENT 10 typedef int ElemType;typedef int Status;typedef struct {ElemType *elem;int length;int listsize;} SqList;Status InitList( SqList &L ) {int i,n;L.elem = (ElemType*) malloc (LIST_INIT_SIZE*sizeof (ElemType)); if (!L.elem) return(OVERFLOW);printf("输入元素的个数:");scanf("%d",&n);printf("输入各元素的值:");for(i=0;i<n;i++)scanf("%d",&L.elem[i]);L.length = n;L.listsize = LIST_INIT_SIZE;return OK;}void VisitList(SqList L){ int i;for(i=0;i<L.length;i++)printf("%d\t",L.elem[i]);}void main(){SqList L;InitList(L) ;VisitList(L);}3、#include "stdio.h"#include "malloc.h"#define OK 1#define OVERFLOW -2#define ERROR 0typedef int Status;typedef int ElemType;typedef struct LNode {ElemType data;struct LNode *next;} LNode,*LinkList;Status ListInsert(LinkList &L,int i,ElemType e){ LinkList p,s;int j;p=L;j=0;while(p&&j<i-1) {p=p->next;++j;}if(!p||j>i) return ERROR;s=(LinkList)malloc(sizeof(LNode));s->data=e;s->next=p->next;p->next=s;return OK;}Status ListDelete(LinkList &L,int i,ElemType &e){ LinkList p,q;int j;p=L;j=0;while(p->next&&j<i-1){p=p->next;++j;}if(!(p->next)||j>i-1) return ERROR;q=p->next;p->next=q->next;e=q->data;free(q);return OK;}Status CreateList(LinkList &L, int n) {int i;LinkList p;L = (LinkList) malloc (sizeof (LNode));L->next = NULL;printf("输入元素的个数和相应值:");scanf("%d",&n);for (i = n; i > 0; --i) {p = (LinkList) malloc (sizeof (LNode));//生成新结点 scanf("%d",&p->data);//输入指针p指出i=n时所对应的数值 p->next = L->next;L->next = p;}return OK;}void VisitList(LinkList L){LNode *p;p=L->next;while(p){printf("%d\t",p->data);p=p->next;}}void main(){int i,n;LinkList L;ElemType e;CreateList(L,n);VisitList(L);printf("输入插入位置和值:");scanf("%d,%d",&i,&e);printf("插入元素后,表中的值:");ListInsert(L,i,e);VisitList(L);printf("输入删除位置:");scanf("%d",&i);printf("删除元素后,表中的值:");ListDelete(L,i,e);VisitList(L);}【实验心得】今天是本学期的第一次上机实验课,老师先给我们发了本次上机的内容以及部分实验代码,因为是第一次接触这门课程,还没有理解这门学科的特点和学习方法,所以同学们都觉得无从下手。

数据结构实验一实验报告——线性表

数据结构实验一实验报告——线性表

实验报告课程名称:数据结构实验名称:线性表班级:学生姓名:学号:指导教师评定:签名:题目:有两张非递增有序的线性学生表A,B,采用顺序存储结构,两张表合并用c表存,要求C为非递减有序的,然后删除C表中值相同的多余元素。

一、需求分析⒈本演示程序根据已有的两张表的信息,实现两张表的合并及删除值相同元素的操作,需要用户输入学生的信息。

⒉在演示过程序中,用户输入需要合并的顺序表,即可观看合并结果。

⒊程序执行的命令包括:(1)构造线性表A (2)构造线性表B (3)求两张表的并(4)删除C中值相同的元素二、概要设计⒈为实现上述算法,需要线性表的抽象数据类型:ADT Stack {数据对象:D={a i:|a i∈ElemSet,i=1…n,n≥0}数据关系:R1={<a i-1,a i>|a i-1,a i∈D,i=2,…n≥0}基本操作:init(list *L)操作结果:构造一个空的线性表L。

ListLength(List *L)初始条件:线性表L已经存在操作结果:返回L中数据元素的个数。

GetElem(List L, int i, ElemType *e)初始条件:线性表L已经存在,1≤i≤ListLength(&L)操作结果:用e返回L中第i个数据元素的值。

EqualList(ElemType *e1,ElemType *e2)初始条件:数据元素e1,e2存在操作结果:以e1,e2中的姓名项作为判定e1,e2是否相等的依据。

Less_EquaList(ElemType *e1,ElemType *e2)初始条件:数据元素e1,e2存在操作结果:以e1,e2中的姓名项(为字符串)的≤来判定e1,e2是否有≤的关系。

LocateElem(List *La,ElemType e,int type)初始条件:线性表La已经存在操作结果:判断La中是否有与e相同的元素。

MergeList(List *La,List *Lb,List *Lc)初始条件:非递减线性表La,Lb已经存在操作结果:合并La,Lb得到Lc,Lc仍按非递减有序排列。

数据结构合并两个顺序表

数据结构合并两个顺序表

数据结构合并两个顺序表合并两个顺序表是在数据结构中常见的操作之一,本文将介绍如何合并两个顺序表,并给出相应的算法实现。

顺序表是一种线性表的存储结构,它使用连续的存储空间存储元素,并按照顺序存放。

合并两个顺序表的意思是将两个顺序表中的元素按照一定的顺序合并到一个新的顺序表中。

假设有两个顺序表A和B,它们的长度分别为m和n。

要合并这两个顺序表,可以使用以下步骤:1. 创建一个新的顺序表C,用于存放合并后的结果。

2. 首先将顺序表A中的元素复制到顺序表C中,保持元素的顺序不变。

3. 然后将顺序表B中的元素依次插入到顺序表C中的合适位置。

插入的位置可以根据需要进行调整,可以选择插入到顺序表C的末尾,也可以选择按照某种规则插入。

4. 最后,顺序表C中的元素就是合并后的结果。

在实现合并两个顺序表的算法时,可以使用两个指针分别指向顺序表A和顺序表B的元素。

比较指针指向的元素大小,然后将较小的元素插入到顺序表C中,并将对应的指针向后移动一位。

重复这个过程,直到遍历完两个顺序表中的所有元素。

下面是一个具体的算法实现示例:```void merge(SeqList A, SeqList B, SeqList C) {int i = 0; // 指向顺序表A的指针int j = 0; // 指向顺序表B的指针int k = 0; // 指向顺序表C的指针// 将顺序表A中的元素复制到顺序表C中while (i < A.length) {C.elements[k++] = A.elements[i++];}// 将顺序表B中的元素插入到顺序表C中while (j < B.length) {int x = B.elements[j++];// 找到插入位置int insertPos = 0;while (insertPos < k && C.elements[insertPos] < x) { insertPos++;}// 将元素插入到合适位置for (int m = k; m > insertPos; m--) {C.elements[m] = C.elements[m - 1];}C.elements[insertPos] = x;k++;}C.length = k; // 更新顺序表C的长度}```这个算法的时间复杂度为O(m+n),其中m和n分别为顺序表A 和顺序表B的长度。

实验线性表操作

实验线性表操作

实验一线性表基本操作一、实验目的1、理解线性表的数据结构及其应用2、掌握线性表的顺序存储方式及其基本操作(建表、插入、删除)3、掌握线性表的链式存储方式以及基本操作(建表、插入、删除)4、理解链式存储的概念和具体语言环境下的表示方法二、实验内容1、顺序表的操作具体要求:(1)顺序表的存储结构typedef struct {int *data;//整型数据元素,可以是其它类型int length;//顺序表的当前长度(元素个数)int listsize;//当前分配的存储容量(已经分配的内存空间大小)}SqList;或者#define N 10;int data[N];//用数组来模拟实现顺序表(2)构造一个空表L函数: void InitList_Sq(SqList *L)(3)分别建立有n个数据元素的顺序表函数 void CreatList_Sq(SqList *L,int n)(4)在第i个元素之前插入一个数据元素函数void InsertList_Sq(SqList *L ,int e)(5)删除一个数据元素e函数 int ListDelete_Sq(SqList *L, int i)(6)结果显示:输出顺序表中的数据元素函数 void ShowList_Sq(SqList *L)(7)顺序表元素排序:对顺序表中元素按非递减排序(选做)函数 void SortList_Sq(SqList *L)(8)归并两个有序的(非递减排列)顺序表Sq_LA和 Sq_LB,新表Sq_Lnew中数据元素非递减排列(选做)函数void MergeList_Sq(SqList *La, SqList *Lb, SqList *Lc)实验步骤:源程序主函数如下:运行结果:图1.1顺序表进行归并操作前、后的各个表中数据元素2、建立一个线性链表(单链表),实现单链表上数据元素的插入、删除操作。

具体要求:(1)单链表的存储结构typedef struct LNode{char data; //数据元素为字符类型,可以为其它类型,例如整型struct LNode *next;// 指向后继结点的指针}LNode, *LinkList;(2)构造一个空的单链表函数 LinkList InitList_L(void)(3)建立一个带头节点的具有n个结点的单链表L函数尾插法LinkList CreatList_L_T(int n) 或头插法LinkList CreatList_L(int n)(4)在单链表LA上插入一个数据元素i_e,插入位置为i(1<i<n)函数LinkList ListInsert_L(LinkList L,int i,char i_e)(5)在单链表LA上删除第i个数据元素,并用r_e来返回删除的数据元素值函数LinkList ListDelete_L(LinkList L,int i)(6)结果显示:输出单链表进行插入(删除)操作前、后的数据元素函数 void ShowList(LinkList L)实验步骤:源程序主函数如下:运行结果:图1.2 单链表进行插入(删除)操作前、后的数据元素三、问题讨论四、实验心得附:程序源代码一(不包含在实验报告里边)/*顺序表操作*/#include <stdio.h>#include <string.h>#include <stdlib.h>#define LIST_INIT_SIZE 50#define LISTINCREMENT 20#define M 6 //LA中元素个数#define N 4//LB中元素个数typedef int ElemType;/*顺序表的当前长度(元素个数)length,当前分配的存储容量(已经分配的内存空间大小)listsize*/ typedef struct{int *data;int length;int listsize;}SqList;/*书上算法2.3,初始化线性表,分配存储空间*/void InitList_Sq(SqList *L){L->data = (int *)malloc(LIST_INIT_SIZE*sizeof(int));//分配100个数据元素大小的空间if (!L->data)printf("存储空间分配失败");L->length = 0; // 空表长度为0L->listsize = LIST_INIT_SIZE; // 初始存储容量return;} // InitList_Sq/*书上算法2.4,线性表插入元素*/void ListInsert_Sq(SqList *L, int i, int e) {// 在顺序线性表L的第i个元素之前插入新的元素e// i的合法值为1≤i≤L->length+1int *p,*q;if (i < 1 || i > L->length+1)printf("i值不合法");if (L->length >= L->listsize) { // 当前存储空间已满,增加容量int *newbase = (int *)realloc(L->data,(L->listsize+LISTINCREMENT)*sizeof (int));if (!newbase)printf("存储分配失败");// 存储分配失败L->data = newbase; // 新基址L->listsize += LISTINCREMENT; // 增加存储容量q = &(L->data[i-1]); // q为插入位置for (p = &(L->data[L->length-1]); p>=q; --p)*(p+1) = *p; // 插入位置及之后的元素右移*q = e; // 插入e++L->length; // 表长增1} // ListInsert_Sqint ListDelete_Sq(SqList *L, int i) { // 算法2.5// 在顺序线性表L中删除第i个元素,并用e返回其值。

数据结构(线性表)习题与答案

数据结构(线性表)习题与答案

1、线性表是具有n 个______ 的有限序列。

A.数据项B.字符C.数据元素D.表元素正确答案:C2、线性表是_______。

A.一个无限序列,可以为空B.一个有限序列不可以为空C.一个无限序列,不可以为空D.一个有限序列,可以为空正确答案:D3、关于线性表的正确说法是_______。

A.每一个元素都有一个前驱和一个后继元素B.除第一个元素和最后一个元素外,其余元素有且仅有一个前驱和一个后继元素C.表中元素的排序顺序必须是由小到大或者由大到小D.线性表中至少有一个元素正确答案:B4、线性表采用链表存储时,其存放各个元素的单元地址是_______。

A.连续与否均可以B.部份地址必须是连续的C.一定是不连续的D.必须是连续的5、链表不具备的特点是_______。

A.插入删除不需要挪移元素B.所需空间与其长度成正比C.不必事先估计存储空间D.可随机访问任一节点正确答案:D6、线性表的静态链表存储结构与顺序存储结构相比,优点是_______。

A.所有的操作算法实现简单B.便于利用零散的存储器空间C.便于随机存取D.便于插入和删除正确答案:D7、线性表的顺序存储结构和链式存储结构相比,优点是_______。

A.便于随机存取B.便于插入和删除C.所有的操作算法实现简单D.节省存储空间正确答案:A 8、设线性表有n 个元素,以下操作中,_______在顺序表上实现比在链表上实现效率高。

A.交换第1 个元素第2 个元素的值B.输出与给定值x 相等的元素在线性表中的符号C.输入第i ( 1<=i<=n )个元素值D.顺序输出这n 个元素的值正确答案:C9、对于一个线性表,既要求能够较快地进行插入和删除操作,又要求存储结构能够反映数据元素之间的逻辑关系,则应采用_______ 存储结构。

A.顺序B.链式C.散列D.索引正确答案:B10、设线性表中有n 个元素,以下操作,_______ 在单链表上实现要比在顺序表上实现效率高。

[计算机]实验一实验报告顺序表的合并

[计算机]实验一实验报告顺序表的合并

实验题目:顺序表的合并一、实验目的掌握顺序表的基本操作理解并分析算法的时间复杂度二、实验内容:实现两个有序(从小到大)的顺序表合并成为一个顺序表,合并后的结果放在第一个顺序表中(假设这两个有序顺序表中没有两个相同的元素)。

三、设计与编码1、基本思想从第二个表中从小到大依次取出一个元素与第一个表中的元素逐个进行比较,如果遇到第一个比它小的数就插到这个数后面,直到第二个表全部比较完。

2、编码#include <stdlib.h>#include <iostream.h>const int MaxSize=100; //100只是示例性的数据,可以根据实际问题具体定义class SeqList{public:SeqList(); //无参构造函数SeqList(int a[], int n); //有参构造函数~SeqList(){} //析构函数为空int Length(){return length;} //求线性表的长度int Get(int i); //按位查找,取线性表的第i个元素friend void MergeList(SeqList &A,SeqList B); //合并顺序表void PrintList(); //遍历线性表,按序号依次输出各元素private:int data[MaxSize]; //存放数据元素的数组int length; //线性表的长度};SeqList::SeqList(int a[],int n){if(n>MaxSize)cout<<"参数非法";for(int i=0;i<n;i++){data[i]=a[i];length=n;}}int SeqList::Get(int i){if (i<1||i>length) throw "查找位置非法";else return data[i-1];int x=data[i-1];}void SeqList::PrintList(){for(int i=0;i<length;i++)cout<<data[i]<<" ";cout<<endl;}void MergeList(SeqList &A,SeqList B){int a;for (int i=0;i<B.length;i++){a=-1;for(int j=0;j<A.length;j++){if (B.data[i]<A.data[j]){a=j;break;}}if(a==-1){A.data[A.length]=B.data[i];A.length++;}else{for(int k=A.length-1;k>=a;k--)A.data[k+1]=A.data[k];A.data[a]=B.data[i];A.length++;}}}void main(){int a[100];int n=4;for(int i=0;i<n;i++ ){cin>>a[i];}int b[100];int m=4;for(int j=0;j<m;j++ ){cin>>b[j];}SeqList La(a,4),Lb(b,4);La.PrintList ();Lb.PrintList ();MergeList(La,Lb);La.PrintList ();}四、调试与运行1、调试时遇到的主要问题及解决遇到的主要问题:没有把找到的位置用一个变量记下解决方法:通过请教同学2、运行结果(输入及输出,可以截取运行窗体的界面)五、实验心得写程序的过程中如果卡住了就一定要请教一下同学,不要一错再错,也许一经过同学提醒就一下子懂了,胜过你一直在那儿磨。

数据结构线性表操作实验报告

数据结构线性表操作实验报告

《数据结构》实验报告实验题目:线性表的操作实验目的:1.掌握上机调试线性表的基本方法;2.掌握线性表的一些基本操作;实验内容:将两个有序链表合并为一个有序链表一、需求分析1.实验程序中先创建两个有序链表,演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入两个链表中的相应数据。

2.将两个链表合并时可按数据从大到小或从小到大合并,用户根据提示可选择一种排序方式。

3.程序执行命令包括:(1)构造链表;(2)输入数据;(3)合并两个链表,根据用户需求选择一种排序方式;(4)将合并结果输出;(5)结束4.测试数据:链表1数据为:2,4,6,7,10链表2数据为:1,3,5,6,7,12按从小到达合并为:1,2,3,4,5,6,6,7,7,10,12;按从大到小合并为:12,10,7,7,6,6,5,4,3,2,1;二、概要设计1.基本操作Linklist creat ()操作结果:构造一个链表,并输入数据,返回头节点指针。

void print(Linklist head)初始条件:链表已存在;操作结果:将链表输出。

void MergeList_1(Linklist La,Linklist Lb)初始条件:有序线性链表La 和Lb 已存在;操作结果:将La 和Lb 两个链表按从小到大的顺序合并。

void MergeList_2(Linklist La,Linklist Lb)初始条件:有序线性链表La 和Lb 已存在;操作结果:将La 和Lb 两个链表按从大到小的顺序合并。

2.本程序包括四个模块:(1)主程序模块;(2)链表数据输入模块;(3)链表合并模块;(4)链表输出模块;三、详细设计1.元素类型,节点类型,指针类型主程序模块 数据输入 按从小到大合并两链表 按从大到小合并两链表 将新链表输出 将新链表输出typedef struct LNode //定义节点{int data;struct LNode *next;}LNode,* Linklist;2.每个模块的分析(1)主函数模块int main(){Linklist head1,head2;int i;printf("请输入链表1数据(由小到大,输入0表示输入结束):\n");head1=creat(); //创建链表1,将头结点指针返回为head1printf("请输入链表2数据(由小到大,输入0表示输入结束):\n");head2=creat();printf("请选择排序方式(输入1则从小到达合并,输入其它整数则按从大到小合并):");scanf("%d",&i); //创建链表2,将头结点指针返回为head2if(i==1) //选择两种排序方式,如果输入1,则合并后按从小到大输出;输入其它数,合成链表按从大到小输出{printf("按小到大将两表合并得:\n");MergeList1(head1,head2); //将创建好的两表的头结点地址head1,head2作为函数参数}else{ printf("按从大到小将两表合并得:\n");MergeList2(head1,head2); //将创建好的两表的头结点地址head1,head2作为函数参数}return 0;}(2)数据输入创建链表模块Linklist creat() //创建链表函数,并将创建链表的头结点指针返回{Linklist head,p,s;int z=1,x;head=(LNode *) malloc(sizeof(LNode));p=head;while(z){scanf("%d",&x);if(x!=0) //输入0表示链表数据输入结束{s=(LNode *)malloc(sizeof(LNode));s->data=x;p->next=s;s->next=NULL;p=s;}elsez=0;}return(head);}(3)合并链表模块,两个函数分别表示两种排序方式,将链表合并后直接在函数中调用链表输出函数void print(Linklist head)将链表输出void MergeList_1(Linklist La,Linklist Lb)//已知链表La和Lb元素都按从小到大排列,将La和Lb合并成新链表,其中元素也按从小到大排列{Linklist pa,pb,pc,Lc;pa = La->next; pb = Lb->next;Lc = pc = La; //把La的头节点作为新建链表Lc的头结点while (pa && pb){if (pa->data <= pb->data){pc->next = pa;pc = pa;pa = pa->next;}else{pc->next = pb;pc = pb;pb = pb->next;}}pc->next = pa ? pa : pb; //插入剩余段print(Lc); //将链表Lc输出}void MergeList_2(Linklist La,Linklist Lb)//已知链表La和Lb的元素都按从小到大排列,合并La和Lb得到新链表,其中元素按照从大到小的顺序排列{Linklist pa,qa,pb,qb,Lc; //设指针qa,qb,分别作为pa,pb的前驱的指针pa=La->next;pb=Lb->next;Lc=La;Lc->next=NULL;while(pa&&pb){if(pa->data<=pb->data){qa=pa;pa=pa->next;qa->next=Lc->next;Lc->next=qa;}else{qb=pb;pb=pb->next;qb->next=Lc->next;Lc->next=qb;}}while(pa) //如果pa不为空,则将La链的剩余段倒叙插入到头节点的后面{qa=pa;pa=pa->next;qa->next=Lc->next;Lc->next=qa;}while(pb) //如果pb不为空,则将Lb链的剩余段倒叙插入到头结点的后面{qb=pb;pb=pb->next;qb->next=Lc->next;Lc->next=qb;}print(Lc); //将新合成的链表Lc输出}(4)链表输出模块,实现最终链表的输出void print(Linklist head) //链表输出函数,将链表输出{LNode *p;p=head->next;if(head!=NULL)do{printf("%d ",p->data);p=p->next;} while (p);printf("\n");四、程序使用说明及测试结果1.程序使用说明(1)本程序的运行环境为VC6.0;(2)进入演示程序后显示提示信息:请输入链表1数据(由小到大,输入0表示输入结束):按要求输入数据请输入链表2数据(由小到大,输入0表示输入结束):按要求输入数据请选择排序方式(输入1则从小到达合并,输入其它整数则按从大到小合并):输入数据选择合并方式2.测试结果对链表1输入数据2,4,6,7,10,0对链表2输入数据1,3,5,6,7,12,0输入数据选择排序方式:如果输入:1 输出结果为:1,2,3,4,5,6,6,7,7,10,12如果输入:3(整数非1)输出结果为:12,10,7,7,6,6,5,4,3,2,13.调试中遇到的错误分析第一次运行时有问题,看以看出它的排序方式是对的,但是输出是多出前面一个很大的数,可能是输出函数void print(Linklist head)有问题,检查程序:此处逻辑出错,直接将p指针指向head,然后就将p->data输出,因此第一个数是头指针head所对应节点的值,所以可将p=head;改为p=head->next;这样p就指向第一个节点。

数据结构实验报告-实验一顺序表、单链表基本操作的实现

数据结构实验报告-实验一顺序表、单链表基本操作的实现

数据结构实验报告-实验⼀顺序表、单链表基本操作的实现实验⼀顺序表、单链表基本操作的实现l 实验⽬的1、顺序表(1)掌握线性表的基本运算。

(2)掌握顺序存储的概念,学会对顺序存储数据结构进⾏操作。

(3)加深对顺序存储数据结构的理解,逐步培养解决实际问题的编程能⼒。

l 实验内容1、顺序表1、编写线性表基本操作函数:(1)InitList(LIST *L,int ms)初始化线性表;(2)InsertList(LIST *L,int item,int rc)向线性表的指定位置插⼊元素;(3)DeleteList1(LIST *L,int item)删除指定元素值的线性表记录;(4)DeleteList2(LIST *L,int rc)删除指定位置的线性表记录;(5)FindList(LIST *L,int item)查找线性表的元素;(6)OutputList(LIST *L)输出线性表元素;2、调⽤上述函数实现下列操作:(1)初始化线性表;(2)调⽤插⼊函数建⽴⼀个线性表;(3)在线性表中寻找指定的元素;(4)在线性表中删除指定值的元素;(5)在线性表中删除指定位置的元素;(6)遍历并输出线性表;l 实验结果1、顺序表(1)流程图(2)程序运⾏主要结果截图(3)程序源代码#include<stdio.h>#include<stdlib.h>#include<malloc.h>struct LinearList/*定义线性表结构*/{int *list; /*存线性表元素*/int size; /*存线性表长度*/int Maxsize; /*存list数组元素的个数*/};typedef struct LinearList LIST;void InitList(LIST *L,int ms)/*初始化线性表*/{if((L->list=(int*)malloc(ms*sizeof(int)))==NULL){printf("内存申请错误");exit(1);}L->size=0;L->Maxsize=ms;}int InsertList(LIST *L,int item,int rc)/*item记录值;rc插⼊位置*/ {int i;if(L->size==L->Maxsize)/*线性表已满*/return -1;if(rc<0)rc=0;if(rc>L->size)rc=L->size;for(i=L->size-1;i>=rc;i--)/*将线性表元素后移*/L->list[i+=1]=L->list[i];L->list[rc]=item;L->size++;return0;}void OutputList(LIST *L)/*输出线性表元素*/{int i;printf("%d",L->list[i]);printf("\n");}int FindList(LIST *L,int item)/*查找线性元素,返回值>=0为元素的位置,返回-1为没找到*/ {int i;for(i=0;i<L->size;i++)if(item==L->list[i])return i;return -1;}int DeleteList1(LIST *L,int item)/*删除指定元素值得线性表记录,返回值为>=0为删除成功*/ {int i,n;for(i=0;i<L->size;i++)if(item==L->list[i])break;if(i<L->size){for(n=i;n<L->size-1;n++)L->list[n]=L->list[n+1];L->size--;return i;}return -1;}int DeleteList2(LIST *L,int rc)/*删除指定位置的线性表记录*/{int i,n;if(rc<0||rc>=L->size)return -1;for(n=rc;n<L->size-1;n++)L->list[n]=L->list[n+1];L->size--;return0;}int main(){LIST LL;int i,r;printf("list addr=%p\tsize=%d\tMaxsize=%d\n",LL.list,LL.size,LL.Maxsize);printf("list addr=%p\tsize=%d\tMaxsize=%d\n",LL.list,LL.list,LL.Maxsize);while(1){printf("请输⼊元素值,输⼊0结束插⼊操作:");fflush(stdin);/*清空标准输⼊缓冲区*/scanf("%d",&i);if(i==0)break;printf("请输⼊插⼊位置:");scanf("%d",&r);InsertList(&LL,i,r-1);printf("线性表为:");OutputList(&LL);}while(1){printf("请输⼊查找元素值,输⼊0结束查找操作:");fflush(stdin);/*清空标准输⼊缓冲区*/scanf("%d ",&i);if(i==0)break;r=FindList(&LL,i);if(r<0)printf("没有找到\n");elseprintf("有符合条件的元素,位置为:%d\n",r+1);}while(1){printf("请输⼊删除元素值,输⼊0结束查找操作:");fflush(stdin);/*清楚标准缓存区*/scanf("%d",&i);if(i==0)break;r=DeleteList1(&LL,i);if(i<0)printf("没有找到\n");else{printf("有符合条件的元素,位置为:%d\n线性表为:",r+1);OutputList(&LL);}while(1){printf("请输⼊删除元素位置,输⼊0结束查找操作:");fflush(stdin);/*清楚标准输⼊缓冲区*/scanf("%d",&r);if(r==0)break;i=DeleteList2(&LL,r-1);if(i<0)printf("位置越界\n");else{printf("线性表为:");OutputList(&LL);}}}链表基本操作l 实验⽬的2、链表(1)掌握链表的概念,学会对链表进⾏操作。

两个顺序表的合并算法

两个顺序表的合并算法

两个顺序表的合并算法顺序表是一种线性数据结构,由一系列元素按照一定的顺序存储在连续的存储空间中。

合并两个顺序表是常见的算法问题,其涉及到的操作包括查找、插入和删除。

本文将介绍两种常见的顺序表合并算法:1、插入排序法;2、归并排序法。

两种算法各有特点,从时间复杂度、空间复杂度等方面进行比较,帮助读者选取更适合的算法进行应用。

1. 插入排序法插入排序是一种基本的排序算法,其思想是将一个元素插入到已经有序的序列中,使之仍然有序。

顺序表的合并可以通过构造一个新的顺序表,将原始的两个顺序表按照其中一个顺序表的顺序逐个插入到新的顺序表中。

具体实现如下:```python def merge(array1, array2): result = [] index1 = index2 = 0 while index1 <len(array1) and index2 < len(array2): if array1[index1] <= array2[index2]: result.append(array1[index1]) index1 += 1 else:result.append(array2[index2]) index2 +=array2[index2:] return result ```该方法的时间复杂度为O(n^2),其中n为两个序列的总长度。

每次插入都需要遍历已经存储的新序列,然后进行插入操作。

这种方法较为简单,适用于数据量较小的情况。

2. 归并排序法归并排序是一种分治排序算法,将一个序列分为两个子序列,然后对子序列进行排序并归并。

顺序表的合并可以通过将两个有序的顺序表进行归并的方式,使得归并后的顺序表仍然有序。

归并排序法的合并操作分为两个步骤:- 将两个顺序表分为两个子序列。

- 合并两个子序列并保证顺序。

具体实现如下:```python def merge(array1, array2): result = [] index1 = index2 = 0 while index1 <len(array1) and index2 < len(array2): if array1[index1] <= array2[index2]: result.append(array1[index1]) index1 += 1 else:result.append(array2[index2]) index2 +=array2[index2:] return resultdef mergeSort(array): if len(array)<=1: return array mid = len(array)//2 left = mergeSort(array[:mid]) right =mergeSort(array[mid:]) return merge(left,right)```该方法的时间复杂度为O(nlogn),其中n为两个序列的总长度。

DS线性表习题参考解答

DS线性表习题参考解答

第2章线性表习题参考解答一、简答题1.试描述头指针、头结点、开始结点的区别、并说明头指针和头结点的作用。

【答】头指针:是指向链表中的第一个结点的指针。

头结点:在开始结点之前附加上的一个结点。

开始结点:链表的第一个结点。

头指针是一个指向地址的变量,用于表示一个链表的开始。

引入头结点可以更加方便的进行链表是否为空的判断,同时方便了插入和删除结点。

开始结点用于存储链表的第一个数据元素。

2.何时选用顺序表、何时选用链表作为线性表的存储结构为宜?【答】顺序表中查找元素、获取表长非常容易,但是,要插入或者删除一个元素却需要移动大量的元素;相反,链表中却是方便插入或者删除元素,在查找元素的是,需要进行遍历。

因此,当所涉及的问题常常进行查找等操作,而插入、删除相对较少的是,适合采用顺序表;当常常需要插入、删除的时候,适合采用链表。

3.为什么在单循环链表中设置尾指针比设置头指针更好?【答】在单循环链表中,设置尾指针,可以更方便的判断链表是否为空。

4.在单链表、双链表和单循环链表中,若仅知道指针p指向某结点,不知道头指针,能否将结点*p从相应的链表中删去?【答】本题分三种情况讨论:1、单链表:当知道指针p指向某结点时,能够根据该指针找到其直接后继,但是不知道头指针,因此不能找到该结点的直接前趋,因此,无法删除该结点。

2、双链表:根据指针p可以找到该结点的直接前趋和直接后继,因此,能够删除该结点。

3、单循环链表:和双链表类似,根据指针p也可以找到该结点的直接前趋和直接后继,因此,也可以删除该结点。

5.下述算法的功能是什么?LinkList Demo(LinkList *L) /* L是无头结点单链表*/{LNode *Q,*P;if(L&&L->next){Q=L;L=L->next;P=L;while (P->next) P=P->next;P->next=Q; Q->next=NULL;}return L;} /* Demo */【答】将原来的第一个结点变成末尾结点,原来的第二个结点变成链表的第一个结点。

数据结构(线性表)习题与答案

数据结构(线性表)习题与答案

1、线性表是具有n个 ______ 的有限序列。

A.数据项B.字符C.数据元素D.表元素正确答案:C2、线性表是 _______。

A.一个无限序列,可以为空B.一个有限序列不可以为空C.一个无限序列,不可以为空D.一个有限序列,可以为空正确答案:D3、关于线性表的正确说法是 _______。

A.每个元素都有一个前驱和一个后继元素B.除第一个元素和最后一个元素外,其余元素有且仅有一个前驱和一个后继元素C.表中元素的排序顺序必须是由小到大或由大到小D.线性表中至少有一个元素正确答案:B4、线性表采用链表存储时,其存放各个元素的单元地址是 _______。

A.连续与否均可以B.部分地址必须是连续的C.一定是不连续的D.必须是连续的5、链表不具备的特点是 _______。

A.插入删除不需要移动元素B.所需空间与其长度成正比C.不必事先估计存储空间D.可随机访问任一节点正确答案:D6、线性表的静态链表存储结构与顺序存储结构相比,优点是 _______。

A.所有的操作算法实现简单B.便于利用零散的存储器空间C.便于随机存取D.便于插入和删除正确答案:D7、线性表的顺序存储结构和链式存储结构相比,优点是 _______。

A.便于随机存取B.便于插入和删除C.所有的操作算法实现简单D.节省存储空间正确答案:A8、设线性表有n个元素,以下操作中,_______在顺序表上实现比在链表上实现效率高。

A.交换第1个元素第2个元素的值B.输出与给定值x相等的元素在线性表中的符号C.输入第i(1<=i<=n)个元素值D.顺序输出这n个元素的值正确答案:C9、对于一个线性表,既要求能够较快地进行插入和删除操作,又要求存储结构能够反映数据元素之间的逻辑关系,则应采用 _______ 存储结构。

A.顺序B.链式C.散列D.索引正确答案:B10、设线性表中有n个元素,以下操作,_______ 在单链表上实现要比在顺序表上实现效率高。

练习1设有两个按元素递增的有序表A与B,设计一个算法将

练习1设有两个按元素递增的有序表A与B,设计一个算法将
d Merge(SqList A,SqList B,SqList &C) { //将有序表A,B合并为有序表C int i=0,j=0,k=0; while (i<A.len && j<B.len) { if(A.data[i]<=B.data[j]) { C.data[k]=A.data[i]; i++;k++;} else { C.data[k]=B.data[j]; j++;k++;} } while(i<A.len) { C.data[k]=A.data[i]; i++;k++;} while(j<B.len) { C.data[k]=B.data[j]; j++;k++;} C.len=k; }
针,试设计一个算法,将这两个有序链表合并成一个非递减有 序单链表。要求结果链表仍使用原来两个链表的存储空间,不 另外占用其他的存储空间。表中允许有重复的数据。
2019/1/21
1:
SLink *MaxNode(SLink *sq) { SLink *p=sq->next,*q=p; while (p!=NULL) { if (p->data>q->data) q=p; p=p->next; } return q; }
2019/1/21
void Move(SqList A) { //将整型元素互不相等的线性表A中的奇数移到偶数之前 int i=0,j,k; j=A.len-1; ElemType temp; while(i<=j) { while(A.data[i]%2==0) i++; while(A.data[j]%2==1) j--; if(i<j) { temp=A.data[i];A.data[i]=A.data[j];A.data[j]=temp;} } }
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
print(Lb);
printf("以下输出两顺序表归并后的元素\n");
Mergelist_sqlist(La,Lb,Lc);
print(Lc);
}
两递增的单链表合并为一递减的单链表
#include <iostream.h>
#include <stdlib.h>
pa=pa_last;pb=pb_last;
Lc.listsize=Lc.length=La.length+Lb.length;
pc=Lc.elem=(ElemType*)malloc(Lc.listsize*sizeof(ElemType)); if(!来自c.elem)exit(1);
while(pa>=La.elem&&pb>=Lb.elem)
{
int m;
Node *p,*q;
L=(LinkList)malloc(sizeof(Node));
if (!L) exit(OVERFLOW);
L->next=NULL;
q=L;
cin>>m;
while(m!=0)
{
p=(LinkList)malloc(sizeof(Node));
}
return(Lc);
}//
void main()
{
LinkList La,Lb,Lc;
Node *p;
cout<<"请输入第一个链表结点值(输入值为0时结束):"<<endl;
Create_LinkList(La);
cout<<"请输入第二个链表结点值(输入值为0时结束):"<<endl;
InitList_Sq(Lb);
InitList_Sq(Lc);
CreateList(La);
CreateList(Lb);
//CreateList(Lc);
printf("以下输出顺序表的元素\n");
print(La);
printf("以下输出顺序表的元素\n");
{
newbase=(ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
if(!newbase) exit(1);//存储分配失败
L.elem=newbase;//新基址
L.listsize+=LISTINCREMENT;//增加存储容量
{
L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L.elem) exit(1);//存储分配失败
L.length=0;//空表长度为零
L.listsize=LIST_INIT_SIZE;//初始存储容量
{
Node *pa,*pb,*Lc,*q;
pa=La->next;
pb=Lb->next;
Lc=(LinkList)malloc(sizeof(Node));
Lc->next=NULL;
q=Lc;
while(pa&&pb)
{
if (pa->data<pb->data)
int i;
for(i=0;i<L.length;i++)
printf("%d",L.elem[i]);
printf("\n");
}
void main()
{
Sqlist La;
Sqlist Lb;
Sqlist Lc;
InitList_Sq(La);
#define OVERFLOW 0
typedef int ElemType;
typedef struct Node{
ElemType data;
struct Node *next;
}Node,*LinkList;
LinkList Create_LinkList(LinkList &L)
Lc->next=pa;
pa=La->next;
}
while(pb)
{
Lb->next=pb->next;
pb->next=NULL;
pb->next=q->next;
Lc->next=pb;
pb=Lb->next;
int length;//当前长度
int listsize;//当前分配的存储容量(以sizeof(Elem)为单位)
}Sqlist;
Sqlist InitList_Sq(Sqlist &L)
//------------构造一个空的线性表--------------------------
if (!p) exit(OVERFLOW);
p->data=m;
p->next=NULL;
q->next=p;
q=p;
cin>>m;
}
return(L);
}
LinkList Merge_List(LinkList &La,LinkList &Lb)
}
L.elem[L.length]=s;//将输入的值赋给链表相应位置
L.length++;
scanf("%d",&s);
}
return(L);
}
void Mergelist_sqlist(Sqlist &La, Sqlist &Lb,Sqlist &Lc)
{
if(*pa<=*pb)*pc++=*pb--;
else*pc++=*pa--;
}
while(pa>=La.elem)*pc++=*pa--;
while(pb>=Lb.elem)*pc++=*pb--;
}
void print(Sqlist &L)
{
{
La->next=pa->next;
pa->next=NULL;
pa->next=q->next;
Lc->next=pa;
pa=La->next;
}
else
{
Lb->next=pb->next;
#define LISTINCREMENT 10
typedef int ElemType; //将Elemtype定义为int型
//---------线性表的动态分配顺序存储结构------------------
typedef struct{
ElemType *elem;//线性表的基地址
Create_LinkList(Lb);
Lc=Merge_List(La,Lb);
p=Lc->next;
//cout<<p->data<<endl;
while(p!=NULL)
{
cout<<p->data<<endl;
p=p->next;
}
}
{
//已知顺序线性表La和Lb的元素按值费递减排列
//归并得到的新的顺序线性表Lc的元素按非递增排列
ElemType *pa,*pb,*pc,*pa_last,*pb_last;
pa_last=La.elem+La.length-1;
pb_last=Lb.elem+Lb.length-1;
(3) 将一个单链表中的值就地逆置。(必做)
第一个实验:两个递增顺序表合并为一个递减的顺序表
#include<stdio.h>
#include<stdlib.h>//包含malloc,realloc,sizeof,exit函数的头文件
#define LIST_INIT_SIZE 100
线性表实验--归并2009-11-22 18:201、
实验内容
(1)假设有两个按数据元素值非递减有序排列的线性表A和B,均以顺序表作为存储结构。编写算法将A表和B表归并成一个按元素值非递增有序(允许值相同)排列的线性表C。(可以利用将B中元素插入A中,或新建C表
(2) 假设有两个按数据元素值非递减有序排列的线性表A和B,均以单链表作为存储结构。编写算法将A表和B表归并成一个按元素值递减有序(即非递增有序,允许值相同)排列的线性表C。(必做)
return(L);
}
Sqlist CreateList(Sqlist &L)
{
int s;
ElemType *newbase;
printf("以下输入顺序表的元素,并以“0“结束: ");
scanf("%d",&s);
while(s!=0)
{
if (L.length>=L.listsize) //当前分配存储空间已满,增加分配
相关文档
最新文档