C++实现单链表的各项操作

C++实现单链表的各项操作

代码如下:

#include <iostream>
using namespace std;

typedef struct LNode                   //单链表结点构建
{
	int data;
	struct LNode *next;
}LNode;

void creatlistR(LNode *&C,int a[],int n)//尾插法建表,把数组的值导入表中
{
	struct LNode *s,*r;
	int i;int leng=0;
	C=(LNode*)malloc(sizeof(LNode));//为C指向的头结点开辟空间
	C->next=NULL;
	r=C;//让r指向头结点
	for(i=1;i<n;i++)//逐次开辟新的结点,将数组的值逐次赋给结点的数值域
	{
		s=(LNode*)malloc(sizeof(LNode));
		s->data=a[i];
		r->next=s;
		r=r->next;
	}
	r->next=NULL;
}

int lengthenlist(LNode *C)//求表长
{
	struct LNode *r;
	r=C;
	int leng=0;
	if(r->next==NULL)
	{
		return 0;
	}
	while(r->next!=NULL)//当r指针指向空的时候说明r指针已逐次指向过所有结点,
	//指过的次数即为长度
	{
		r=r->next;
		leng=leng+1;
	}
	return(leng);
}

void findelem(LNode *C)//在表中找所输入的元素并输出它的位置loc
{
	struct LNode *p;
	int loc=1;
	int x;
	int leng;
    leng=lengthenlist(C);
    cout<<'\n'<<"请输入你想找的元素: ";
	cin>>x;
	p=C;
	for(int i=1;i<=leng;i++)
	{
		if(p->next->data==x)
		{
			cout<<'\n'<<"你想找的元素的顺序是: ";
	        cout<<loc;
			break;
		}
		else
		{
			p=p->next;
		    loc=loc+1;
		}
	}
	if(loc==leng+1)//如果循环的次数和表长加1相等说明表中没有想找的元素
	{
		cout<<"none";
	}
}

void insert(LNode *&C)//插入元素,在被插元素之前插入
{
	int i;
	int j;
	int e;
	int len;
	cout<<'\n'<<"请输入你想插入的元素 : ";
	cin>>e;
	cout<<'\n'<<"请输入你想插入的位置 : ";//表为空时插入位置为0
	cin>>i;
    len=lengthenlist(C);
	struct LNode *m,*r;
    m=(LNode*)malloc(sizeof(LNode));//为插入结点开辟空间
    m->data=e;
	r=C;
	if(i<=len)//插入的位置必须小于表长
	{
		for(j=1;j<i;j++)//通过循环找到要插入的位置
		{
			r=r->next;
		}
		m->next=r->next;
	    r->next=m;
	}
	else
		cout<<"错误";
}

void listdelete(LNode *&C)//删除元素
{
    int leng;
    leng=lengthenlist(C);
	struct LNode *r;
	r=C;
	int x;
	cout<<'\n'<<"请输入你想删除的元素 :";
	cin>>x;
    for(int i=1;i<=leng;i++)
	{
		if(r->next->data==x) //若找到元素删除它否则让r指针下滑直到找到它
		{
			r->next=r->next->next;
			break;
		}
		else
		{
			r=r->next;
		}
	}
	if(i==leng+1)//i等于表长加1说明表中没有这个元素,空表同样适用
		cout<<"表中找不到元素";
}

void printlist(LNode *C)//打印表
{
    struct LNode *r;
	int i;int e;int len;
	r=C;
	len=lengthenlist(C);
	cout<<'\n'<<"表为 : ";
	if(len==0)
	{
		cout<<"NULL";
	}
	else
	{
		for(i=1;i<=len;i++)
		{
		e=r->next->data;
		cout<<'\t'<<e;
		r=r->next;
		}
	}
}

void initlist(LNode *&C)//判空
{
	int leng;
    leng=lengthenlist(C);
	if(leng==0)
	{
		cout<<"这已经是一个空表了";
	}
	else
	{
		struct LNode *r;
	    r=C;
	    r->next=NULL;
	}
}


int main()
{
	int a[5];
	int j;
	int elem;
	for(j=1;j<6;j++)
	{
        cout<<"请输入表的元素 : ";
		cin>>elem;
		a[j]=elem;
	}

  struct LNode LNode;//建立头结点
	struct LNode *C;//建立头指针
	C=&LNode;//让头指针指向头结点
  creatlistR(C,a,6);
  printlist(C);
	findelem(C)listdelete(C)printlist(C);
  insert(C);
  printlist(C);
	initlist(C);
	printlist(C);
	return 0;
}

运行结果如下:运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值