数据结构7:单链表的代码实现

#include<stdio.h>
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
typedef struct LNode{
	int data;
	struct LNode *next;
}LNode,*LinkList;
void CreateList_H(LinkList &L,int n);//前插法
void CreateList_R(LinkList &L,int n);//尾插法 
void PrintfList(LinkList L);        // 输出 
int ListDelete(LinkList &L,int i);// 删除 
void inverse(LinkList &L); // 逆序单链表 
void MergeList(LinkList &LA,LinkList &LB,LinkList&LC); //合并两个有序递增链表 
int main()
{
	LinkList L,L1;        
	int n,i;
	cout<<"请输入链表元素个数(头插入法):";
	cin>>n;
	cout<<"请输入链表元素一: "; 
	CreateList_H(L,n);
	PrintfList(L);
	cout<<"请输入链表元素个数(尾插入法):";
	cin>>n; 
	cout<<"请输入链表元素二: ";
	CreateList_R(L1,n);
	PrintfList(L1);
	cout<<"请输入删除的元素位置(第一个输入的链表): ";
	cin>>i; 
	ListDelete(L,i);
	cout<<"删除后链表元素为: "<<endl;
	PrintfList(L) ;
	LinkList LA;
	LinkList LB;
	LinkList LC;
    cout<<"请输入链表元素个数:"; 
    cin>>n;
    cout<<"请输入链表三: ";
	CreateList_R(LA,n);
	cout<<"请输入链表四:"; 
	CreateList_R(LB,n);
	MergeList(LA,LB,LC);
	cout<<"合并后:"<<endl; 
	PrintfList(LC);
	cout<<"请输入链表元素个数:";
	cin>>n;
	cout<<"请输入链表五:";
	CreateList_R(L,n);
	inverse(L);
	cout<<"反转后:"; 
	PrintfList(L);
	return 0;
}
void CreateList_H(LinkList &L,int n)   
{
	LinkList p;
	L=new LNode;
	L->next=NULL;
	for(int i=0;i<n;i++){
		p=new LNode;
		cin>>p->data;
		p->next=L->next;
		L->next=p;
	}
} 
void CreateList_R(LinkList &L,int n){ 
	LinkList p;
	LNode *r;
	L=new LNode;
	L->next=NULL;
	r=L;
	for(int i=0;i<n;i++){
		p=new LNode;
		cin>>p->data;
		p->next=NULL;
		r->next=p;
		r=p;
	}
}
void PrintfList(LinkList L){      
	cout<<"链表元素为: ";
	LNode *p;
	p=L->next;
	while(p){
		cout<<p->data<<" ";
		p=p->next;
	}
	cout<<endl;
}
int ListDelete(LinkList &L,int i){
	LNode *p=L;
	LNode *r;
	int j=0;
	while(p->next&&j<i-1){
		p=p->next; 
		j++;
	}
	if(!(p->next)||j>i-1) return 0;   //当  i>n或i<1时,删除出错。 
	r=p->next;
	p->next=r->next;
	delete r;
	return 1;
} 
void MergeList(LinkList &LA,LinkList &LB,LinkList&LC){
	LNode *pa=LA->next;
	LNode *pb=LB->next;
	LC=LA;
	LNode *r=LC;
	while(pa&&pb){
		if(pa->data<pb->data){
			r->next=pa;
			r=pa;
			pa=pa->next; 
		}
		else if(pb->data>pb->data){
			r->next=pb;
			r=pb;
			pb=pb->next; 
		}
		else{
			r->next=pa;
			r=pa;
			pa=pa->next;
			pb=pb->next;
		}
	}
	r->next=pa?pa:pb;
	delete LB;
}
void inverse(LinkList &L){
	LNode *p=L->next->next;
	LNode *q=L->next;
	LNode *r=NULL;
	while(p){
		q->next=r;
		r=q;
		q=p;
		p=p->next;
	}
	q->next=r;
	L->next=q;
} 
发布了52 篇原创文章 · 获赞 114 · 访问量 6028

猜你喜欢

转载自blog.csdn.net/GD_ONE/article/details/90757458