链表的插入删除合并

typedef int elemtype; 定义elemtype为int类型

//链表有数据域和指针域

struct lnode{
	elemtype data;
	lnode* next;//指向相同类型的指针 
};
typedef lnode* linklist;  给结构体更名

//链表输出 因为创建的链表含有头结点,所以新设了一个变量p,使p=L->next;如果没有头结点的话,完全可以不设p

void show(linklist L){
	linklist p;
	p=L->next; 
	while(p){
		cout<<p->data<<" ";
		p=p->next;
	}
	cout<<endl;
}  

//链表的初始化
/给链表分配空间 ,即就是创建头结点,给头结点分配空间
新创建的结点,其next指针都不能悬空
输入的时候分 头插和尾插,头插法:每一次在头结点的后面插入数据 即s->next=l->next; l->next=s;两句的顺序千万不能颠倒
尾插法:需要记录链表的尾端 即tail->next=s;tail=s; 把s挂接在尾端
在创建链表的时候若L->NULL是没有头结点的,若L->next=NULL代表是有头结点的
/

void created_L(linklist& L,int n){
	linklist s,tail;
	L=(lnode*)malloc(sizeof(lnode));//创建了头结点 
	L->next=NULL; 
	tail=L;
	for(int i=0;i<n;i++){
		s=(lnode*)malloc(sizeof(lnode));
		s->next=NULL;
		cin>>s->data;
		tail->next=s;
		tail=s; 
	}
//	show(L); 
}

//链表的插入 不像顺序表一样记录位置 ,linklist后面的&可以不用加
//找到第i个元素 因为链表中没有length,所以要时刻预防链表为空的时候即 l->=NULL的时候


void insertlist(linklist L,int i,elemtype e){
	int j=1;
	linklist s,p;
	p=L;
	while(p&&j<i){
		p=p->next;
		j=j+1; 
	} 
	if(j==i){
		s=(lnode*)malloc(sizeof(lnode));
		s->next=NULL; 
		s->data=e;
		s->next=p->next;
		p->next=s;
	}
	show(L);	
} 

//链表的删除

void deletelist(linklist& L,int i,elemtype& e){
	linklist pl,p;
	int j=1;
	p=L;
	while(p&&j<i){
		p=p->next;
		j=j+1; 
	} 
	if(j==i){
		pl=p->next;
		p->next=pl->next;
		e=pl->data;
		free(pl);//删除完释放节点 
	}
	show(L);
} 

//找到指定元素


void getelem(linklist L,elemtype e){
	linklist p;
	p=L->next;
	while(p){
		if(p->data==e)
		cout<<p->data<<" ";
		p=p->next; //不要想的那么复杂,用不到else 
	}	
} 

/*两个链表的合并
la lb升序,合成升序的lc ,la lb比较小的接在lc的尾端,
la lb逆序,合成降序的lc,la lb比较小的插在lc头结点的后面(头插法可以实现逆序)
1.先创建一个新表
*/

void  mergelist(linklist& la,linklist& lb,linklist& lc){
	linklist pa,pb,pctail;
	lc=la;
	pa=la->next;
	lc->next=NULL;	
	pb=lb->next;
	pctail=lc;
	free(lb); 
	while(pa&&pb){
		if(pa->data<=pb->data){
				pctail->next=pa;
		        pctail=pa;
		        pa=pa->next;
		}
		else{
				pctail->next=pb;
		        pctail=pb;
		        pb=pb->next;
		}
	}
		while(pa){
	        	pctail->next=pa;
		        pctail=pa;
		        pa=pa->next;
	}
	while(pb){
		      pctail->next=pb;
		        pctail=pb;
		        pb=pb->next;
	}	

	show(lc);
} 

在main函数中调用

int main(){
	int e=0;
	linklist p,q,m;
	created_L(p,5);
	created_L(q,5);
    insertlist(p,3,8);
    cout<<endl;
	deletelist(p,3,e);
	cout<<endl;
	getelem(p,3);
	cout<<endl; 
    mergelist(p,q,m);
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值