线性表的应用

线性表的合并

  • a和b表合并到c表上并且要重
  • b表合并到a表上并且要去重

顺序表实现

#include 
#include 
#include 
#define Ele int

// 定义顺序表
struct LinkList{
	Ele *data;
	int length;
	int size;
};

// 创建顺序表 
void create_list(LinkList &L){
	int i=0;
	for(i;i

链表实现

#include 
#include 
#include 
#define Ele int

// 定义链表
typedef struct Node{
	Ele data;
	struct Node *next;
}Node,*LinkList; 



// 初始化链表
void init_list(LinkList &L){
	L=(Node *)malloc(sizeof(Node));
	if(L==NULL){
		printf("error \n");
		return;
	}
	L->next=NULL;
} 

// 头插法创建列表
void insert_header(LinkList &L,int len){
	for(int i=0;idata=rand();
		s->next=L->next;
		L->next=s;
	}
	printf("success \n");
} 

// 打印链表
void printf_list(LinkList L){
	Node *p=L->next;
	int i=0;
	while(p){
		printf("list[%d]==%d ",i,p->data);
		p=p->next;
		i++;
	} 
	printf("\n");
} 

// 表长
int length(LinkList L){
	Node *p=L->next;
	int i=0;
	while(p){
		i++;
		p=p->next;
	}
	return i;
} 

// 获取链表元素
Ele get_ele_data(LinkList L,int j){
	Node *p=L->next;
	int i=1;
	while(p&&inext;
	} 
	if(!p||i>j){
		printf("error \n");
		return -1;
	}
	return p->data;
} 

// 是否重复 
bool repeat(LinkList A,Ele e){
	Node *p=A->next;
	while(p&&p->data!=e){
		p=p->next;
	}
	if(!p)return false;
	
	return true;
}

// 插入元素
void insert_ele(LinkList &L,Ele e,int j){
	Node *p=L;
	int i=0;
	while(p&&inext;
	}
	if(!p||i>j-1){
		printf("error \n");
		return;
	}
	Node *s=(Node *)malloc(sizeof(Node));
	s->data=e;
	s->next=p->next;
	p->next=s;
} 

// 合并链表
void merge_list(LinkList &A,LinkList B){
	int a_length=length(A);
	int b_length=length(B);
	for(int i=1;i<=b_length;i++){
		Ele e=get_ele_data(B,i); 
		if(e!=-1&&!repeat(A,e)){
			insert_ele(A,e,(a_length+i)); 
		}
	} 
} 


// 调试 
int main(int argc, char** argv) {
	
	srand((unsigned int)time(NULL));
	LinkList A,B;
	init_list(A);
	init_list(B);
	insert_header(A,4);
	insert_header(B,2);
	printf_list(A);
	printf_list(B);
	merge_list(A,B);
	printf_list(A);
	
	return 0;
}

你可能感兴趣的:(数据结构与算法,数据结构)