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

C++编程练习(2)----“实现简单的线性表的链式存储结构“

2014-03-25 20:12 549 查看
单链表采用链式存储结构,用一组任意的存储单元存放线性表的元素。

对于查找操作,单链表的时间复杂度为O(n)。

对于插入和删除操作,单链表在确定位置后,插入和删除时间仅为O(1)。

单链表不需要分配存储空间,只要有就可以分配,元素个数也不受限制。

链式存储结构中,结点由存放数据元素的数据域和存放后继结点地址的指针域组成。

具体代码如下:

#include<iostream>
#define OK 1
#define ERROR 0
#define TRUE 1
#define ERROR 0
typedef int ElemType;
typedef int Status;

struct Node{
public:
Node():data(0),next(NULL) {};
ElemType data;
Node *next;
Status GetElem(int i,ElemType *e) const;
Status ListInsert(int i,ElemType e);
Status ListDelete(int i,ElemType *e);
Status ShowList();
};

Status Node::GetElem(int i,ElemType *e) const
{
int j=1;	/*j为计数器*/
Node *p=new Node;
p=next;
while (p && j<i)
{
p=p->next;
++j;
}
if (!p || j>i)
return ERROR;
*e=p->data;
return OK;
}

/*初始条件:顺序线性表已存在,1<=i<=ListLength*/
/*操作结果:在表中第i个结点位置之前插入新的数据元素e,链表长度加1*/
Status Node::ListInsert(int i,ElemType e)
{
int j=1;
Node *p=new Node;
Node *s=new Node;
p=this;
while (p && j<i)
{
p=p->next;
++j;
}
if (!p || j>i)
return ERROR;
s->data=e;
s->next=p->next;
p->next=s;
return OK;
}

/*初始条件:线性表已经存在,1<=i<=ListLength*/
/*操作结果:删除表的第i个结点,并用e返回其值,线性表长度减1*/
Status Node::ListDelete(int i,ElemType *e)
{
int j;
Node* p=new Node;
Node* q=new Node;
p=this;
j=1;
while(p->next && j<i)
{
p=p->next;
++j;
}
if (!(p->next) || j>i)
return ERROR;
q=p->next;		/*要删除的结点是p->next*/
p->next=q->next;
*e=q->data;
delete q;
return OK;
}

Status Node::ShowList()
{
Node* p=new Node;
p=this;
while (p->next)
{
std::cout<<p->data<<"  ";
p=p->next;
}
std::cout<<p->data<<std::endl;
return OK;
}

单链表适用的场景:

1、需要频繁插入和删除时。

2、线性表中的元素个数变化较大或者根本不知道多大时。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: