带头结点的单链表的12个基本操作(C++)

来源:互联网 发布:矩阵右上角加号 编辑:程序博客网 时间:2024/05/16 11:37

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


0 0