线性表实验--归并两个递增顺序表合并为一个递减的顺序表

线性表实验--归并2009-11-22 18:201、
实验内容

(1)假设有两个按数据元素值非递减有序排列的线性表A和B,均以顺序表作为存储结构。编写算法将A表和B表归并成一个按元素值非递增有序(允许值相同)排列的线性表C。(可以利用将B中元素插入A中,或新建C表

(2) 假设有两个按数据元素值非递减有序排列的线性表A和B,均以单链表作为存储结构。编写算法将A表和B表归并成一个按元素值递减有序(即非递增有序,允许值相同)排列的线性表C。(必做)

(3) 将一个单链表中的值就地逆置。(必做)



第一个实验:两个递增顺序表合并为一个递减的顺序表



#include
#include//包含malloc,realloc,sizeof,exit函数的头文件
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef int ElemType; //将Elemtype定义为int型
//---------线性表的动态分配顺序存储结构------------------
typedef struct{
ElemType *elem;//线性表的基地址
int length;//当前长度
int listsize;//当前分配的存储容量(以sizeof(Elem)为单位)
}Sqlist;

Sqlist InitList_Sq(Sqlist &L)
//------------构造一个空的线性表--------------------------
{
L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L.elem) exit(1);//存储分配失败
L.length=0;//空表长度为零
L.listsize=LIST_INIT_SIZE;//初始存储容量
return(L);
}

Sqlist CreateList(Sqlist &L)
{
int s;
ElemType *newbase;
printf("以下输入顺序表的元素,并以“0“结束: ");
scanf("%d",&s);
while(s!=0)
{
if (L.length>=L.listsize) //当前分配存储空间已满,增加分配
{
newbase=(ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
if(!newbase) exit(1);//存储分配失败
L.elem=newbase;//新基址
L.listsize+=LISTINCREMENT;//增加存储容量
}
L.elem[L.length]=s;//将输入的值赋给链表相应位置
L.length++;
scanf("%d",&s);
}
return(L);
}

void Mergelist_sqlist(Sqlist &La, Sqlist &Lb,Sqlist &Lc)
{
//已知顺序线性表La和Lb的元素按值费递减排列
//归并得到的新的顺序线性表Lc的元素按非递增排列
ElemType *pa,*pb,*pc,*pa_last,*pb_last;
pa_last=La.elem+La.length-1;
pb_last=Lb.elem+Lb.length-1;
pa=pa_last;pb=pb_last;
Lc.listsize=Lc.length=La.length+Lb.length;
pc=Lc.elem=(ElemType*)malloc(Lc.listsize*sizeof(ElemType));
if(!Lc.elem)exit(1);
while(pa>=La.elem&&pb>=Lb.elem)
{
if(*pa<=*pb)*pc++=*pb--;
else*pc++=*pa--;
}

while(pa>=La.elem)*pc++=*pa--;
while(pb>=Lb.elem)*pc++=*pb--;

}

void print(Sqlist &L)
{
int i;
for(i=0;iprintf("%d",L.elem[i]);
printf("\n");
}

void main()
{
Sqlist La;
Sqlist Lb;
Sqlist Lc;
InitList_Sq(La);
InitList_Sq(Lb);
InitList_Sq(Lc);
CreateList(La);
CreateList(Lb);

//CreateList(Lc);
printf("以下输出顺序表的元素\n");
print(La);
printf("以下输出顺序表的元素\n");
print(Lb);
printf("以下输出两顺序表归并后的元素\n");
Mergelist_sqlist(La,Lb,Lc);
print(Lc);
}


两递增的单链表合并为一递减的单链表

#include
#include
#define OVERFLOW 0
typedef int ElemType;
typedef struct Node{
ElemType data;
struct Node *next;
}Node,*LinkList;

LinkList Create_LinkList(LinkList &L)
{
int m;
Node *p,*q;
L=(LinkList)malloc(sizeof(Node));
if (!L) exit(OVERFLOW);
L->next=NULL;
q=L;
cin>>m;
while(m!=0)
{
p=(LinkList)malloc(sizeof(Node));
if (!p) exit(OVERFLOW);
p->data=m;
p->next=NULL;
q->next=p;
q=p;
cin>>m;
}
return(L);
}
LinkList Merge_List(LinkList &La,LinkList &Lb)
{
Node *pa,*pb,*Lc,*q;
pa=La->next;
pb=Lb->next;
Lc=(LinkList)malloc(sizeof(Node));
Lc->next=NULL;
q=Lc;
while(pa&&pb)
{
if (pa->datadata)
{
La->next=pa->next;
pa->next=NULL;
pa->next=q->next;
Lc->next=pa;
pa=La->next;
}
else
{
Lb->next=pb->next;
pb->next=NULL;
pb->next=q->next;
Lc->next=pb;
pb=Lb->next;
}
}
while(pa)
{
La->next=pa->next;
pa->next=NULL;
pa->next=q->next;
Lc->next=pa;
pa=La->next;
}
while(pb)
{
Lb->next=pb->next;
pb->next=NULL;
pb->next=q->next;
Lc->next=pb;
pb=Lb->next;
}
return(Lc);
}//

void main()
{
LinkList La,Lb,Lc;
Node *p;
cout<<"请输入第一个链表结点值(输入值为0时结束):"<Create_LinkList(La);
cout<<"请输入第二个链表结点值(输入值为0时结束):"<Create_LinkList(Lb);
Lc=Merge_List(La,Lb);
p=Lc->next;
//cout<data<while(p!=NULL)
{
cout<data<p=p->next;
}
}



相关文档
最新文档