提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
题目:
目录
一、填充函数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;
}
结果:
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了创建单链表,并对单链表的数据进行增、删、改、查、数据输入、打印等操作。