数据结构(严蔚敏C语言版)-单链表的基本操作总结

文章目录

    • 一、引言
    • 二、代码语言与编译器
      • 完整代码
      • 运行截图
      • 分步记录
        • 1.基本操作函数声明
        • 2.函数定义
        • 3.主函数

一、引言

最近学习数据结构,从严蔚敏C语言版开始学习,现已将第二章单链表相关内容的伪代码调通在编译器中成功编辑,现将代码附上方便自己日后复习和大家采纳与指正。

二、代码语言与编译器

代码使用C++在dev下写的,因为C语言对引用不是很支持,而课本主要指导利用引用进行算法的书写,故使用C++。大同小异,触类旁通。

完整代码

//完整代码 分布讲解见下方

#include 
using namespace std; 
#define OK 1;
#define ERROR 0;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

typedef int Status;
typedef int ElemType;

typedef struct LNode{//存储结构 
	ElemType data;//数据域 
	struct LNode *next;	//指针域 
}LNode,*LinkList;/*LinkList是指向LNode结构体的指针类型,可以通过这个指针类型定义LNode这个结构体的表 */ 

Status InitList(LinkList &L);//初始化
void CreateList_H(LinkList &L,int n);//头插法创建单链表
void CreateList_R(LinkList &L,int n);//后插法创建单链表 
void TraverseList(LinkList L);//遍历单链表 
Status GetElem(LinkList L,int i,ElemType &e);//按位查找值 
LNode *LocateElem(LinkList L,ElemType);//按值查找地址 
Status ListInsert(LinkList &L,int i,ElemType e);//单个数据插入 
Status ListDelete(LinkList &L,int i);//删除第i个数据 

int main(int argc, char** argv) {
	LinkList L;
	int n,i,op=1;
	ElemType e,value;
	InitList(L);
	cout<<"<1>.前插法创建单链表"<<endl
		<<"<2>.后插法创建单链表"<<endl
		<<"<3>.遍历"<<endl
		<<"<4>.按位查询"<<endl
		<<"<5>.按值查询"<<endl
		<<"<6>.插入第i个数据"<<endl 
		<<"<7>.删除第i个数据"<<endl
		<<"<0>.退出"<<endl
		<<"--------------------"<<endl; 
	while(op){
		cout<<"请输入你要进行的操作:\t"; 
		cin>>op;
		if(op>7)cout<<"Sorry,your input is wrong!"<<endl;
		switch(op){
			
	case 1://前插法创建单链表 
	cout<<"你想创建单链表的表长为:";
	cin>>n;
	CreateList_H(L,n);
	break;
	
	case 2://后茶法创建单链表 
	cout<<"你想创建单链表的表长为:";
	cin>>n;
	CreateList_R(L,n);
	break;
	
	case 3://遍历 
	if(!L->next){
	cout<<"还未创建单链表,查询失败!"<<endl;
	break;
	}
	TraverseList(L);
	break;
	
	case 4://按位查询 
	if(!L->next){
	cout<<"还未创建单链表,查询失败!"<<endl;
	break;
	}
	cout<<"你想查询的位置i是:";
	cin>>i;
	if(GetElem(L,i,e)) cout<<"the result of getting is:"<<e<<endl;
	else cout<<"查询失败!";
	break;
	
	case 5://按值查询 
	if(!L->next){
	cout<<"还未创建单链表,查询失败!"<<endl;
	break;
	}
	cout<<"你想查询的值value为:";
	cin>>value;
	cout<<"the address of getting is:"<<LocateElem(L,value)<<endl;
	break;
	
	case 6://插入 
	if(!L->next){
	cout<<"还未创建单链表,查询失败!"<<endl;
	break;
	}
	cout<<"你想插入的位置和数字是:";
	cin>>i>>e;
	if(ListInsert(L,i,e))cout<<"插入成功!";
	else cout<<"输入位置不合法!" ;
	break;
	
	case 7://删除
	if(!L->next){
	cout<<"还未创建单链表,查询失败!"<<endl;
	break;
	}
	cout<<"你想删除的位置i是:";
	cin>>i;
	if(ListDelete(L,i))cout<<"删除成功!"<<endl; 
	else cout<<"删除失败,删除位置不合法!"; 
	break;
	
	case 0:
		cout<<"EXIT!"<<endl; 
		return 0;
	}
	}
	return 0;
}

Status InitList(LinkList &L){
	L=new LNode;
	L->next=NULL;
	return 1;
}

void CreateList_H(LinkList &L,int n){
	
	L=new LNode;
	L->next=NULL;
	for(int i=0;i<n;i++){
		LinkList p;
		p=new LNode;
		cout<<"请输入第"<<n-i<<"个数为:";
		cin>>p->data;
		p->next=L->next;
		L->next=p;
	}
	cout<<"前插法创建成功!"<<endl; 
}

