利用线性表中的顺序结构简单实现集合的交并补运算

//利用顺序表实现集合的运算
#include<cstdio>
#include<iostream>
#include<stdbool.h>
#define MAXSIZE 100//最大元素个数设置为100个
using namespace std;

typedef struct
{
   
    int *elem;
    int ListLength;
    int ListSize;
}SqList;
//分配内存
void malloc_space(SqList &L)
{
   
    L.elem=(int *)malloc(MAXSIZE*sizeof(int));
    L.ListLength=0;
    L.ListSize=100;
}
//将元素e插入到表中位置i处
bool Insert_elem(SqList &L,int i,int e)
{
   
    if(i<1||i>L.ListLength+1)//顺序表连续存储
        return false;
    if(i>L.ListSize)
        return false;
    int j;
    for(j=L.ListLength;j>=i;i--)
        L.elem[j]=L.elem[j-1];
    L.elem[i-1]=e;
    L.ListLength++;
    return true;
}
//删除表中位置i处的元素
bool Delet_elem(SqList &L,int i,int &e)
{
   
    if(i
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 顺序存储结构数据数据元素之间逻辑关系是由( )表示的,链接存储结构的数据元素之间的逻辑关系是由( )表示的。 A.线性结构 B.非线性结构 C.存储位置 D.指针 2. 线性表是( )。 A.一个有限序列,可以为空 B. 一个有限序列,不能为空 C. 一个无限序列,可以为空 D. 一个无限序列,不能为空 3. 已知一维数组A采用顺序存储结构,每个元素占用4个存储单元,第9个元素的地址为144,则第一个元素的地址是( )。 A. 108 B. 180 C. 176 D. 112 4. 在单链表删除指针p所指结点的后继结点,则执行( )。 A. p->next= p->next->next B. p->next= p->next C. p= p->next->next D. p= p->next; p->next= p->next->next 5. 若某链表最常用的操作是在最后一个结点之后插入一个结点删除最后一个结点,则采用( )存储方式最节省时间。 A. 单链表 B. 双链表 C. 带头结点的双循环链表 D. 单循环链表 6.二维数组A[7][8]以列序为主序的存储, 计算数组元素A[5][3] 的一维存储空间下标 k=( )。 A. 38 B. 43 C. 26 D. 29 二、完成下列填空题(每空3分,共9分)。 1.在顺序表L第i个位置上插入一个新的元素e: Status ListInsert_Sq(SqList &L , int i , ET e){ if ( iL.length+1) return ERROR; if(L.length >= L.listsize){ p=(ET*)realloc(L.elem,(L.listsize+10)*sizeof(ET)); if (p==NULL) exit(OVERFLOW); L.elem=p; } for( j=L.length ; j>=i ; --j ) L.elem[j]=L.elem[j-1] ; L.elem[j]=e ; ++L.length ; return OK; } 2. 删除双向链表p所指向的节点算法: status delete(DuLinkList L, DuLinkList p) { if (p= =L) return ERROR; else { p->prior->next=p->next; p->next->prior=p->prior ; } free(p); return OK; } 三、编程题(共27分)。 1. (共12分)用顺序表表示集合,设计算法实现集合的求差集运算,要求不另外开辟空间。 顺序表的存储结构定义如下: #define Maxsize 100 typedef struct { ElemType data[MaxSize]; // ElemType表示不确定的数据类型 int length; // length表示线性表的长度 }SqList; 将如下函数,伪码充完整(8分),代码前先用文字描述自己的算法思想(4分)。 文字描述算法:略(4分) void Difference(SqList A, SqList B) {//参考代码如下如下(8分) for (i=0;i<A.length;i++) for(j=0;j<B.length;j++) if(A.data[i]==B.data[j]) { A.data[i]=’#’; break; } for (k=0,i=0;inext == L) return; p = L; while (p->next != L)   { if (p->next->data != e) P = p->next; else { q = p->next;p->next = q->next; free(q);} } } 时间复杂度分析:(2分) 时间复杂度为O(n)。
实验1:顺序表基本操作 一、实验目的 1.学会定义线性表顺序存储类型,实现C程序的基本结构,对线性表的一些基本操作和具体的函数定义。 2.掌握顺序表的基本操作,实现顺序表的插入、删除、查找以及求并集运算。 3.掌握对多函数程序的输入、编辑、调试和运行过程。 二、实验要求 1.预习C语言结构体的定义与基本操作方法。 2.对顺序表的每个基本操作用单独的函数实现。 3.编写完整程序完成下面的实验内容并上机运行。 4.整理并上实验报告。 三、实验内容: 1.编写程序实现顺序表的下列基本操作: (1)初始化顺序表La。 (2)将La置为空表。 (3)销毁La。 (4)在La插入一个新的元素。 (5)删除La的某一元素。 (6)在La查找某元素,若找到,则返回它在La第一次出现的位置,否则返回0。 (7)打印输出La的元素值。 2.编写程序完成下面的操作: (1)构造两个顺序线性表La和Lb,其元素都按值非递减顺序排列。 (2)实现归并La和Lb得到新的顺序表Lc,Lc的元素也按值非递减顺序排列。 (3)假设两个顺序线性表La和Lb分别表示两个集合A和B,利用 union_Sq操作实现A=A∪B。 四、思考与提高 假设两个顺序线性表La和Lb分别表示两个集合A和B,如何实现A=A ∩B ? 实验2:单链表基本操作 一、 实验目的 1. 学会定义单链表的结点类型,实现对单链表的一些基本操作和具体的函数定义,了解并掌握单链表的类定义以及成员函数的定义与调用。 2. 掌握单链表基本操作及两个有序表归并、单链表逆置等操作的实现。 二 、实验要求 1.预习C语言结构体的定义与基本操作方法。 2.对单链表的每个基本操作用单独的函数实现。 3.编写完整程序完成下面的实验内容并上机运行。 4.整理并上实验报告。 三、实验内容 1.编写程序完成单链表的下列基本操作: (1)初始化单链表La。 (2)在La第i个元素之前插入一个新结点。 (3)删除La的第i个元素结点。 (4)在La查找某结点并返回其位置。 (5)打印输出La的结点元素值。 2 .构造两个带有表头结点的有序单链表La、Lb,编写程序实现将La、Lb合并成一个有序单链表Lc。 合并思想是:程序需要3个指针:pa、pb、pc,其pa,pb分别指向La表与Lb表当前待比较插入的结点,pc 指向Lc表当前最后一个结点。依次扫描La和Lb的元素,比较当前元素的值,将较小者链接到*pc之后,如此重复直到La或Lb结束为止,再将另一个链表余下的内容链接到pc所指的结点之后。 3.构造一个单链表L,其头结点指针为head,编写程序实现将L逆置。(即最后一个结点变成第一个结点,原来倒数第二个结点变成第二个结点,如此等等。) 四、思考与提高 1.如果上面实验内容2合并的表内不允许有重复的数据该如何操作? 2.如何将一个带头结点的单链表La分解成两个同样结构的单链表Lb,Lc,使得Lb只含La表奇数结点,Lc含有La表的偶数结点? 实验3:循环队列基本操作 一 、实验目的 1.熟悉并能实现循环队列的定义和基本操作。 2.了解用队列解决实际应用问题。 二、实验要求 1.进行队列的基本操作时要注意队列“先进先出”的特性。 2.复习关于队列操作的基础知识。 3.编写完整程序完成下面的实验内容并上机运行。 4.整理并上实验报告。 三、实验内容 1.任意输入队列长度和队列的元素值,构造一个顺序循环队列,对其进行清空、插入新元素、返回队头元素以及删除队头元素操作。 2.约瑟夫环的实现:设有n个人围坐在圆桌周围,现从某个位置 i 上的人开始报数,数到 m 的人就站出来。下一个人,即原来的第m+1个位置上的人,又从1开始报数,再是数到m的人站出来。依次重复下去,直到全部的人都站出来,按出列的先后又可得到一个新的序列。由于该问题是由古罗马著名的史学家Josephus提出的问题演变而来,所以通常称为Josephus 问题。 例如:当n=8,m=4,i=1时,得到的新序列为: 4,8,5,2,1,3,7,6 编写程序选择循环队列作为存储结构模拟整个过程,并依次输出出列的各人的编号。 实验4:矩阵的压缩存储及相关操作 (第11周星期三7、8节) 一 、实验目的 1.掌握下三角矩阵的输入、输出、转置算法。 2.理解稀疏矩阵的三元组表类型定义,掌握稀疏矩阵的输入、输出、转置算法。 二 、实验要求 1.认真阅读和掌握本实验的算法思想。 2.编写完整程序完成下面的实验内容并上机运行。 三、实验内容 1.所谓上(下)三角矩阵是指矩阵的下(上)三角的元素均为常数或零的n阶矩阵。此时除了存储上(下)三角矩阵的元素之外再加一个存储常数的空间即可。三角矩阵的重复元素c可共享一个存储空间,其余的元素正好有n×(n+1)/2个,因此,三角矩阵可压缩到向量Sa[0……n×(n+1)/2],其c存放在向量的最后一个分量。用向量Sa[0……n×(n+1)/2]压缩存储下三角矩阵,编写程序任意输入一个下三角矩阵,对其进行转置,输出转置后的矩阵。 2.用三元组顺序表压缩存储稀疏矩阵,编写程序任意输入一个稀疏矩阵,对其进行转置,输出转置后的矩阵。 四、思考与提高 如何计算一个三元组表表示的稀疏矩阵对角线元素之和以及两个三元组表表示的稀疏矩阵的乘积? 实验5:二叉树的建立及遍历 (第十三周星期三7、8节) 一 、实验目的 1.学会实现二叉树结点结构和对二叉树的基本操作。 2.掌握对二叉树每种操作的具体实现,学会利用递归方法编写对二叉树这种递归数据结构进行处理的算法。 二 、实验要求 1.认真阅读和掌握和本实验相关的教材内容。 2.编写完整程序完成下面的实验内容并上机运行。 3.整理并上实验报告。 三、实验内容 1.编写程序任意输入二叉树的结点个数和结点值,构造一棵二叉树,采用三种递归遍历算法(前序、序、后序)对这棵二叉树进行遍历并计算出二叉树的高度。 2 .编写程序生成下面所示的二叉树,并采用序遍历的非递归算法对此二叉树进行遍历 四、思考与提高 1.如何计算二叉链表存储的二叉树度数为1的结点数? 2.已知有—棵以二叉链表存储的二叉树,root指向根结点,p指向二叉树任一结点,如何求从根结点到p所指结点之间的路径? 实验6:二分查找、Hash查找算法的程序实现 (第十五三周星期三7、8节) 一、 实验目的 1 .熟练掌握二分查找算法并能在有序表进行查找操作。 2. 掌握Hash表的相关算法。 二 、实验要求 1.认真阅读和掌握和本实验相关的教材内容。 2.复习顺序表及二叉树的基本操作过程。 3.编写完整程序完成下面的实验内容并上机运行。 4.整理并上实验报告。 三、实验内容 1.二分查找又称为折半查找,它要求要查找的顺序表必须是有序表,即表结点按关键字有序.并且要用顺序存储结构。 基本思想是:首先将给定值key与表间位置记录的关键字相比较,若二者相等,则查找成功,否则根据比较的结果确定下次查找的范围是在间记录的前半部分还是后半部分,然后在新的查找范围内进行同样的查找,如此重复下去,直到在表找到关键字与给定值相等的记录,或者确定表没有这样的记录。 编写程序构造一个有序表La,从键盘接收一个关键字key,用二分查找法在La 查找key,若找到则提示查找成功并输出key所在的位置,否则提示没有找到信息。 2.编写程序实现Hash表的建立、删除、插入以及查找操作。 程序应包含的主要功能函数有: Hash( ):计算哈希地址 InitialHash( ):初始化哈希表 SearchHash( ):在哈希表查找关键字 InsertHash( ):向哈希表插入关键字 DeleteHash( ):删除哈希表某一关键字 PrintHash ( ):打印输出哈希表 四、思考与提高 如何利用二分查找算法在一个有序表插入一个元素x,并保持表的有序性? 实验7:至少三种排序算法的程序实现 (第十六周星期三7、8节) 一、 实验目的 1.掌握简单插入排序、冒泡排序、快速排序、堆排序以及归并排序的算法并加以应用。 2.对各种查找、排序技术的时间、空间复杂性有进一步认识。 二 、实验要求 1.认真阅读和掌握和本实验相关的教材内容。 2.编写完整程序完成下面的实验内容并上机运行。 3.整理并上实验报告。 三、实验内容 编写程序实现下述五种算法至少三种,并用以下无序序列加以验证: 49,38,65,97,76,13,27,49 1.简单插入排序 2.冒泡排序 3.快速排序 4.归并排序 5.堆排序 四、思考与提高 1.设有1000个无序的元素,希望用最快的速度挑出其前10个最大的元素,采用哪一种排序方法最好?为什么? 2.如何构造一种排序方法,使五个整数至多用七次比较就可以完成排序任务? 实验8:集成实验 一、 实验目的 目的:扩大编程量,完成模块化程序设计的全过程。 二 、实验要求 1.认真阅读和掌握和本实验相关的教材内容。 2.编写完整程序完成下面的实验内容并上机运行。 3.整理并上实验报告。 三、实验内容 将已经实现的模块装配在一起,由菜单进行管理,形成一个小型多功能软件。 while(1){ menuList(); scanf(&n); switch(n){ case 1:……;break; case 2:……;break; . . case 0:return; } } 如: • MenuSelect( ){ int select; SqList A , B , C ; MenuList( ); /* 打印菜单 */ scanf(“%d”,&select;); switch(select){ case 1: InitList_Sq( &A ); break; case 2: InitList_Sq( &B ); break; case 3: Insert(&A);break; case 4: Insert(&B );break; case 5: Union(&A ,B);break; ………….. default: printf(“\n ERROR\n”); } } 四、思考与提高 1. 优化已完成的程序,使整个实验形成至少三级菜单管理; 2.美化输出界面,使得操作友好。
1. 本演示程序集合元素限定为数字,大小由用户输入。集合数字顺序不限,且一旦出现重复字符或非法字符,程序能自动滤去。输出的运算结果将不含重复数字或非法字符,且按照从小到大的顺序输出。<br>2. 演示程序以用户和计算机的对话方式执行,即在计算机上显示“提示信息”之后,由用户在键盘上输入演示程序规定的运算命令;相应的数据输入和运算结果显示在其后。<br>3. 程序执行的命令包括:<br>(1)构造集合1;(2)构造集合2;(3)判断某数是否为集合元素;(4)添加元素;(5)删除元素;(6)求并集(存入集合1);(7)求交集(存入集合3);(8)输出集合1;(9)输出集合2;(0)退出。<br>“构造集合1”和“构造集合2”时,需以整型数字形式键入集合元素。<br><br>为实现上述程序功能,以线性链表表示集合。为此,需要两个抽象数据类型:线性表集合。<br>1. 线性表的抽象数据类型定义为:<br> ADT LinkList{<br> 数据对象:D={ | IntSet,i=1,2,…,n,n 0}<br> 数据关系:R1={< , >| , D, < ,i=2,…,n}<br> 基本操作:<br> InitList(*L)<br> 操作结果:构造一个空的线性链表L。<br> IsElement(*L,e)<br> 初始条件:线性表L已存在。<br> 操作结果:若e是L的数据元素,返回1,否则返回0。<br> Append(*L,e)<br> 初始条件:线性表已存在。<br> 操作结果:按照由大到小的顺序线性表里插入元素e,不允许重复元素。<br> Delete(*L,e)<br> 初始条件:线性表已存在。<br> 操作结果:在L删除元素e。<br> }ADT LinkList<br>2. 集合的抽象数据类型定义为:<br> ADT LinkSet {<br> 数据对象:D={ | IntSet,i=1,2,…,n,n 0}<br> 数据关系:R1={}<br> 基本操作:<br> CreatSet(*L)<br> 初始条件:s为整型数组。<br> 操作结果:生成一个由s数字构成的集合。<br> Union(*S1,*S2)<br> 初始条件:集合S1和S2存在。<br> 操作结果:生成一个由S1和S2的并集构成的集合,返回到S1。<br> Intersection (*S1,*S2)<br> 初始条件:集合S1和S2存在。<br> 操作结果:生成一个由S1和S2的交集构成的集合,返回到S1。<br> PrintSet (*S)<br> 初始条件:集合S已存在。<br> 操作结果:依次显示集合S的全部元素。<br> }ADT LinkSet<br><br><br>带菜单<br>Turbo c 3.0编写
好的,我会尽力回答你的问题。首先,我们需要定义多项式的结构体: ```c #define MAX_LEN 100 typedef struct { float coef[MAX_LEN]; // 存放系数 int expn[MAX_LEN]; // 存放指数 int len; // 多项式的长度 } Polynomial; ``` 接下来,我们可以定义一些基本的操作,例如创建多项式、输出多项式等: ```c // 创建多项式 void createPoly(Polynomial *p) { int i = 0; printf("请输入多项式的项数:"); scanf("%d", &(p->len)); printf("请输入多项式的系数和指数:\n"); for (i = 0; i < p->len; i++) { scanf("%f %d", &(p->coef[i]), &(p->expn[i])); } } // 输出多项式 void printPoly(Polynomial p) { int i = 0; for (i = 0; i < p.len; i++) { if (i == 0) { printf("%0.2fx^%d", p.coef[i], p.expn[i]); } else { printf(" + %0.2fx^%d", p.coef[i], p.expn[i]); } } printf("\n"); } ``` 接下来,我们可以实现多项式的加法、减法和乘法: ```c // 多项式加法 void addPoly(Polynomial p1, Polynomial p2, Polynomial *p3) { int i = 0, j = 0, k = 0; while (i < p1.len && j < p2.len) { if (p1.expn[i] == p2.expn[j]) { p3->coef[k] = p1.coef[i] + p2.coef[j]; p3->expn[k] = p1.expn[i]; i++; j++; k++; } else if (p1.expn[i] > p2.expn[j]) { p3->coef[k] = p1.coef[i]; p3->expn[k] = p1.expn[i]; i++; k++; } else { p3->coef[k] = p2.coef[j]; p3->expn[k] = p2.expn[j]; j++; k++; } } while (i < p1.len) { p3->coef[k] = p1.coef[i]; p3->expn[k] = p1.expn[i]; i++; k++; } while (j < p2.len) { p3->coef[k] = p2.coef[j]; p3->expn[k] = p2.expn[j]; j++; k++; } p3->len = k; } // 多项式减法 void subPoly(Polynomial p1, Polynomial p2, Polynomial *p3) { int i = 0, j = 0, k = 0; while (i < p1.len && j < p2.len) { if (p1.expn[i] == p2.expn[j]) { p3->coef[k] = p1.coef[i] - p2.coef[j]; p3->expn[k] = p1.expn[i]; i++; j++; k++; } else if (p1.expn[i] > p2.expn[j]) { p3->coef[k] = p1.coef[i]; p3->expn[k] = p1.expn[i]; i++; k++; } else { p3->coef[k] = -p2.coef[j]; p3->expn[k] = p2.expn[j]; j++; k++; } } while (i < p1.len) { p3->coef[k] = p1.coef[i]; p3->expn[k] = p1.expn[i]; i++; k++; } while (j < p2.len) { p3->coef[k] = -p2.coef[j]; p3->expn[k] = p2.expn[j]; j++; k++; } p3->len = k; } // 多项式乘法 void mulPoly(Polynomial p1, Polynomial p2, Polynomial *p3) { int i = 0, j = 0, k = 0; float temp[MAX_LEN] = {0}; int expn[MAX_LEN] = {0}; for (i = 0; i < p1.len; i++) { for (j = 0; j < p2.len; j++) { int e = p1.expn[i] + p2.expn[j]; temp[e] += p1.coef[i] * p2.coef[j]; } } for (i = 0; i < MAX_LEN; i++) { if (temp[i] != 0) { expn[k] = i; p3->coef[k] = temp[i]; k++; } } p3->len = k; memcpy(p3->expn, expn, k * sizeof(int)); } ``` 最后,我们可以在 `main` 函数进行测试: ```c int main() { Polynomial p1, p2, p3; // 创建多项式 printf("请输入第一个多项式:\n"); createPoly(&p1); printf("第一个多项式为:"); printPoly(p1); printf("请输入第二个多项式:\n"); createPoly(&p2); printf("第二个多项式为:"); printPoly(p2); // 多项式加法 addPoly(p1, p2, &p3); printf("多项式加法的结果为:"); printPoly(p3); // 多项式减法 subPoly(p1, p2, &p3); printf("多项式减法的结果为:"); printPoly(p3); // 多项式乘法 mulPoly(p1, p2, &p3); printf("多项式乘法的结果为:"); printPoly(p3); return 0; } ``` 以上就是基于线性表顺序存储结构实现多项式加减乘运算的示例代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值