创建单链表,并对单链表的数据进行增、删、改、查、数据输入、打印等操作(C++)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

题目:

目录

题目:

一、创建单链表

二、单链表的初始化

三、单链表的取值

四、单链表的查找

五、单链表的插入

六、单链表的删除

七、单链表的输入数据

八、单链表输出所数据

九、输出单链表的表长

十、输出最大值

全部代码:

结果:

总结


一、填充函数ShowList实现将单链表的所有元素输出出来。

二、填充函数ListLength实现单链表的求表长操作,返回链表的表长。

三、主函数:

1) 建立单链表。建立一个包括头结点和4个结点的(5,4,2,1)的单链表,实现单链表建立的基本操作。

2)将该单链表的所有元素显示出来。

3)取值。在已建好的单链表中的第3个位置(i=3)取出元素的值并输出。

4)查找。在链表中找等于2和等于100的元素,并显示相关信息。

5) 插入元素。在已建好的单链表中的指定位置(i=3)插入一个结点3,实现单链表插入的基本操作,并将该单链表的所有元素显示出来。

6) 删除元素。在一个包括头结点的单链表的指定位置(如i=2)删除一个结点,实现单链表删除的基本操作,并将该单链表的所有元素显示出来。

7)输出该单链表的表长。

8)取最大值。设计一个算法,通过一趟遍历确定长度为n的单链表中值最大的结点。

一、创建单链表

typedef struct LNode {
	ElemType data; //结点的数据域
	struct LNode *next; //结点的指针域
} L

二、单链表的初始化


Status InitList(LinkList &L) { //算法2.6 单链表的初始化
	//构造一个空的单链表L
	L = new LNode; //生成新结点作为头结点,用头指针L指向头结点
	L->next = NULL; //头结点的指针域置空
	return OK;
}

三、单链表的取值


Status GetElem(LinkList L, int i, ElemType &e) { //算法2.7 单链表的取值
	//在带头结点的单链表L中查找第i个元素
	//用e返回L中第i个数据元素的值
	int j;
	LinkList p;
	p=L->next;j=1;
	while(p&&j<i) 
	{
		p=p->next;
		++j;
	}
	if(!p||j>i)return ERROR;
	e=p->data;
	cout<<e;
	return OK;
//TODO
} //GetElem

四、单链表的查找


LNode *LocateElem(LinkList L,  ElemType e) { //算法2.8 按值查找
	//在带头结点的单链表L中查找值为e的元素
//TODO
	LinkList p;
//LinkList p;
p=L->next;
int i=0;
while(p&&p->data!=e)
{
p=p->next;
i++;
}
return p;
} //LocateElem

五、单链表的插入


Status ListInsert(LinkList &L, int i, ElemType e) { //算法2.9 单链表的插入
	//在带头结点的单链表L中第i个位置插入值为e的新结点
	int j;
	LinkList p, s;

p=L;j=0;
while(p&&(j<i-1))
{
	p=p->next;++j;
}
if(!p||j>i-1)return ERROR;
s=new LNode;
s->data=e;
s->next=p->next;
p->next=s;
return OK;
//TODO
} //ListInsert

六、单链表的删除


Status ListDelete(LinkList &L, int i) { //算法2.9 单链表的删除
	//在带头结点的单链表L中,删除第i个位置	
	LinkList p, q;
	int j;
	p = L;
	j = 0;
	while((p->next)&&(j<i-1))
	{
		p=p->next;++j;
	}
	if(!(p->next)||(j>i-1))return ERROR;
	q=p->next;
	p->next=q->next;
	delete q;
	return OK;
	
//TODO
} //ListDelete

七、单链表的输入数据


void CreateList_H(LinkList &L, int n) { //算法2.11 前插法创建单链表
	//逆位序输入n个元素的值,建立到头结点的单链表L(单链表的输入) 
	LinkList p;
	L=new LNode;
	L->next=NULL;
	cout<<"请输入数据(以空格隔开):"<<endl;
	for(int i=0;i<n;i++) 
	{
		p=new LNode;
		cin>>p->data;
		p->next=L->next;L->next=p;
	}
//TODO
	
} //CreateList_H

