线性表的简单应用
这两天一直在看书上的基于线性表结构设计的简单算法:有序线性表的合并,说老实话,只要看懂了算法,用某一种编程语言去实现并不难,难的是真正理解这一算法,并在以后的实践中能够灵活运用。
代码如下:
顺序表实现的:
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef int ElemType;
#define MAXSIZE 100
#define OK 0
#define ERROR -1
typedef struct {
int length;
ElemType *elem;
}SqList;
int InitList(SqList &L){//初始化一个空的顺序表
L.elem=(ElemType*)malloc(sizeof(ElemType)*MAXSIZE);
if(!L.elem){
printf("内存分配失败");
return ERROR;
}
L.length=0;
return OK;
}
void CreateList(SqList &L,int n){//给顺序表的元素赋值
printf("请输入%d个整数(以空格间隔开来:)\n",n);
for(int i=0;i<n;i++){
int num;
scanf("%d",&num);
L.elem[i]=num;
L.length++;
}
}
void DisplayList(SqList &L){//输出顺序表
for(int i=0;i<=L.length-1;i++)
printf("%d ",L.elem[i]);
printf("\n");
}
void MergeList_Sq(SqList LA,SqList LB,SqList &LC){
//将已知的有序顺序表LA、LB按值非递减排列成新表LC,新表LC也按值非递减排列
//新表的长度为待合并的两表的长度之和
LC.length=LA.length+LB.length;
//为合并后的新表分配一个地址空间
LC.elem=new ElemType[LC.length];
ElemType *pa,*pb,*pc,*pa_last,*pb_last;
pa=LA.elem;//指针pa指向LA的首元素
pb=LB.elem;//指针pb指向LB的首元素
pc=LC.elem;//指针pc指向LC的首元素
pa_last=LA.elem+LA.length-1;//指针pa_last指向LB的尾元素
pb_last=LB.elem+LB.length-1;//指针pb_last指向LA的尾元素
while((pa<=pa_last)&&(pb<=pb_last)){
//当两表都没到达表尾时,分别比较两表的元素,小的插入LC表尾,并把指针移动至下一元素,重复此过程
if(*pa<=*pb)
*pc++=*pa++;
else
*pc++=*pb++;
}
//当有一个表的指针到达队尾时,就将其剩余元素插入LC表尾
while(pa<=pa_last)
*pc++=*pa++;
while(pb<=pb_last)
*pc++=*pb++;
}
int main(){
SqList LA,LB,LC;
InitList(LA);
InitList(LB);
CreateList(LA,4);
CreateList(LB,7);
printf("顺序表LA是这样的:\n");
DisplayList(LA);
printf("顺序表LB是这样的:\n");
DisplayList(LB);
MergeList_Sq(LA,LB,LC);
printf("合并后的顺序表LC是这样的:\n");
DisplayList(LC);
system("pause");
return 0;
}
链表实现的:
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef int ElemType;
#define OK 0
#define ERROR -1
typedef struct LNode{
ElemType data;
struct LNode* next;
}LNode,*LinkList;
void CreateList_R(LinkList &L,int n){//后插法建立单链表并赋值其中元素
L=new LNode;
L->next=NULL;
LNode *r=L;
int num=0;
printf("请输入%d个元素:\n",n);
for(int i=0;i<n;i++){
LNode *p=(LNode*)malloc(sizeof(LNode));
scanf("%d",&num);
p->data=num;
p->next=NULL;
r->next=p;
r=p;
}
}
void MergeList_L(LinkList &LA,LinkList &LB,LinkList &LC){
//合并LA和LB得到的新的单链表LC,LC的元素按值非递减排列
LNode *pa,*pb,*pc;
pa=LA->next;//新生成的节点指针pa指向LA的第一个元素
pb=LB->next;//新生成的节点指针pb指向LB的第一个元素
pc=LC=LA;//将LA的头结点作为LC的头结点,并使指针pc指向LC
while(pa&&pb){
//如果LA和LB均未到达表尾,依次摘取两表中较小的节点插入到LC的最后
if(pa->data<=pb->data){
pc->next=pa;
pc=pa;
pa=pa->next;
}
else{
pc->next=pb;
pc=pb;
pb=pb->next;
}
}
//这样一句看似简单的代码实际上就把将某个非空的链表中的剩余元素插入LC的最后这份工作完美做完了
pc->next=pa?pa:pb;
//把LB的表头删掉,这个也非常重要
delete LB;
}
void DisplayList(LinkList &L){
LNode *p;
p=L->next;
while(p){
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
int main(){
LinkList LA,LB,LC;
CreateList_R(LA,4);
printf("表LA是这样的:\n");
DisplayList(LA);
CreateList_R(LB,7);
printf("表LB是这样的:\n");
DisplayList(LB);
MergeList_L(LA,LB,LC);
printf("合并后的表LC是这样的:\n");
DisplayList(LC);
system("pause");
return 0;
}
如果再回首的时候,对此有疑问,可以去看B站上青岛大学王卓老师的讲解,非常清晰。网址是:
https://www.bilibili.com/video/BV1QW411y7iL