//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