void CreateList_R(LinkList &L, int n) { //算法2.12 后插法创建单链表
	//正位序输入n个元素的值,建立带表头结点的单链表L(单链表的输入) 
//TO DO
LinkList p,r;
	int i;
	L=new LNode;
	L->next=NULL;
	r=L;
	cout<<"请输入数据(以空格隔开):"<<endl;
	for(i=0;i<n;i++)
	{
		p=new LNode;
		cin>>p->data;
		p->next=NULL;r->next=p;
		r=p;
	}
	
	
} //CreateList_R

八、单链表输出所数据

void ShowList(LinkList L)
{//将该单链表的所有元素显示出来
	LinkList p;
	p=L->next;
	while(p->next!=NULL)
	{
		cout<<p->data<<" ";
		p=p->next;
	}
	cout<<p->data<<endl;
	
}

九、输出单链表的表长

int  ListLength(LinkList L)
{//实现单链表的求表长操作
//TODO
		LinkList p;
		int ListLength=1;
		p=L->next;
		while(p->next!=NULL)
		{
			ListLength++;
			p=p->next;
		}
		cout<<ListLength<<endl;
}

十、输出最大值

int Max(LinkList L)//求最大值 
{
	LinkList p,max;
	p=L->next;
	 max=p;
	while(p!=NULL)
	{
		if(p->data>max->data)
		max=p;
		p=p->next;
	}
	return max->data;	
}

全部代码:

#include<iostream>
#include<string>
#include<iomanip>
#include<fstream>
using namespace std;

#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status; //Status 是函数返回值类型,其值是函数结果状态代码。
typedef int ElemType; //ElemType 为可定义的数据类型,此设为int类型


typedef struct LNode {
	ElemType data; //结点的数据域
	struct LNode *next; //结点的指针域
} LNode, *LinkList; //LinkList为指向结构体LNode的指针类型



Status InitList(LinkList &L) { //算法2.6 单链表的初始化
	//构造一个空的单链表L
	L = new LNode; //生成新结点作为头结点,用头指针L指向头结点
	L->next = NULL; //头结点的指针域置空
	return OK;
}

Status GetElem(LinkList L, int i, ElemType &e) { //算法2.7 单链表的取值
	//在带头结点的单链表L中查找第i个元素
	//用e返回L中第i个数据元素的值
	int j;
	LinkList p;
	p=L->next;j=1;
	while(p&&j<i) 
	{
		p=p->next;
		++j;
	}
	if(!p||j>i)return ERROR;
	e=p->data;
	cout<<e;
	return OK;
//TODO
} //GetElem

LNode *LocateElem(LinkList L,  ElemType e) { //算法2.8 按值查找
	//在带头结点的单链表L中查找值为e的元素
//TODO
	LinkList p;
//LinkList p;
p=L->next;
int i=0;
while(p&&p->data!=e)
{
p=p->next;
i++;
}
return p;
} //LocateElem

Status ListInsert(LinkList &L, int i, ElemType e) { //算法2.9 单链表的插入
	//在带头结点的单链表L中第i个位置插入值为e的新结点
	int j;
	LinkList p, s;

p=L;j=0;
while(p&&(j<i-1))
{
	p=p->next;++j;
}
if(!p||j>i-1)return ERROR;
s=new LNode;
s->data=e;
s->next=p->next;
p->next=s;
return OK;
//TODO
} //ListInsert

Status ListDelete(LinkList &L, int i) { //算法2.9 单链表的删除
	//在带头结点的单链表L中,删除第i个位置	
	LinkList p, q;
	int j;
	p = L;
	j = 0;
	while((p->next)&&(j<i-1))
	{
		p=p->next;++j;
	}
	if(!(p->next)||(j>i-1))return ERROR;
	q=p->next;
	p->next=q->next;
	delete q;
	return OK;
	
//TODO
} //ListDelete

