帶頭結點的單鏈表的12個基本操作(C++)

//vs2010環境

//在main函數裏出現的功能,經測試成功  歡迎大家批評指正~


#include "stdafx.h"
#include <iostream>
using namespace std;


int const OK=1;
int const FALSE=0;
int const TRUE=1;
int const ERROR=0;
int const INFEASIBLE=-1;

typedef int status;


typedef double ElemType;  


typedef struct Node {  
    ElemType data;  
    struct Node *next;  
}Node;  


typedef Node* LinkList;


/*----構造空線性表(帶頭結點)帶頭結點的單鏈表可以降低程序複雜性與減少BUG出現率----*/
void InitList(LinkList &L)
{
L =new Node;
if(!L)
exit(OVERFLOW);
else
{
//L->data=19.8;
L->next=NULL;
}
}



/*----銷燬線性表----*/
void DestroyList(LinkList &L)
{
LinkList q=NULL;
while(L)
{
q=L->next;
delete(L);
L=q;
}
}



/*----清空線性表----*/
void ClearList(LinkList &L)
{
LinkList p=L->next;
L->next=NULL;
DestroyList(p);
}



/*----判斷線性表是否爲空----*/
status ListEmpty(LinkList &L)
{
if(L->next) 
return FALSE;
else
return TRUE;
}



/*----返回線性表中數據元素個數----*/
int ListLength(LinkList &L)
{
LinkList p=L->next;
int i(0);
while(p)
{
i++;
p=p->next;
}
return i;
}



/*----用e返回線性表L中第i個數據元素的值----*/
status GetElem(const LinkList L, int i, ElemType &e)
{
int j=1;
LinkList p=L->next;
while(p&&j!=i)
{
j++;
p=p->next;
}
if(!p||j>i)
return ERROR;
e=p->data;
return OK;
}



/*----返回L中第一個與e滿足compare()的元素的位序。若這樣的數據元素不存在,則返回值爲0----*/
int LocateElem(LinkList &L, ElemType e, status (*compare)(ElemType,ElemType))
{
int i=0;
LinkList p=L->next;
while(p)
{
i++;
if(compare(p->data,e))
return i;
p=p->next;
}
return 0;
}


status equal(ElemType m,ElemType n)
{
if(m==n)
return true;
else 
return false;
}


status biger(ElemType m,ElemType n)
{
if(m>n)
return true;
else 
return false;
}


status smaller(ElemType m,ElemType n)
{
if(m<n)
return true;
else 
return false;
}




/*----若cur_e是L的數據元素,且不是第一個,則用pre_e返回它的前驅,否則操作失敗,pre_e無意義----*/
status PriorElem(LinkList L,ElemType cur_e,ElemType &pre_e)
{
LinkList q,p=L->next;
if(!p)
return ERROR;
while(p->next)
{
q=p->next;
if(q->data==cur_e)
{
pre_e=p->data;
return OK;
}
p=q;
}
return ERROR;


}


/*----若cur_e是L的數據元素,且不是最後一個,則用next_e返回它的後繼,否則操作失敗,next_e無意義----*/
status NextElem(LinkList L,ElemType cur_e,ElemType &next_e)
{
LinkList q,p=L->next;
if(!p||!(p->next))
return ERROR;

while(p->next)
{
q=p->next;
if(cur_e==p->data)
{
next_e=q->data;
return OK;
}
p=q;
}
return ERROR;
}




/*----在L中的第i個位置之前插入新的數據元素e----*/
status ListInsert(LinkList &L,int i,ElemType e)
{
int j=0;
LinkList s,p=L;
while(p&&j<i-1)
{
j++;
p=p->next;
}
if(!p||j>i-1)
return ERROR;
s=new Node;
s->data=e;
s->next=p->next;
p->next=s;
return OK;
}


/*----刪除L的第i個數據元素,並且用e返回其值,L長度減1----*/
status ListDelete(LinkList &L,int i,ElemType &e)
{
LinkList q,p=L;
int j=0;
while(p->next&&j<i-1)
{
j++;
p=p->next;
}
if(!p->next||j>i-1)
return ERROR;
q=p->next;
e=q->data;
p->next=q->next; 
delete(q); 
return OK; 


}


/*----依次對L的每個數據元素調用函數visit()----*/
void ListTraverse(LinkList L,void(*visit)(ElemType))
{
LinkList p=L->next;
while(p)
{
visit(p->data);
p=p->next;
}
}




int main(int argc, char **argv) {  
LinkList L=NULL;
InitList(L);

ListInsert(L,ListLength(L)+1,5.7);
ListInsert(L,ListLength(L)+1,3.5);


ElemType m;
for(int k=1;k<=ListLength(L);k++)
{
GetElem(L,k,m);
cout<<m<<endl;
}


ListDelete(L,1,m);
cout<<m<<endl;


cout<<"刪除後:"<<endl;
for(int k=1;k<=ListLength(L);k++)
{
GetElem(L,k,m);
cout<<m<<endl;
}


    system("pause");  
    return 0;  


【參照】:http://blog.csdn.net/zhangyongjun_2012/article/details/8942451


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