C++实现单链表的基本运算

领会单链表存储结构和掌握单链表中的各种基本运算算法设计。

实现单链表的各种基本运算和整体建表算法(假设单链表的元素类型ElemType 为char)。

程序要求:

1.初始化单链表h;

2.依次采用尾插法插入a、b、c、d、e元素;

3.输出单链表h;

4.输出单链表h的长度;

5.判断单链表h是否为空;

6.根据用户输入的位置,输出单链表h相应的元素;

7.根据用户输入的元素,输出单链表h相应的位置;

8.根据用户输入的位置和元素,对单链表h插入新的元素;

9.输出单链表h;

10.根据用户输入的位置,删除单链表h相应的元素;

11.输出单链表h;

12.释放单链表h;

----------------------------------------------------------------------------------------------

定义单链表的数据结构

#include <iostream.h>

typedef char ElemType;
typedef struct LNode  //定义单链表结点类型
{
	ElemType data;
	struct LNode *next;
} LinkList;

1.初始化单链表

void InitList(LinkList *&L)
{
	L=new LinkList;
	L->next=NULL;
}

2.尾插法建表

头节点不包含数据,具有指引作用,头节点的下一个结点才开始保存数据。

void CreateListR(LinkList *&L,ElemType a[],int n)
{
	LinkList *s,*r;int i;
	L=new LinkList;  //产生一个新的头结点
	r=L;  //令r指针指向终端结点,刚开始的时候指向头结点
	for(i=0;i<n;i++)
	{
		s=new LinkList;
		s->data=a[i];
		r->next=s;  //将s插入r的后面
		r=s;     //r指针指向终端结点
	}
	r->next=NULL;
}

3.销毁单链表

当只剩最后一个节点时,p指向最后一个节点,q == NULL。所以在循环结束之后,需要再删除一次p。

void DestroyList(LinkList *&L)
{
	LinkList *p=L,*q=p->next;
	while(q!=NULL)
	{
		delete p;
		p=q;
		q=p->next;
	}
	delete p;
}

4.判断是否为空表

如果单链表为空表,返回 true;

如果单链表不为空表,返回 false。

bool ListEmpty(LinkList *L)
{
	return (NULL==L->next);
}

5.求单链表长度

int ListLength(LinkList *L)
{
	LinkList *p=L;int i=0;
	while(p->next!=NULL)
	{
		i++;
		p=p->next;
	}
	return i;
}

6.输出单链表

void DispList(LinkList *&L)
{
	LinkList *p=L->next;
	while(p!=NULL)
	{
		cout<<p->data<<"      ";
		p=p->next;
	}
	cout<<endl;
}

7.求单链表中指定位置的某个元素值

bool GetElem(LinkList *L,int i,ElemType &e)
{
	int j=0;
	LinkList *p=L;
	while (j<i  && p!=NULL)
	{
		j++;
		p=p->next;
	}
	if(p==NULL)
		return false;//不存在第i个数据结点
	else
	{
		e=p->data;
		return true;
	}
}

8.按元素值查找

int LocateElem(LinkList *L,ElemType e)
{
	LinkList *p=L->next;int n=1;
	while(p!=NULL && p->data!=e)
	{
		p=p->next;
		n++;
	}
	if(p==NULL)
		return 0;
	else
		return n;
}

9.插入数据元素

需要在 i 位置前插入一个数据元素,所以 p 要指向 i-1 的节点位置。

bool ListInsert(LinkList *&L,int i,ElemType e)
{
	int j=0;
	LinkList *p=L,*s;
	while(j<i-1 && p!=NULL)    //该循环是查找第i-1个结点
	{
		j++;
		p=p->next;
	}
	if(p==NULL)
		return false;  //找不到第i-1个结点
	else
	{
		s=new LinkList;
		s->data=e;
		s->next=p->next;
		p->next=s;
		return true;
	}
}

10.删除数据元素

ElemType e 用来保存被删除的数据元素,p 指向 i-1 的节点位置,q 指向 i 的节点位置。

bool ListDelete(LinkList *&L,int i,ElemType &e)
{
	int j=0;
	LinkList *p=L,*q;
	while (j<i-1 && p!=NULL)
	{
		j++;
		p=p->next;
	}

	if(p==NULL)
		return false;
	else
	{
		q=p->next;
		if(q==NULL)
			return false;
		e=q->data;
		p->next=q->next;
		delete q;
		return true;
	}
}

----------------------------------------------------------------------------------------------

主函数 

void main()
{
	LinkList *L1;
	cout<<"1.初始化顺序表:"<<endl;  InitList(L1);

	cout<<"\n2.尾插法插入元素:"<<endl;
	ElemType a[5]={'A','B','C','D','E'};
	for(int i=0;i<5;i++)
		if(!ListInsert(L1,i+1,a[i]))
			cout<<a[i]<<"插入失败!";

	cout<<"\n3.顺序表的元素为:";
	DispList(L1);

	cout<<"\n4.该顺序表的长度为:"<<ListLength(L1)<<endl;

	cout<<"\n5.该顺序表";
	if(ListEmpty(L1))
		cout<<"为空表.";
	else
		cout<<"不为空表.";

	cout<<"\n\n6.取元素";
	ElemType temp;cout<<"请输入取的位置:";int k;cin>>k;
	if(GetElem(L1,k,temp))
		cout<<"取值成功,该顺序表的第"<<k<<"个元素的值为:"<<temp<<endl;
	else
		cout<<"取值失败,你输入的位置"<<k<<"越界!"<<endl;

	cout<<"\n7.查找元素:"<<endl;
	cout<<"请输入查找元素的值:";cin>>temp;
	if(LocateElem(L1,temp))
		cout<<"输出元素"<<temp<<"的位置为"<<LocateElem(L1,temp)<<endl;
	else
		cout<<"元素"<<temp<<"不存在"<<endl;

	cout<<"\n8.在顺序表指定位置插入元素:"<<endl;
	cout<<"请输入插入的位置:";cin>>k;
	cout<<"请输入插入元素的值:";cin>>temp;

	if(ListInsert(L1,k,temp))
		cout<<"插入成功"<<endl;
	else
		cout<<"插入失败"<<endl;

	cout<<"\n9.输出顺序表"<<endl;
	DispList(L1);

	cout<<"\n10.删除指定位置的元素"<<endl;
	cout<<"请输入删除的位置:";cin>>k;
	if(ListDelete(L1,k,temp))
		cout<<"删除成功,删除的元素为:"<<temp<<endl;
	else
		cout<<"删除失败!"<<endl;

	cout<<"\n11.输出顺序表"<<endl;
	DispList(L1);

	cout<<"\n12.释放顺序表"<<endl;
	DestroyList(L1);
}

猜你喜欢

转载自blog.csdn.net/henry594xiaoli/article/details/123820453
今日推荐