單鏈表相關操作實現

#include <stdio.h>
#include <stdlib.h>
#include <iostream>

using namespace std;

typedef int ElemType;
typedef int Status;

//以下內容中涉及的單鏈表均爲帶頭節點的單鏈表 
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define MaxSize 100 

//定義鏈表類型 
typedef struct Lnode{
	ElemType data;
	struct Lnode *next;
}Lnode,*LinkList;

//初始化鏈表 
Status InitList(LinkList &L){
	L=new Lnode;
	L->next=NULL;
	return OK;
}

//判斷鏈表是否爲空 
Status IsEmpty(LinkList L){
	if(L->next) return 0;
	else return 1;
}

//銷燬單鏈表 
Status DeleteList(LinkList &L){
	Lnode *p=L;
	while(p){
		L=L->next;
		delete p;
		p=L;
	}
	return OK;
}

//清空單鏈表(釋放鏈表中所有元素,並將頭節點指針域置空) 
Status ClearList(LinkList &L){
	Lnode *p,*q=L->next;
	while(p){
		q=p;
		p=p->next;
		delete q;
	}
	L->next=NULL;
	return OK;
}

//求單鏈表的長度(重點試一下可以不可以) 
int LengthList(LinkList L){
	int i=0;
	while(L->next){
		i++;
		L=L->next;
	}
	return i;
}

//取單鏈表中第i個元素的值並賦給e(單鏈表取值,需要重點掌握) 
Status Get_elem_data(LinkList L,int i,ElemType& e){
	Lnode *p=L->next;
	int j=1;
	//包含兩種特殊情況:查找位置小於1(用j<i判斷)以及查找位置大於表的長度(注意,空表也屬於查找位置大於表的長度這種情況,用p判斷)
	//向後掃描,直到p指向第i個元素或者p爲空 
	while(j<i&&p){
		p=p->next;
		j++;
	}
	if(!p||j>i) return ERROR;
	e=p->data;
	return OK;
}

// 根據值查找鏈表中的節點,返回節點的地址
Lnode* LocateElem(LinkList L,ElemType e){
	Lnode *p=L->next;
	while(p&&p->data!=e)
		p=p->next;
	return p;
}

/*按值查找鏈表中的節點,返回節點的序號(C沒有重載,C++中有重載,即函數名相同,但參數表不同)
int LocateElem(LinkList L,ElemType e){
	Lnode *p=L->next;
	int j=1;
	while(p&&p->data!=e)
		p=p->next;
		j++;
	if(p) return j;
	else return ERROR;
}*/

// 在鏈表的第i個元素之前插入數據元素e(重點掌握) 
Status Listinsert_L(LinkList& L,int i,ElemType e){
	Lnode *p=L;
	int j=0;
	while(p&&j<i-1){
		p=p->next;
		j++;
	}
	//i大於表長加1或者小於1,插入位置非法 
	if(!p||j>i-1) return ERROR;
	Lnode *s=new Lnode;
	s->data=e;
	s->next=p->next;
	p->next=s;
	return OK;
} 

// 刪除第i個節點,並將節點中的data返回給e
Status Delete_Elem(LinkList& L,int i, ElemType &e){
	Lnode *p=L;
	int j=0;
	while(p->next&&j<i-1){
		p=p->next;
		j++;
	}
	if(!(p->next)||j>i-1) return ERROR;
	Lnode *q=p->next;
	p->next=q->next;
	e=q->data;
	delete q;
	return OK;
}

// 建立單鏈表,長度爲n(頭插法)
void CreateList_L(LinkList& L,int n){
	for(int i=0;i<n;i++){
		Lnode *p=new Lnode;
		cout<<"請輸入要插入的數據:";
		cin>>p->data;
		p->next=L->next;
		L->next=p;
	}
}

// // 建立單鏈表(尾插法),長度爲n
void CreateList_wL(LinkList& L,int n){
	Lnode *r=L;
	for(int i=n;i>0;i--){
		Lnode *p=new Lnode;
		p->next=NULL;
		cout<<"請輸入要插入的數據:";
		cin>>p->data;
		r->next=p;
		r=p;
	}
}


//遍歷單鏈表,並輸出每一個元素的值
Status show(LinkList L){
	Lnode *p=L->next;
	if(!p) return ERROR;
	while(p){
		cout<<p->data<<endl;
		p=p->next;
	}
	return OK;	
} 

//單鏈表的合併(求兩個集合的並集)
void UnionLinkList(LinkList &La,LinkList Lb){
	int LaLength=LengthList(La);
	int LbLength=LengthList(Lb);
	int e;
	for(int i=1;i<=LbLength;i++){
		Get_elem_data(Lb,i,e);
		if(!LocateElem(La,e)) Listinsert_L(La,++LaLength,e);
	}
}

//有序表的合併(用單鏈表實現) 
LinkList MergeLinkList(LinkList &La,LinkList &Lb){
	LinkList pc=La;
	LinkList pa=La->next;
	LinkList pb=Lb->next;
	while(pa&&pb){
		if(pa->data<pb->data){
			pc->next=pa;
			pc=pa; 
			pa=pa->next;
		}
		else{
			pc->next=pb;
			pc=pb;
			pb=pb->next;
		}  
	}
	pc->next=pa?pa:pb;
	delete Lb;
	return La;
} 

int main(){
//	LinkList L=new Lnode;
//	InitList(L);
//	CreateList_L(L,5);
//	int length=LengthList(L);
//	cout<<"鏈表長度爲:"<<length<<endl;
//	int e;
//	Get_elem_data(L,2,e);
//	cout<<"鏈表中第二個元素的值爲:"<<e<<endl;
//	Lnode *p=LocateElem(L,4);
//	cout<<"鏈表中元素4的所在的地址爲:"<<p<<endl;
//	Listinsert_L(L,2,10);
//	int f;
//	Get_elem_data(L,2,f);
//	cout<<"執行插入操作後鏈表中第二個元素的值爲:"<<f<<endl;
//	int g;
//	Delete_Elem(L,2,g);
//	cout<<"被刪除的元素的值爲:"<<g<<endl;
//	int h;
//	Get_elem_data(L,2,h);
//	cout<<"執行刪除操作後鏈表中第二個元素的值爲:"<<h<<endl;
//	int a=IsEmpty(L);
//	if(a==1) printf("鏈表爲空");
//	else printf("鏈表不爲空");

/*測試單鏈表的合併	
	LinkList La;
	InitList(La);
	CreateList_wL(La,4);
	LinkList Lb;
	InitList(Lb);
	CreateList_wL(Lb,3);
	UnionLinkList(La,Lb);
	show(La);
*/

/*測試有序表的合併(用單鏈表實現)
	LinkList La;
	InitList(La);
	CreateList_wL(La,3);
	LinkList Lb;
	InitList(Lb);
	CreateList_wL(Lb,6);
	MergeLinkList(La,Lb);
	show(La);
*/ 
}
	 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章