单链表课后作业

发布于 29 天前  53 次阅读


Task:有两个链表分别存储{1,2,3,4,5}、{3,4,5,6,7};实现两个链表的连接,同时将相同数据进行删除操作:

/*单链表-----课后作业*/ 

/*测试:
链表1中的数据:1 2 3 4 5

链表2中的数据:3 4 5 6 7 

1234567
*/ 
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<stdbool.h>
typedef struct LNode{
	int data;
	struct LNode* next;
}List,*Link;

/*输出链表中的值*/
void OutputList(Link phead,int id_list){
	Link temp_p;
	temp_p=phead->next;
	if(id_list==0x01){
		printf("链表1中的数据为:\n");
	}
	else if(id_list==0x02){
		printf("链表2中的数据为:\n");
	}
	else{
		printf("未找到所要查询的链表ID\n");
	}
	while(NULL!=temp_p){
		printf("%d\n",temp_p->data);
		temp_p=temp_p->next;
	}
}

Link Create_List1(){
	int i;
	Link p,q;
	Link phead=(Link)malloc(sizeof(List));//头指针
	p=phead;
	for(i=0;i<5;i++){
		q=(Link)malloc(sizeof(List));
		q->data=i+1;
		p->next=q;
		p=q;
	}
	p->next=NULL;
	return phead; 
}

Link Create_List2(){
	int i;
	Link p,q;
	Link phead=(Link)malloc(sizeof(List));//头指针
	p=phead;
	for(i=0;i<5;i++){
		q=(Link)malloc(sizeof(List));
		q->data=i+3;
		p->next=q;
		p=q;
	}
	p->next=NULL;
	return phead; 
}

int Length(Link phead){
	Link temp_p=phead->next;
	int i=0;
	while(NULL!=temp_p){
		i++;
		temp_p=temp_p->next;	
	}
	return i;
}

//向A链表中插入元素 
void ListA_Insert_Element(Link phead,int length,int element){
	Link q;//定义一个结构体指针指向malloc的元素 
	q=(Link)malloc(sizeof(List));
	q->data=element;
	
	Link p = phead;//创建P指针
	for(int i=1;i<length;i++){
		p=p->next;
	}
	q->next = p->next;  
	p->next = q;
} 


//函数功能:判断链表中是否有elem元素
//返回值:equal:1:有; 0:无; 
bool  LocateElem(Link phead,int element){
	Link temp_p=phead;//指向头指针
	bool equal=false;
	while(NULL!=temp_p){
		if(temp_p->data==element){
			equal=true;
		}
		else{
			//插入元素到链表A中 
		}
		temp_p=temp_p->next;	
	} 
	return equal;
} 



void union_test(){
	//把B内的元素分别与A内的元素进行比较
	//如果相同则删除;如果不相同将该元素插入到A表后
	int La_len,Lb_len;
//    Link temp_p;
//	temp_p=Create_List2();//记录链表2的地址
	 
	Link temp_head1=Create_List1();
	Link temp_head2=Create_List2();//记录链表2的地址
	La_len=Length(temp_head1);//求线性表的长度 
	Lb_len=Length(temp_head2);
	//思路:利用循环分别取出Lb中的第i个元素赋值给e 
	//判断La中的元素是否和e相等
	//如果不相等则赋值给La
	int e=0;
	for(int i=0;i<Lb_len;i++){
//		相当于书上的GetElem函数功能 
		temp_head2=temp_head2->next;
		e=temp_head2->data;
		printf("e的值为:%d\n",e);
		if(LocateElem(temp_head1,e)){
//debug
//			printf("存在\n");
			
		}
		else{
			printf("\nlen = %d ,e = %d\n",La_len,e);
			ListA_Insert_Element(temp_head1,++La_len,e);
			//La_len++;
//debug
//			printf("不存在\n");
		}
//	   	printf("e的值为:%d\n",e);	success	
	} 
//	printf("改变后的链表1数据:\n");
	OutputList(temp_head1,0x01);
//	La_len=Length();
//	Lb_len=Length(); 
}


int main(){
//	int length=0;
//	Link temp_head1=Create_List1();
//	Link temp_head2=Create_List2();
	
//	length=Length(temp_head1);
	
//	printf("%d",length);
//	OutputList(temp_head1,0x01);
//	OutputList(temp_head2,0x02);
	union_test();
//	OutputList(temp_head1,0x01);
	return 0;
} 


本当の声を響かせてよ