求助大神一道数据结构的编程题题,用C语言编程,用顺序表实现 蟹蟹蟹蟹!!!
数据结构,用C语言编程。写出C=AUB就是顺序表的合并。急求大神!!!!
typedef struct {
ElemType* elem;
int length;
int listsize;
}SqList;
void Union(SqList La,SqList Lb,SqList& Lc){
for(int i=k=0;i Lc.elem[k++] = La.elem[i]; } for(int j=0;j for(int i = 0;i if(i == La.length) Lc.elem[k++] = Lb.elem[j]; } Lc.length = k;//修改表长 } 特别说明: 把c1.h,C2-1.H,Bo2-1.cpp,Func2-2.cpp, Main2-1.cpp 它们分别单独存为文件,然后把他们放在一个文件夹中,最后双击Main2-1.cpp。 // c1.h (文件名) #include<string.h> // 字符串函数头文件 #include<ctype.h> // 字符函数头文件 #include<malloc.h> // malloc()等 #include<limits.h> // INT_MAX等 #include<stdio.h> // 标准输入输出头文件,包括EOF(=^Z或F6),NULL等 #include<stdlib.h> // atoi(),exit() #include<io.h> // eof() #include<math.h> // 数学函数头文件,包括floor(),ceil(),abs()等 #include<sys/timeb.h> // ftime() #include<stdarg.h> // 提供宏va_start,va_arg和va_end,用于存取变长参数表 // 函数结果状态代码。 #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 // #define INFEASIBLE -1 没使用 // #define OVERFLOW -2 因为在math.h中已定义OVERFLOW的值为3,故去掉此行 typedef int Status; // Status是函数的类型,其值是函数结果状态代码,如OK等 typedef int Boolean; // Boolean是布尔类型,其值是TRUE或FALSE, // c2-1.h 线性表的动态分配顺序存储结构。 #define LIST_INIT_SIZE 10 // 线性表存储空间的初始分配量 #define LIST_INCREMENT 2 // 线性表存储空间的分配增量 struct SqList { ElemType *elem; // 存储空间基址 int length; // 当前长度 int listsize; // 当前分配的存储容量(以sizeof(ElemType)为单位) }; // bo2-1.cpp 顺序存储的线性表(存储结构由c2-1.h定义)的基本操作(12个),包括算法2.3~2.6 void InitList(SqList &L) // 算法2.3 { // 操作结果:构造一个空的顺序线性表L L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType)); if(!L.elem) // 存储分配失败 exit(OVERFLOW); L.length=0; // 空表长度为0 L.listsize=LIST_INIT_SIZE; // 初始存储容量 } void DestroyList(SqList &L) { // 初始条件:顺序线性表L已存在。操作结果:销毁顺序线性表L free(L.elem); // 释放L.elem所指的存储空间 L.elem=NULL; // L.elem不再指向任何存储单元 L.length=0; L.listsize=0; } void ClearList(SqList &L) { // 初始条件:顺序线性表L已存在。操作结果:将L重置为空表 L.length=0; } Status ListEmpty(SqList L) { // 初始条件:顺序线性表L已存在。 // 操作结果:若L为空表,则返回TRUE;否则返回FALSE if(L.length==0) return TRUE; else return FALSE; } int ListLength(SqList L) { // 初始条件:顺序线性表L已存在。操作结果:返回L中数据元素的个数 return L.length; } Status GetElem(SqList L,int i,ElemType &e) { // 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) // 操作结果:用e返回L中第i个数据元素的值 if(i<1||i>L.length) // i不在表L的范围之内 return ERROR; e=*(L.elem+i-1); // 将表L的第i个元素的值赋给e return OK; } int LocateElem(SqList L,ElemType e,Status(*compare)(ElemType,ElemType)) { // 初始条件:顺序线性表L已存在,compare()是数据元素判定函数(满足为1,否则为0) // 操作结果:返回L中第1个与e满足关系compare()的数据元素的位序。 // 若这样的数据元素不存在,则返回值为0。算法2.6 int i=1; // i的初值为第1个元素的位序 ElemType *p=L.elem; // p的初值为第1个元素的存储位置 while(i<=L.length&&!compare(*p++,e)) // i未超出表的范围且未找到满足关系的数据元素 ++i; // 继续向后找 if(i<=L.length) // 找到满足关系的数据元素 return i; // 返回其位序 else // 未找到满足关系的数据元素 return 0; } Status PriorElem(SqList L,ElemType cur_e,ElemType &pre_e) { // 初始条件:顺序线性表L已存在 // 操作结果:若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱; // 否则操作失败,pre_e无定义 int i=2; // 从第2个元素开始 ElemType *p=L.elem+1; // p指向第2个元素 while(i<=L.length&&*p!=cur_e) // i未超出表的范围且未找到值为cur_e的元素 { p++; // p指向下一个元素 i++; // 计数加1 } if(i>L.length) // 到表结束处还未找到值为cur_e的元素 return ERROR; // 操作失败 else // 找到值为cur_e的元素,并由p指向其 { pre_e=*--p; // p指向前一个元素(cur_e的前驱),将所指元素的值赋给pre_e return OK; // 操作成功 } } Status NextElem(SqList L,ElemType cur_e,ElemType &next_e) { // 初始条件:顺序线性表L已存在 // 操作结果:若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继, // 否则操作失败,next_e无定义 int i=1; // 从第1个元素开始 ElemType *p=L.elem; // p指向第1个元素 while(i<L.length&&*p!=cur_e) // i未到表尾且未找到值为cur_e的元素 { p++; // p指向下一个元素 i++; // 计数加1 } if(i==L.length) // 到表尾的前一个元素还未找到值为cur_e的元素 return ERROR; // 操作失败 else // 找到值为cur_e的元素,并由p指向其 { next_e=*++p; // p指向下一个元素(cur_e的后继),将所指元素的值赋给next _e return OK; // 操作成功 } } Status ListInsert(SqList &L,int i,ElemType e) // 算法2.4 { // 初始条件:顺序线性表L已存在,1≤i≤ListLength(L)+1 // 操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1 ElemType *newbase,*q,*p; if(i<1||i>L.length+1) // i值不合法 return ERROR; if(L.length==L.listsize) // 当前存储空间已满,增加分配,修改 { newbase=(ElemType*)realloc(L.elem,(L.listsize+LIST_INCREMENT)*sizeof(ElemType)); if(!newbase) // 存储分配失败 exit(OVERFLOW); L.elem=newbase; // 新基址赋给L.elem L.listsize+=LIST_INCREMENT; // 增加存储容量 } q=L.elem+i-1; // q为插入位置 for(p=L.elem+L.length-1;p>=q;--p) // 插入位置及之后的元素右移(由表尾元素开始移) *(p+1)=*p; *q=e; // 插入e ++L.length; // 表长增1 return OK; } Status ListDelete(SqList &L,int i,ElemType &e) // 算法2.5 { // 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) // 操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1 ElemType *p,*q; if(i<1||i>L.length) // i值不合法 return ERROR; p=L.elem+i-1; // p为被删除元素的位置 e=*p; // 被删除元素的值赋给e q=L.elem+L.length-1; // q为表尾元素的位置 for(++p;p<=q;++p) // 被删除元素之后的元素左移(由被删除元素的后继元素开始移) *(p-1)=*p; L.length--; // 表长减1 return OK; } void ListTraverse(SqList L,void(*visit)(ElemType&)) { // 初始条件:顺序线性表L已存在 // 操作结果:依次对L的每个数据元素调用函数visit() // visit()的形参加'&',表明可通过调用visit()改变元素的值 ElemType *p=L.elem; // p指向第1个元素 int i; for(i=1;i<=L.length;i++) // 从表L的第1个元素到最后1个元素 visit(*p++); // 对每个数据元素调用visit() printf("\n"); } // func2-2.cpp 几个常用的函数 Status equal(ElemType c1,ElemType c2) { // 判断是否相等的函数 if(c1==c2) return TRUE; else return FALSE; } int comp(ElemType a,ElemType b) { // 根据a<、=或>b,分别返回-1、0或1 if(a==b) return 0; else return (a-b)/abs(a-b); } void print(ElemType c) { // 以十进制整型的格式输出元素的值 printf("%d ",c); } void print1(ElemType &c) { // 以十进制整型的格式输出元素的值(设c为引用类型) printf("%d ",c); } void print2(ElemType c) { // 以字符型的格式输出元素的值 printf("%c ",c); } // main2-1.cpp 检验bo2-1.cpp的主程序 #include"c1.h" typedef int ElemType; // 定义ElemType为整型 #include"c2-1.h" // 线性表的顺序存储结构 #include"bo2-1.cpp" // 线性表顺序存储结构的基本操作 #include"func2-2.cpp" // 包括equal()、comp()、print()、print1()和print2()函数 Status sq(ElemType c1,ElemType c2) { // 数据元素判定函数(平方关系),LocateElem()调用的函数 if(c1==c2*c2) return TRUE; else return FALSE; } void dbl(ElemType &c) { // ListTraverse()调用的另一函数(元素值加倍) c*=2; } void main() { SqList L; ElemType e,e0; Status i; int j,k; InitList(L); // 初始化线性表L printf("初始化L后,L.length=%d,L.listsize=%d,L.elem=%u\n",L.length, L.listsize,L.elem); for(j=1;j<=5;j++) i=ListInsert(L,1,j); // 在L的表头插入j printf("在L的表头依次插入1~5后,*L.elem="); for(j=1;j<=5;j++) printf("%d ",*(L.elem+j-1)); // 依次输出表L中的元素 printf("\n调用ListTraverse()函数,依次输出表L中的元素:"); ListTraverse(L,print1); // 依次对表L中的元素调用print1()函数(输出元素的值) i=ListEmpty(L); // 检测表L是否空 printf("L.length=%d(改变),L.listsize=%d(不变),",L.length,L.listsize); printf("L.elem=%u(不变),L是否空?i=%d(1:是 0:否)\n",L.elem,i); ClearList(L); // 清空表L i=ListEmpty(L); // 再次检测表L是否空 printf("清空L后,L.length=%d,L.listsize=%d,",L.length,L.listsize); printf("L.elem=%u,L是否空?i=%d(1:是 0:否)\n",L.elem,i); for(j=1;j<=10;j++) ListInsert(L,j,j); // 在L的表尾插入j printf("在L的表尾依次插入1~10后,L="); ListTraverse(L,print1); // 依次输出表L中的元素 printf("L.length=%d,L.listsize=%d,L.elem=%u\n",L.length,L.listsize,L.elem); ListInsert(L,1,0); // 在L的表头插入0,增加存储空间 printf("在L的表头插入0后,L.length=%d(改变),L.listsize=%d(改变)," "L.elem=%u(有可能改变)\n",L.length,L.listsize,L.elem); GetElem(L,5,e); // 将表L中的第5个元素的值赋给e printf("第5个元素的值为%d\n",e); for(j=10;j<=11;j++) { k=LocateElem(L,j,equal); // 查找表L中与j相等的元素,并将其位序赋给k if(k) // k不为0,表明有符合条件的元素 printf("第%d个元素的值为%d,",k,j); else // k为0,没有符合条件的元素 printf("没有值为%d的元素\n",j); } for(j=3;j<=4;j++) // 测试2个数据 { k=LocateElem(L,j,sq); // 查找表L中与j的平方相等的元素,并将其位序赋给k if(k) // k不为0,表明有符合条件的元素 printf("第%d个元素的值为%d的平方,",k,j); else // k为0,没有符合条件的元素 printf("没有值为%d的平方的元素\n",j); } for(j=1;j<=2;j++) // 测试头2个数据 { GetElem(L,j,e0); // 将表L中的第j个元素的值赋给e0 i=PriorElem(L,e0,e); // 求e0的前驱,如成功,将值赋给e if(i==ERROR) // 操作失败 printf("元素%d无前驱,",e0); else // 操作成功 printf("元素%d的前驱为%d\n",e0,e); } for(j=ListLength(L)-1;j<=ListLength(L);j++) // 最后2个数据 { GetElem(L,j,e0); // 将表L中的第j个元素的值赋给e0 i=NextElem(L,e0,e); // 求e0的后继,如成功,将值赋给e if(i==ERROR) // 操作失败 printf("元素%d无后继\n",e0); else // 操作成功 printf("元素%d的后继为%d,",e0,e); } k=ListLength(L); // k为表长 for(j=k+1;j>=k;j--) { i=ListDelete(L,j,e); // 删除第j个数据 if(i==ERROR) // 表中不存在第j个数据 printf("删除第%d个元素失败。",j); else // 表中存在第j个数据,删除成功,其值赋给e printf("删除第%d个元素成功,其值为%d",j,e); } ListTraverse(L,dbl); // 依次对元素调用dbl(),元素值乘2 printf("L的元素值加倍后,L="); ListTraverse(L,print1); // 依次输出表L中的元素 DestroyList(L); // 销毁表L printf("销毁L后,L.length=%d,L.listsize=%d,L.elem=%u\n",L.length, L.listsize,L.elem); } /* ------数据类型预定义------ */ typedef int Status; //函数结果状态类型 /* ------函数结果状态代码------ */ #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define OVERFLOW -2 /* ------队列数据类型定义------ */ typedef int QElemType; //队列中元素的数据类型 /* ------数据类型预定义------ */ typedef int Status; //函数结果状态类型 /* ------队列动态存储分配初始常量预定义------ */ #define QUEUE_INIT_SIZE 100 //队列存储空间的初始分配量 #define QUEUEINCREMENT 10 //队列存储空间的分配增量 #define MAXQUEUESIZE 100 //循环队列最大长度 /* ------全局变量定义------ */ int FLAG; //出、入队列操作标志 /* ------队列存储结构类型定义------ */ typedef struct { QElemType *base; //队列初始化动态分配存储空间 int front; //对头指针向量,若队列不空,指向队列头元素 int rear; //队尾指针向量,若队列不空,指向队列尾元素的下一个位置 }SqQueue; //顺序队列结构类型 Status InitQueue(SqQueue &Q) { //构造一个空队列Q Q.base = (QElemType *)malloc(QUEUE_INIT_SIZE * sizeof(QElemType)); if (!Q.base) return(OVERFLOW); Q.front = Q.rear = 0; FLAG = 0; return OK; } //InitQueue Status StatusQueue(SqQueue &Q) { //返回队列当前状态 if(Q.front == Q.rear && FLAG == 0) //队列为空 return FLASH; if(Q.front == Q.rear && FLAG == 1) //队列为满 return TURE; } //StatusQueue Status EnQueue(SqQueue &Q, QElemType e) { //元素e入队列 if (StatusQueue(Q)) //队列为满 return ERROR; Q.base[Q.rear] = e; Q.rear = (Q.rear + 1) % MAXQUEUESIZE; FLAG = 1; return OK; } //EnQueue Status DeQueue(SqQueue &Q, QElemType &e) { //元素e出队列 if (!StatusQueue(Q)) return ERROR; e = Q.base[Q.front++]; FLAG = 0; return OK; } //DeQueue求解一道数据结构的题目,用C语言解,考试用的,急,谢谢。
数据结构题目,用c语言实现。