《数据结构》课程设计报告2014-2015学年第一学期课程设计题目:设计学生姓名:所在系部名称:计算机工程系所在班级名称:计算机科学2013()参加设计时间:课程设计课时: 30指导教师姓名:年月日第一题目:假设有两个集合 A 和 B 分别用两个线性表 LA 和 LB 表示,即线性表中的数据元素即为集合中的成员。
现要求一个新的集合C=A∪B。
算法思想:先初始化线性表LC,将LA的所有元素复制到LC中,然后扫描线性表LB,若LB的当前元素不在线性表LA中,则将其插入到LC中。
Void unionList(List LA, ListB, list &LC){int Lena, Lenc, i;Elem Type e;Init List (LC);for (i=1;i<=ListLength (LA);i++) /*将LA的所有元素插入到LA中*/{GetLElem(LA,i,e);ListInsert(LC,i,e,);}Lena=ListLength(LA);/*求线性表的长度*/Lenb=ListLength(LB);For(i=1,i<=Lenb;i++){GetElem(LB,i,e);/*取LB中第i个数据元素赋给e*/If(!LocateElem(LA),e));ListInsert(LC,++Lena,e);/*C中不存在和e相同者,则插入到LA中*/}}第二题目:有顺序表LA和LB,其元素均按从小到大的升序排列,编写一个算法将它们合并成一个顺序表LC,要求LC的元素也是按从小到大的升序排列。
算法思想:依次扫描顺序表A和BD的元素,比较当前元素的值,将较小值的元素赋给C,重复,直到一个线性表扫描完毕,然后将未完的那个顺序表中余下部分赋给C。
顺序表C的容量要能够容纳A、B两个顺序表相加的长度。
#include <stdio.h>#include <stdlib.h>#define DataType int#define MAXSIZE 100typedef struct{DataType data[MAXSIZE];int last;}seqlist;seqlist *Init_seqlist(){seqlist *L;L=(seqlist*)malloc(sizeof(seqlist));if(L){L->last=-1;return L;}}void merge(seqlist A,seqlist B,seqlist *C) {int i,j,k;i=0;j=0;k=0;while(i<=st&&j<=st)if(A.data[i]<B.data[j]){C->data[k]=A.data[i];k++;i++;}else{C->data[k]=B.data[j];k++;j++;}while(i<=st){C->data[k]=A.data[i];k++;i++;}while(j<=st){C->data[k]=B.data[j];k++;j++;}C->last=k-1;}void main(){seqlist A,B,*C;int r;int i,j,k;printf("请输入线性表A的长度:");scanf("%d",&r);st = r-1;printf("请输入线性表A的各元素值:\n");for(i=0; i<=st; i++){scanf("%d",&A.data[i]);}printf("\n请输出线性表A的各元素值:\n"); for(j=0;j<=st;j++)printf("%6d",A.data[j]);printf("\n请输入线性表B的长度:");scanf("%d",&r);st = r-1;printf("请输入线性表B的各元素值:\n");for(i=0; i<=st; i++){scanf("%d",&B.data[i]);}printf("\n请输出线性表B的各元素值:\n"); for(j=0;j<=st;j++)printf("%6d",B.data[j]);C=Init_seqlist();merge(A,B,C);printf("\n合并后线性表C的各元素值:\n"); for(k=0;k<=C->last;k++){printf("%6d",C->data[k]);}printf("\n");}运行结果:第三题目:新建一个单链表,求(1)单链表的长度.(2)取单链表的第i个数据元素.(3)对单链表进行插入操作.(4)对单链表进行删除操作。
算法思想:1)设一个移动指针P和计数器i,P所指结点后面若还有结点,P向后移动,计数器家1。
(2)从链表的第一个元素结点开始,判断当前结点值是否等于X。
若是,返回该结点的指针,否则继续后一个,直到链表结束为止。
找不到时返回空指针。
(3)第一步:查找第i-1个结点,若存在,继续第二步,否则结束。
第二步:申请、填装新结点。
;第三步:将新结点插入,结束。
(4)第一步:查找第i-1个结点,若存在,继续第二步,否则结束;第二步:若存在第i个结点则继续第三步,否则结束;第三步:删除第i个结点,结束。
程序代码:#include "common.h"#include "linklist.h"//求单链表的长度----取单链表的第I个数据元素---对单链表进行插入操作--对单链表进行删除操作void init_linklist(LinkList *l)/*对单链表进行初始化*/{*l=(LinkList)malloc(sizeof(Node));(*l)->next=NULL;}void CreateFromHead(LinkList L){Node *s;//char c;int c;int flag=1;while(flag) /* flag初值为1,当输入"0"时,置flag为0,建表结束*/{//c=getchar();scanf("%d",&c);fflush(stdin);if(c!=0){s=(Node*)malloc(sizeof(Node)); /*建立新结点s*/s->data=c;s->next=L->next;/*将s结点插入表头*/L->next=s;}elseflag=0;}}int ListLength(LinkList L)/*求带头结点的单链表L的长度*/{Node *p;int j;p=L->next;j=0; /*用来存放单链表的长度*/while(p!=NULL){p=p->next;j++;}return j; /*j为求得的单链表长度*/}Node *get_linklist(LinkList L,int i){Node *p;int j;p=L;j=0;while((p!=NULL)&&(j<i)){p=p->next;j++;}if(p!=NULL)return(p);elsereturn(0);}void Print(LinkList L){Node *p;p = L->next;while(p!=NULL){printf("%3d",p->data);p=p->next;}}int Insert_Linklist(LinkList L,int i,int x) {Node *p,*s;p=get_linklist(L,i-1);if(p==NULL)return 0;else{s=(Node*)malloc(sizeof(Node));s->data=x;s->next=p->next;p->next=s;return 1;}}int Del_LinkList(LinkList L,int i){LinkList p,s;p=get_linklist(L,i-1);if(p==NULL)return -1;else{if(p->next==NULL)return 0;else{s=p->next;p->next=s->next;free (s);return 1;}}}void main(){LinkList l;Node *q;int length,location,insertlocation,insertvalue,deleteposition;int length1;init_linklist(&l);printf("\n用头插法建立单链表,请输入链表数据,以0结束!\n");CreateFromHead(l);printf("带头结点的单链表L为:");Print(l);length=ListLength(l);printf("\n带头结点的单链表L的长度为:%4d\n",length);printf("要查找单链表L的位置为:");scanf("%d",&location);q=get_linklist(l,location);printf("要查找单链表L的元素为:%3d\n",q->data);//插入操作printf("要插入单链表L的位置为:");scanf("%d",&insertlocation);printf("要插入单链表L的元素值为:");scanf("%d",&insertvalue);Insert_Linklist(l,insertlocation,insertvalue);printf("插入元素后带头结点的单链表L为:");Print(l);//插入元素后的单链表的长度length1=ListLength(l);printf("\n带头结点的单链表L的长度为:%4d\n",length1);////删除操作printf("要删除单链表L的位置为:");scanf("%d",&deleteposition);Del_LinkList(l,deleteposition);printf("删除元素后带头结点的单链表L为:");Print(l);printf("\n");}运行结果:第四题目:新建一个单链表,写一个算法实现单链表的就地逆置。