课程设计1 线性表及应用

  • 格式:doc
  • 大小:261.00 KB
  • 文档页数:19

题目: 线性表及应用 内容: 题目: 线性表及应用 日期: 2011年5月25日星期三 姓名: 肖剑锋 学号:026308 一. 实习目的

帮助学生熟练掌握线性表的基本操作在两种存储结构上的实现,其中以单链表的操作和应用为重点内容。

二. 问题描述 编制一个演示单链表的建立、打印、查找、插入、删除等操作的程序。 三. 需求分析 1. 创建单链表 2. 向链表中查人数据 3. 删除链表中的数据 4. 查找链表中的内容 5. 打印内容 四. 概要设计

为了实现上述程序功能,需要定义一个简化的线性表抽象数据类型:

ADT LinearList { 数据对象:D={ai|ai∈IntegerSet,i=0,1,2,…,n,n≥0} 结构关系:R={|ai,ai+1 ∈D} 基本操作: InitLinkList(L) 操作前提:L是一个未初始化的线性表 操作结果:将L初始化为一个空的线性表 CrtLinkList(L) 操作前提:L是一个已初始化的空表 操作结果:建立一个非空的线性表L InsLinkList(L,pos,e) 操作前提:线性表L已存在 操作结果:将元素e插入到线性表L的pos位置 DelLinkList(L,pos,e) 操作前提:线性表L已存在 操作结果:将线性表L中pos位置的元素删除, 删除的元素值通过e返回 LocLinkList(L,e) 操作前提:线性表L已存在 操作结果:在线性表L中查找元素e, 若存在,返回元素在表中的序号位置; 若不存在,返回-1 }

五. 详细设计(给出算法的伪码描述) (1).判断表长是否足够,如果不足,重新分配存储空间;

(2).从后向前,依次后移大于x的元素 for(i=L.length-1;(i>=0)&&(L.elem[i]>x);i--) L.elem[i+1]=L.elem[i]; (3).插入x到第i+1个位置,修改表长等信息。 (4).完成操作

2.顺序表的就地逆置实际只需要将对应位置的元素交换即可,即将第1个与第n个元素交换,第2个与第n-1个交换……

for(i=0;i L.elem[i]<->L.elem[n-1-i]

3.用单链表表示集合,假设集合A、B分别由链表la和lb表示,运算结果集合c由lc表示。 并:(1) 将la链表复制到lc中 (2)从前到后依次从lb中取出元素,首先判断la中是否存在相同元素,若存在,则直接取下一个元素,若不存在,则将该元素插入到lc中,再取下一个元素。 交:即找出链表la和lb中都有的元素,把他们增加到lc中 差:即把la当中存在,但是lb中没有的元素,增加到lc中。

六. 测试分析 白盒: 查看代码完整性 黑盒: 测试是否可以正确的创建,删除,插入,打印,查找等操作 七. 使用说明 点击删除键:删除1条内容 点击插入键:插入如一条信息 点击打印键:打印内容 点击查找键:查找内容 八. 附录:测试数据 测试内容 测试结果 点击删除键删除一条内容 正确 点击插入键插入一条信息 正确 点击打印键正常打印内容 正确 点击查找键正常查找内容 正确

九. 附C语言实现源码 #include #include #include

#define TURE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 typedef int Status; typedef int ElemType;

typedef struct LNode{ ElemType data; struct LNode *next; }LNode, *LinkList;

void CreatSet(LinkList *L,int n) //初始化链表L,n为集合的元素个数 {ElemType x; LinkList p; *L=(LinkList)malloc(sizeof(LNode)); (*L)->next=NULL; printf("\nPlease input %d elemts:",n); while(n>0) { p=(LinkList)malloc(sizeof(LNode)); scanf("%d",&x); p->data=x; p->next=(*L)->next; (*L)->next=p; n--; } } void Output(LinkList L) //输出集合L的元素 {LinkList p; printf("["); for(p=L->next;p;p=p->next) printf("%d,",p->data); printf("]"); }

int LocateElem(LinkList L,ElemType e) //在集合L中查找元素e,若存在返回其在链表中的结点序号,若不在在返回0 {LinkList p; int i=0,loc=0; p=L->next; while(p) {i++; if(p->data==e) {loc=i;break;} p=p->next; } return(loc); }

LinkList ComSet(LinkList A,LinkList B) //求集合A、B的并集合 {LinkList C,p,q; C=(LinkList)malloc(sizeof(LNode)); C->next=NULL; for(p=A->next;p;p=p->next) {q=(LinkList)malloc(sizeof(LNode)); q->data=p->data; q->next=C->next; C->next=q; } for(p=B->next;p;p=p->next) if(!LocateElem(C,p->data)) {q=(LinkList)malloc(sizeof(LNode)); q->data=p->data; q->next=C->next; C->next=q; } return(C); }

LinkList IntSet(LinkList A,LinkList B) //交集 {LinkList C,p,q; C=(LinkList)malloc(sizeof(LNode)); C->next=NULL; for(p=A->next;p;p=p->next) if(LocateElem(B,p->data)) {q=(LinkList)malloc(sizeof(LNode)); q->data=p->data; q->next=C->next; C->next=q; } return(C); }

LinkList SubSet(LinkList A,LinkList B) //差集 {LinkList C,p,q; C=(LinkList)malloc(sizeof(LNode)); C->next=NULL; for(p=A->next;p;p=p->next) if(!LocateElem(B,p->data)) {q=(LinkList)malloc(sizeof(LNode)); q->data=p->data; q->next=C->next; C->next=q; } return(C); }

void main() {LinkList A,B,C; int n; printf("\n输入集合A的大小:"); scanf("%d",&n); CreatSet(&A,n); printf("\n输入集合B的大小:"); scanf("%d",&n); CreatSet(&B,n); printf("\n集合 A:"); Output(A); printf("\n集合 B:"); Output(B); C=ComSet(A,B); printf("\n集合A并B:"); Output(C); C=IntSet(A,B); printf("\n集合A交B:"); Output(C); C=SubSet(A,B); printf("\n集合AB的差:"); Output(C); printf("\n"); }

十.附程序运行结果截图