void CreateList_H(LinkList &L, int n) { //算法2.11 前插法创建单链表
	//逆位序输入n个元素的值,建立到头结点的单链表L(单链表的输入) 
	LinkList p;
	L=new LNode;
	L->next=NULL;
	cout<<"请输入数据(以空格隔开):"<<endl;
	for(int i=0;i<n;i++) 
	{
		p=new LNode;
		cin>>p->data;
		p->next=L->next;L->next=p;
	}
//TODO
	
} //CreateList_H

void CreateList_R(LinkList &L, int n) { //算法2.12 后插法创建单链表
	//正位序输入n个元素的值,建立带表头结点的单链表L(单链表的输入) 
//TO DO
LinkList p,r;
	int i;
	L=new LNode;
	L->next=NULL;
	r=L;
	cout<<"请输入数据(以空格隔开):"<<endl;
	for(i=0;i<n;i++)
	{
		p=new LNode;
		cin>>p->data;
		p->next=NULL;r->next=p;
		r=p;
	}
	
	
} //CreateList_R

void ShowList(LinkList L)
{//将该单链表的所有元素显示出来
	LinkList p;
	p=L->next;
	while(p->next!=NULL)
	{
		cout<<p->data<<" ";
		p=p->next;
	}
	cout<<p->data<<endl;
	
}

int  ListLength(LinkList L)
{//实现单链表的求表长操作
//TODO
		LinkList p;
		int ListLength=1;
		p=L->next;
		while(p->next!=NULL)
		{
			ListLength++;
			p=p->next;
		}
		cout<<ListLength<<endl;
}
int paixun(LinkList L)//排序 
{
  LinkList p,r,temp,q;
  p=L->next;
  while(p != NULL) {
        q = r;
        temp = p;
        p = p->next;//指向第一个; 
        if(q != NULL && q->next != NULL) {
                while(temp->data > q->next->data){
                       q = q->next;
                }
                 temp->next = q->next;
                 q->next = temp;

        }
        else if(q == NULL) {
                cout<<"H is NULL\n";
               return ERROR;
        }
        else if(q->next == NULL) {
                temp->next = NULL;
                q->next = temp;
        }
}    
return 0;
}
int Max(LinkList L)//求最大值 
{
	LinkList p,max;
	p=L->next;
	 max=p;
	while(p!=NULL)
	{
		if(p->data>max->data)
		max=p;
		p=p->next;
	}
	return max->data;	
}

int main() {
	LinkList s;
	int n,a;
	cout<<"请输入n的个数:"; 
	cin>>n;
	CreateList_R(s,n);
	cout<<"结果为:";
	ShowList(s);
	cout<<"取值,输出第三个的值为:";
	GetElem(s,3,a);
	cout<<endl; 
	if(LocateElem(s,2)!=NULL)
	cout<<"找到数据2了,位置在"<<cout<<LocateElem(s,2)<<endl;
	else 
	cout<<"没有找到为2的数据" <<endl;
	if(LocateElem(s,100)!=NULL)
	cout<<"找到数据100了,位置在"<<cout<<LocateElem(s,100)<<endl;
	else 
	cout<<"没有找到为100的数据" <<endl;
	cout<<"在第三个位置中,插入数据3"<<endl;
	ListInsert(s,3,3);
	cout<<"结果为:";
	 ShowList(s);
	 cout<<"删除第二个数据:"<<endl;
	ListDelete(s,2);
	cout<<"结果为:";
	 ShowList(s);
	 cout<<"输出单链表的长度:";
	 ListLength(s);
	cout<<"该链表中,最大值为:"<<Max(s)<<endl;
	//cout<<"对单链表进行排序"<<endl;
	//paixun(s) ;
//	cout<<"结果为:";
	//ShowList(s);
	return 0;
}

结果:


 

总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了创建单链表,并对单链表的数据进行增、删、改、查、数据输入、打印等操作。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

酷酷滴Q

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值