//vs2010環境
//在main函數裏出現的功能,經測試成功 歡迎大家批評指正~
#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