void CreateList_R(LinkList &L,int n){
	L=new LNode;
	L->next=NULL;
	LinkList p,r;
	r=L;
	for(int i=0;i<n;i++){
		p=new LNode;
		cout<<"请输入第"<<i+1<<"个数为:";
		cin>>p->data;
		p->next=NULL;
		r->next=p;
		r=p;
	}
	cout<<"后插法创建成功!"<<endl; 
} 

void TraverseList(LinkList L){
	LinkList p;
	p=L;
	cout<<"遍历结果:";
	while(p->next!=NULL){
		p=p->next;
		cout<<p->data<<"  ";
	}
	cout<<endl; 
	
}

Status GetElem(LinkList L,int i,ElemType &e){
	LinkList p;
	p=L; 
	int j;
	for(j=0;j<i&&p;j++)//防止系统停止运行 
		p=p->next;
	if(!p||i<1)return ERROR;
	e=p->data;	
	return OK;
} 

LNode *LocateElem(LinkList L,ElemType e){
	LinkList p=L->next;//初始化指向首元结点
	while(p&&p->data!=e){
		p=p->next;
	} 
	return p;//1.p为NULL 2.p->data==e 
	 
} 

Status ListInsert(LinkList &L,int i,ElemType e){
	//带有头结点 在第i个位置插入新结点(计数时不包含头结点)。
	LinkList p,q;
	p=L;
	int j=0;
	
	q=new LNode;
	q->next=NULL;
	q->data=e;
	while(p&&j<i-1)//找第i-1个结点 
	{
		p=p->next;
		j++; 
	} 
	if(!p&&i<1)return ERROR;/*p为空说明未找到第i-1个结点 或者说i-1个结点是n+1 */ 
	q->next=p->next;
	p->next=q;
	return OK;
} 

Status ListDelete(LinkList &L,int i){
	//找到第i-1个结点
	
	LinkList p,q;
	p=L;
	int j=0;
	while(p->next&&j<i-1)//找第i-1个结点 
	{
		p=p->next;
		j++; 
	} 
	if(!p->next||i<1)return ERROR;/*p->next为空则证明第i-1个结点是最后一个结点n 第i个不存在 无法删除 */
	q=p->next;
	p->next=q->next;//用q过渡一下第i-1个和第i+1个
	delete q;//将过渡的这个辅助q删除掉 
	return OK;

} 



运行截图

数据结构(严蔚敏C语言版)-单链表的基本操作总结_第1张图片

分步记录

1.基本操作函数声明

Status InitList(LinkList &L);//初始化
void CreateList_H(LinkList &L,int n);//头插法创建单链表
void CreateList_R(LinkList &L,int n);//后插法创建单链表 
void TraverseList(LinkList L);//遍历单链表 
Status GetElem(LinkList L,int i,ElemType &e);//按位查找值 
LNode *LocateElem(LinkList L,ElemType);//按值查找地址 
Status ListInsert(LinkList &L,int i,ElemType e);//单个数据插入 
Status ListDelete(LinkList &L,int i);//删除第i个数据 

这里一开始我没懂Status的意思 后来经过查找知道这是前边默认做了一些类似

typedef int Status;typedef void Status;

的一种重新定义(可以理解成创建别名):类似将Status自定义为int数据类型或void数据类型。

这里记下两个定义常量的方式

#define N 100    //宏定义 
const int N=100;//这里需要注意的是静态定义常量N时需要初始化(即直接赋值)且不可在被修改

2.函数定义

Status InitList(LinkList &L){
	L=new LNode;
	L->next=NULL;
	return 1;
}

void CreateList_H(LinkList &L,int n){
	
	L=new LNode;
	L->next=NULL;
	for(int i=0;i<n;i++){
		LinkList p;
		p=new LNode;
		cout<<"请输入第"<<n-i<<"个数为:";
		cin>>p->data;
		p->next=L->next;
		L->next=p;
	}
	cout<<"前插法创建成功!"<<endl; 
}

void CreateList_R(LinkList &L,int n){
	L=new LNode;
	L->next=NULL;
	LinkList p,r;
	r=L;
	for(int i=0;i<n;i++){
		p=new LNode;
		cout<<"请输入第"<<i+1<<"个数为:";
		cin>>p->data;
		p->next=NULL;
		r->next=p;
		r=p;
	}
	cout<<"后插法创建成功!"<<endl; 
} 

void TraverseList(LinkList L){
	LinkList p;
	p=L;
	cout<<"遍历结果:";
	while(p->next!=NULL){
		p=p->next;
		cout<<p->data<<"  ";
	}
	cout<<endl; 
	
}

Status GetElem(LinkList L,int i,ElemType &e){
	LinkList p;
	p=L; 
	int j;
	for(j=0;j<i&&p;j++)//防止系统停止运行 
		p=p->next;
	if(!p||i<1)return ERROR;
	e=p->data;	
	return OK;
} 

LNode *LocateElem(LinkList L,ElemType e){
	LinkList p=L->next;//初始化指向首元结点
	while(p&&p->data!=e){
		p=p->next;
	} 
	return p;//1.p为NULL 2.p->data==e 
	 
} 

Status ListInsert(LinkList &L,int i,ElemType e){
	//带有头结点 在第i个位置插入新结点(计数时不包含头结点)。
	LinkList p,q;
	p=L;
	int j=0;
	
	q=new LNode;
	q->next=NULL;
	q->data=e;
	while(p&&j<i-1)//找第i-1个结点 
	{
		p=p->next;
		j++; 
	} 
	if(!p&&i<1)return ERROR;/*p为空说明未找到第i-1个结点 或者说i-1个结点是n+1 */ 
	q->next=p->next;
	p->next=q;
	return OK;
} 

Status ListDelete(LinkList &L,int i){
	//找到第i-1个结点
	
	LinkList p,q;
	p=L;
	int j=0;
	while(p->next&&j<i-1)//找第i-1个结点 
	{
		p=p->next;
		j++; 
	} 
	if(!p->next||i<1)return ERROR;/*p->next为空则证明第i-1个结点是最后一个结点n 第i个不存在 无法删除 */
	q=p->next;
	p->next=q->next;//用q过渡一下第i-1个和第i+1个
	delete q;//将过渡的这个辅助q删除掉 
	return OK;

} 

3.主函数

int main(int argc, char** argv) {
	LinkList L;
	int n,i,op=1;
	ElemType e,value;
	InitList(L);
	cout<<"<1>.前插法创建单链表"<<endl
		<<"<2>.后插法创建单链表"<<endl
		<<"<3>.遍历"<<endl
		<<"<4>.按位查询"<<endl
		<<"<5>.按值查询"<<endl
		<<"<6>.插入第i个数据"<<endl 
		<<"<7>.删除第i个数据"<<endl
		<<"<0>.退出"<<endl
		<<"--------------------"<<endl; 
	while(op){
		cout<<"请输入你要进行的操作:\t"; 
		cin>>op;
		if(op>7)cout<<"Sorry,your input is wrong!"<<endl;
		switch(op){
			
	case 1://前插法创建单链表 
	cout<<"你想创建单链表的表长为:";
	cin>>n;
	CreateList_H(L,n);
	break;
	
	case 2://后茶法创建单链表 
	cout<<"你想创建单链表的表长为:";
	cin>>n;
	CreateList_R(L,n);
	break;
	
	case 3://遍历 
	if(!L->next){
	cout<<"还未创建单链表,查询失败!"<<endl;
	break;
	}
	TraverseList(L);
	break;
	
	case 4://按位查询 
	if(!L->next){
	cout<<"还未创建单链表,查询失败!"<<endl;
	break;
	}
	cout<<"你想查询的位置i是:";
	cin>>i;
	if(GetElem(L,i,e)) cout<<"the result of getting is:"<<e<<endl;
	else cout<<"查询失败!";
	break;
	
	case 5://按值查询 
	if(!L->next){
	cout<<"还未创建单链表,查询失败!"<<endl;
	break;
	}
	cout<<"你想查询的值value为:";
	cin>>value;
	cout<<"the address of getting is:"<<LocateElem(L,value)<<endl;
	break;
	
	case 6://插入 
	if(!L->next){
	cout<<"还未创建单链表,查询失败!"<<endl;
	break;
	}
	cout<<"你想插入的位置和数字是:";
	cin>>i>>e;
	if(ListInsert(L,i,e))cout<<"插入成功!";
	else cout<<"输入位置不合法!" ;
	break;
	
	case 7://删除
	if(!L->next){
	cout<<"还未创建单链表,查询失败!"<<endl;
	break;
	}
	cout<<"你想删除的位置i是:";
	cin>>i;
	if(ListDelete(L,i))cout<<"删除成功!"<<endl; 
	else cout<<"删除失败,删除位置不合法!"; 
	break;
	
	case 0:
		cout<<"EXIT!"<<endl; 
		return 0;
	}
	}
	return 0;
}//我是真的菜

主函数中使用了循环下套用switch-case函数,实现的操作选择。

新手上路,擅长急刹,欢迎撞车,相互提升!

你可能感兴趣的:(数据结构)