加设以两个元素依值递增有序排列的线性表A和B分别表示两个集合(即同一表中的元素各不相同),现要求另辟
#include
#include
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -2
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define Compare( a, b) ( ((a) == (b)) ? (1) : (0) )
typedef int ElemType;
typedef int Status;
typedef struct{
ElemType *elem;
int length;
int listsize;
}Sqlist;
Status InitList_Sq(Sqlist *L) {
L->elem = (ElemType *) malloc (LIST_INIT_SIZE * sizeof(ElemType) );
if(!L->elem) exit( OVERFLOW );
L->length=0;
L->listsize = LIST_INIT_SIZE;
return OK;
}
Status ListInsert_Sq ( Sqlist *L, int i, ElemType e ){
ElemType *newbase, *p, *q;
if(iL->length+1) return ERROR;
if(L->length >= L->listsize) {
newbase = (ElemType *)realloc(L->elem, (L->listsize+LISTINCREMENT)*sizeof(ElemType) );
if(!newbase) exit(OVERFLOW);
L->elem = newbase;
L->listsize += LISTINCREMENT;
}
q = &(L->elem[i-1]);
for( p = &(L->elem[L->length-1]); p >= q; --p)
*(p+1)=*p;
*q = e;
++L->length;
return OK;
}
Status ListDisplay(Sqlist A){
int i=0;
while(i < A.length) {
printf("%5d", A.elem[i]);
i++;
}
}
void Mergelist_Sq(Sqlist La, Sqlist Lb, Sqlist *Lc) {
ElemType *pa, *pb, *pc, *pa_last, *pb_last;
pa = La.elem;
pb = Lb.elem;
Lc->listsize = Lc->length = La.length + Lb.length;
Lc->elem = (ElemType*) malloc (Lc->listsize * sizeof(ElemType));
pc = Lc->elem;
if(!Lc->elem) exit(OVERFLOW);
pa_last = La.elem + La.length - 1;
pb_last = Lb.elem + Lb.length - 1;
while( pa <= pa_last && pb <= pb_last) {
if(*pa <= *pb) *pc++ = *pa++;
else *pc++ = *pb++;
}
while(pa <= pa_last) *pc++ = *pa++;
while(pb <= pb_last) *pc++ = *pb++;
}
void INSERTION_SORT(Sqlist *A)
{
int i, j, key;//key 是关键字,从j开始的部分,是未排序的部分;i 则代表已排序数组最后元素的数组下标
for(j = 1; j != A->length; j++) {
key = A->elem[j];
i = j - 1;
while( i >= 0 && A->elem[i] > key ) {
A->elem[i+1] = A->elem[i];
--i;
}
A->elem[i+1] = key;
}
}
int main( void ) {
int e, i, a, b;
Sqlist A, B, C;
InitList_Sq(&A);
InitList_Sq(&B);
printf("请输入第一个表结点数:");
scanf("%d", &a);
for(i=0; i< a; i++){
printf("请输入第%d个数
", i+1);
scanf("%d", &e);
ListInsert_Sq(&A,i+1,e);
}
ListDisplay(A);
printf("
请输入第二个表结点数:");
scanf("%d", &a);
for(i=0; i< a; i++){
printf("请输入第%d个数
", i+1);
scanf("%d", &e);
ListInsert_Sq(&B,i+1,e);
}
ListDisplay(B);
printf("
");
INSERTION_SORT(&A);
INSERTION_SORT(&B);
ListDisplay(A);
printf("
");
ListDisplay(B);
printf("
两个表的合并:
");
Mergelist_Sq(A, B, &C);
ListDisplay(C);
printf("
");
system("PAUSE");
}
/*当两个顺序表合并的时候,最大的问题,可能不是合并本身,而是合并前的排序 ,考虑到
了了们的水平有限,这里就使用了比较简单的插入排序。*/
#include"stdio.h"
#include"malloc.h"
struct list
{
int data;
struct list *next;
};
struct list *head1,*head2,*p1,*p2,*q1,*q2;
void main()
{
int n=0;
void unionlist();
p1=q1=(struct list*)malloc(sizeof(struct list));
printf("请输入第一个链表的信息
");
scanf("%d",&p1->data);
while(p1->data!=0)
{
n=n+1;
if(n==1)
head1=q1;
else
q1->next=p1;
q1=p1;
p1=(struct list*)malloc(sizeof(struct list));
scanf("%d",&p1->data);
}
q1->next=NULL;
n=0;
p2=q2=(struct list*)malloc(sizeof(struct list));
printf("请输入第二个链表的信息
");
scanf("%d",&p2->data);
while(p2->data!=0)
{
n=n+1;
if(n==1)
head2=q2;
else
q2->next=p2;
q2=p2;
p2=(struct list*)malloc(sizeof(struct list));
scanf("%d",&p2->data);
}
q2->next=NULL;
unionlist();
}
void unionlist()
{
struct list *head,*p;
int i=0;
p1=head1;
p2=head2;
head=p=(struct list*)malloc(sizeof(struct list));
p->data=0;
while(p1 && p2)
{
if(p1->datadata)
{
p->next=p1;
p=p1;
p1=p1->next;
}
else
{
p->next=p2;
p=p2;
p2=p2->next;
}
}
p->next=p1?p1:p2;
p=head;
printf("合并后的链表为如下:
");
while(p)
{
i=i+1;
if(i==1)
p=p->next;
printf("%3d",p->data);
p=p->next;
}
printf("
");
free(head1);
free(head2);
}
Status ListMergeOppose_L(LinkList &A,LinkList &B,LinkList &C)
{
LinkList pa,pb,qa,qb;
pa=A;
pb=B;
qa=pa;// 保存pa的前驱指针
qb=pb;// 保存pb的前驱指针
pa=pa->next;
pb=pb->next;
A->next=NULL;
C=A;
while(pa&&pb){
if(pa->data<pb->data){
qa=pa;
pa=pa->next;
qa->next=A->next;//将当前最小结点插入A表表头
A->next=qa;
}
else{
qb=pb;
pb=pb->next;
qb->next=A->next;//将当前最小结点插入A表表头
A->next=qb;
}
}
while(pa){
qa=pa;
pa=pa->next;
qa->next=A->next;
A->next=qa;
}
while(pb){
qb=pb;
pb=pb->next;
qb->next=A->next;
A->next=qb;
}
pb=B;
free(pb);
return OK;
}
题目没写全呀!
答:void Delete(LinkList L)//删除表中所有值大于mink且小于maxk的元素 { int maxk,mink;LinkList p,q;printf("请输入mink,maxk:\n");scanf("%d %d",&mink,&maxk);p=L;while(p->next){ if( p->next->data > mink&& p->next->data < maxk){ q=p;p=p->next;free(q);} els...
答:在长式元素周期表中,元素是以元素的原子序排列,最小的排行最先。表中一横行称为一个周期,一列称为一个族,最后有两个系。除长式元素周期表外,常见的还有短式元素周期表,螺旋元素周期表,三角元素周期表等。 道尔顿提出科学原子论后,随着各种元素的相对原子质量的数据日益完善和原子价(化合价)...
答:{//已知单链线性表La和Lb的元素按值非递减排列。归并为Lc后也按值非递减排列。node *pa,*pb,*pc;pa=La->next;pb=Lb->next;Lc=pc=La; //有头结点while(pa&&pb) //将pa 、pb结点按大小依次插入Lc中{ if (pa->data<=pb->data){pc->next=pa;pc=pa;pa=pa->next;}else{pc->next...
答:抒情的 歌手:Mariah Carey 1.Hero 2.I Want To Know What Love Is 3.My All 4.Angels Cry 5.Butterfly 欢快的 1.Bye Bye 2.I Stay In Love 3.Touch My Body 4.Always Be My Baby 5.Obsessed(Superclean)以上都是Mariah Carey的歌,不用那么麻烦去找别人的歌,她的歌让听众有耳目一...
答:1)、设置两个变量I、J,排序开始的时候I:=1,J:=N;2)以第一个数组元素作为关键数据,赋值给X,即X:=A[1];3)、从J开始向前搜索,即由后开始向前搜索(J:=J-1),找到第一个小于X的值,两者交换;4)、从I开始向后搜索,即由前开始向后搜索(I:=I+1),找到第一个大于X的值...
答:排序是将文件按关键字的递增(减)顺序排列; 排序文件中有相同的关键字时,若排序后相对次序保持不变的称稳定排序,否则称不稳定排序; 在排序过程中,文件放在内存中处理不涉及数据的内、外存交换的称内部排序,反之称外部排序; 排序算法的基本操作:1)比较关键字的大小;2)改变指向记录的指针或移动记录本身。 评价排序...
答:稳定度:稳定排序算法会依照相等的关键(换言之就是值)维持纪录的相对次序。也就是一个排序算法是稳定的,就是当有两个有相等关键的纪录R和S,且在原本的串列中R出现在S之前,在排序过的串列中R也将会是在S之前。 一般的方法:插入、交换、选择、合并等等。交换排序包含冒泡排序(bubble sort)和快速排序(quicksort...
答:{ // 将SR[s..t]归并排序为TR1[s..t]。算法10.13 int m; RedType TR2[MAXSIZE+1]; if(s==t) TR1[s]=SR[s]; else { m=(s+t)/2; // 将SR[s..t]平分为SR[s..m]和SR[m+1..t] MSort(SR,TR2,s,m); // 递归地将SR[s..m]归并为有序的TR2[s..m] MSort(SR,TR2,m+1,t...
答:void(List A,List B, List &C){ temp=null;for(int i=1;i<=A.length;i++){ if(temp&&temp==A.get(i)){ continue;//结束本次循环 } temp=A.get(i);for(j=1;j<=B.length;j++){ if(A.get(i)=B.get(j)){ C.insert(A.get(i));//将元素插入C表中 } } } } ...
答:排序是资料处理中的经常性工作,Excel排序有序数计算(类似成绩统计中的名次)和资料重排两类。本文以几个车间的产值和名称为例,介绍Excel 2000/XP的资料排序方法。 一、数值排序 1.RANK函式 RANK函式是Excel计算序数的主要工具,它的语法为:RANK (number,ref,order),其中number为参与计算的数字或含有数字的单元格,...