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

时间:2022-07-28 00:28:18

单链表采用链式存储结构,用一组任意的存储单元存放线性表的元素。

对于查找操作,单链表的时间复杂度为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、线性表中的元素个数变化较大或者根本不知道多大时。