list.h
#ifndef LIST_H_INCLUDED #define LIST_H_INCLUDED /* * Copyright (c) 2015, 烟台大学计算机与控制工程学院 * All rights reserved. * 文件名称:main.cpp,hanshu.cpp,list.h * 作者:徐吉平 * 完成日期:2015年9月21日 * 版本号:code ::Block 13.12 * * 问题描述:顺序表:两集合的交集 * 输入描述:无 * 程序输出:线性表的结果 */ #include <stdio.h> #include <malloc.h> #define MaxSize 50 //Maxsize将用于后面定义存储空间的大小 typedef int ElemType; //ElemType在不同场合可以根据问题的需要确定,在此取简单的int typedef struct { ElemType data[MaxSize]; //利用了前面MaxSize和ElemType的定义 int length; }SqList; void unionList(SqList *LA, SqList *LB, SqList *&LC); void InitList(SqList *&L);//初始化链表 void CreateList(SqList *&L, ElemType a[], int n);//用数组创建线性表 bool ListInsert(SqList *&L,int i,ElemType e) ;//插入数据元素ListInsert(L,i,e) int ListLength(SqList *L);//求线性表的长度ListLength(L) bool GetElem(SqList *L,int i,ElemType &e);//求某个数据元素值GetElem(L,i,e) int LocateElem(SqList *L, ElemType e);//按元素值查找LocateElem(L,e) bool ListDelete(SqList *&L,int i,ElemType &e);//删除数据元素ListDelete(L,i,e) bool ListEmpty(SqList *L);//判断线性表是否为空 void DispList(SqList *L);//输出线性表 void DestroyList(SqList *&L);//销毁线性表DestroyList(L) #endif // LIST_H_INCLUDED
hanshu.cpp
#include "list.h" void unionList(SqList *LA, SqList *LB, SqList *&LC) { int lena; ElemType e; InitList(LC); for(int i=1;i<=LA->length;i++) { GetElem(LA,i,e); ListInsert(LC,i,e); } for(int i=1;i<=LB->length;i++) { GetElem(LB,i,e); //取LB中第i个数据元素赋给e if (!LocateElem(LA,e)) //LA中不存在和e相同者,插入到LC中 ListInsert(LC,++lena,e); } } //初始化线性表InitList(L) void InitList(SqList *&L) { L=(SqList *)malloc(sizeof(SqList)); L->length=0; } //用数组创建线性表CreateList(SqList L, ElemType a, int n) void CreateList(SqList *&L, ElemType a[], int n) { int i; L=(SqList *)malloc(sizeof(SqList)); for (i=0; i<n; i++) L->data[i]=a[i]; L->length=n; } //插入数据元素ListInsert(L,i,e) bool ListInsert(SqList *&L,int i,ElemType e) { int j; if(i<1||i>L->length+1) { return false; } i--; for(j=L->length;j>i;j--) { L->data[j]=L->data[j-1]; } L->data[i]=e; L->length++; return true; } //求线性表的长度ListLength(L) int ListLength(SqList *L) { return(L->length); } //求某个数据元素值GetElem(L,i,e) bool GetElem(SqList *L,int i,ElemType &e) { if (i<1 || i>L->length) return false; e=L->data[i-1]; return true; } //按元素值查找LocateElem(L,e) int LocateElem(SqList *L, ElemType e) { int i=0; while (i<L->length && L->data[i]!=e) i++; if (i>=L->length) return 0; else return i+1; } //删除数据元素ListDelete(L,i,e) bool ListDelete(SqList *&L,int i,ElemType &e) { int j; if (i<1 || i>L->length) //参数错误时返回false return false; i--; //将顺序表逻辑序号转化为物理序号 e=L->data[i]; for (j=i; j<L->length-1; j++) //将data[i..n-1]元素前移 L->data[j]=L->data[j+1]; L->length--; //顺序表长度减1 return true; //成功删除返回true } //判定是否为空表ListEmpty(L) bool ListEmpty(SqList *L) { return (L->length==0); } //输出线性表DispList(L) void DispList(SqList *L) { int i; if(ListEmpty(L)) return ; for (i=0;i<L->length;i++) printf("%d ",L->data[i]); printf("\n"); } //销毁线性表DestroyList(L) void DestroyList(SqList *&L) { free(L); }
main.cpp
#include <stdio.h> #include "list.h" int main() { SqList *sq_a,*sq_b,*sq_c; ElemType a[10]={0,1,2,3,4,5,6,7,8,9}; ElemType b[10]={5,6,7,8,9,10,11,12,13,14}; CreateList(sq_a, a, 10); CreateList(sq_b,b,10); printf("顺序表sq_a为:"); DispList(sq_a); printf("顺序表sq_b为:"); DispList(sq_b); unionList(sq_a, sq_b,sq_c); printf("顺序表sq_c为:"); DispList(sq_c); return 0; }
总结体会:该项目充分的利用了算法库的函数,使项目的编写大大简化了,unionList(sq_a, sq_b,sq_c)函数编写时由于对顺序表sq_c没有初始化,程序始终无法运行。后来经过老师指正后,虽然程序能运行了,但结果却不正确,经过反复查找问题发现,将sq_a复制给sq_c的语句是不对的,因为sq_c的长度是不是固定的,用sq_c->data[i]=sq_a->data[i]是不行的,只能通过先提取数据元素再插入到sq_c的方式才能解决sq_c的长度问题,所以问题终于解决了