#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);
*/
}