您的位置:首页 > 编程语言 > C语言/C++

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

2014-06-05 21:37 537 查看
//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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: