#include<stdlib.h>
#include<iostream.h>
#include<malloc.h>
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode * next;
}LinkList;
void CreateListF(LinkList *&L,ElemType a[],int n)//头插法建表,算法的时间复杂度为o(n),n为节点个数
{
LinkList * s;
int i;
L=(LinkList *)malloc(sizeof(LinkList));
L->next=NULL;
for(i=0;i<n;i++)
{
s=(LinkList *)malloc(sizeof(LinkList));
s->data=a[i];
s->next=L->next;//这两行是最关键的算法:如何将一个节点插入下一个节点的后面
L->next=s;
}
}
void CreateListR(LinkList *&L,ElemType a[],int n)//尾插法建表,,算法的时间复杂度为o(n),n为节点个数
{
LinkList *s,*r;
int i;
L=(LinkList *)malloc(sizeof(LinkList));
r=L;
for(i=0;i<n;i++)
{
s=(LinkList *)malloc(sizeof(LinkList));;
s->data=a[i];
r->next=s;//以下这两行是尾插法最关键的算法,这里用一个r作为辅助,不断地让s插入到r的后面,再将r重新赋值为s。实现了一直在尾部插入节点
r=s;
}
r->next=NULL;//不要忘记最后将尾节点置为NULL
}
void InitList(LinkList *&L)//初始化一个线性表:用俗话说就是创建一个头结点并将头结点的next置为NULL,时间复杂度为o(1)
{
L=(LinkList *)malloc(sizeof(LinkList));
L->next=NULL;
}
void DestroyList(LinkList *&L)//时间复杂度为o(n)
{
LinkList *p=L,*r=L->next;
while(r!=NULL)//这一步是为了让头结点删掉,再让头结点指向下一个节点,最后当p指向尾节点时,r为空
{
free(p);
p=r;
r=p->next;
}
free(p);//这时把指向尾节点的p,释放即可。
}
bool ListEmpty(LinkList *L)//时间复杂度为o(1)
{
if(L->next==NULL)
return true;
else return false;
}
int ListLength(LinkList *L)//时间复杂度为o(n)
{
LinkList *p=L->next;
int j=0;
while(p!=NULL)
{
j++;
p=p->next;
}
return j;
}
void DispList(LinkList *L)//时间复杂度为o(n)
{
while(L->next!=NULL)
{
cout<<L->next->data<<" ";
L=L->next;
}
cout<<endl;
}
bool GetElem(LinkList *L,int i,ElemType &e)//时间复杂度为o(n)
{
while(i)
{
--i;
L=L->next;
}
if(L==NULL)
return false;
e=L->data;
return true;
}
int LocateElem(LinkList *L,ElemType e)//时间复杂度为o(n)
{
int i=1;
LinkList *p=L->next;
while(p!=NULL&&p->data!=e)
{
p=p->next;
i++;
}
if(p!=NULL)
return i;
else return 0;
}
bool ListInsert(LinkList *&L,int i,ElemType e)//时间复杂度为o(n)
{
i--;
LinkList *p=L,*s=(LinkList *)malloc(sizeof(LinkList));
while(i&&p!=NULL)
{
p=p->next;
i--;
}
if(p==NULL)
return false;
s->data=e;
s->next=p->next;
p->next=s;
return true;
}
bool ListDelete(LinkList *&L,int i,ElemType &e)//时间复杂度为o(n)
{
i--;
LinkList *p=L;
while(i&&p!=NULL)
{
p=p->next;
i--;
}
if(p==NULL)
return false;
LinkList *q=p->next;
e=q->data;
p->next=q->next;
free(q);
return true;
}
int main()
{
LinkList *L;
InitList(L);
int e;
int a[]={1,2,3,4};
CreateListF(L,a,4);//头插法会倒序输出数组
DispList(L);
CreateListR(L,a,4);//尾插法会正序输出数组
DispList(L);
cout<<LocateElem(L,4)<<endl;//输出元素为4的位置
GetElem(L,4,e);
cout<<e<<endl;
ListInsert(L,5,5);//在第五个位置插入5
DispList(L);
ListDelete(L,5,e);//删除第五个位置的元素并在删除之前把要删除的元素的值赋给e
cout<<e<<endl;
DispList(L);
return 0;
}
数据结构教程(P40~45)
最新推荐文章于 2024-09-18 10:50:29 发布