C++实现单链表基本操作

C++实现单链表基本操作


本博客按照上篇博客线性表单链表的基本操作而写出的完整代码,详情请看单链表基础概念


#include<iostream>
using  namespace std;

//函数结果状态代码
#define OK     1
#define ERROR  0

typedef int Status;    // Status 相当于 int 
typedef char ElemType; //ElemType 相当于 char

typedef struct LNode{    //类型定义 
	ElemType data;
	struct LNode *next;
}LNode,*LinkList;


LinkList L;   //创建单链表L 
LNode *p,*q,*s,*r;     //或LinkList  p,q;
int j;	
	
Status InitList(LinkList &L);  
//始化操作,建立一个空的线性表L

Status DestroyList(LinkList &L);   
//销毁单链表L

Status ClearList(LinkList &L);   
//清空单链表L 

int  ListEmpty(LinkList L);   
//判断是否为空 

int ListLength(LinkList L);   
//求单链表L的表长

Status  GetElem(LinkList L,int i,ElemType &e);  
//取L中第i个的值 

Status LocateElem(LinkList L, ElemType &e);  
//在线性表L中查找值为e的数据元素的位置序号 

Status ListInsert(LinkList &L,int i,ElemType e);
//在L中第i个元素之前插入数据元素e

Status ListDelete(LinkList &L,int i,ElemType &e);
//将线性表L中第i个数据元素删除 

void CreateList_H(LinkList &L,int n);
//前插法 

void CreateList_R(LinkList &L,int n);
//后插法 

int main(){
	
	int ret=InitList(L); 
	if(ret)
		cout << "建立单链表成功" << endl;
	else
		cout << "建立单链表失败" << endl;
	int i;
	cout << "请输入数据个数为:"; 
	cin >> i; 
	cout << "请输入" << i << "个数据元素:"  << endl;
//	CreateList_H(L,i);	//前插     注意两个方法输入的数据顺序相反 
	CreateList_R(L,i);  //后插
	cout << "单链表的长度为:"  << ListLength(L) << endl;
	
	ElemType e;
	cout << "请输入要取出数据的序号为:"; 
	cin >> i;
	GetElem(L,i,e);
	cout << "取出第"<< i << "个的数据为:" << e << endl; 
	
	cout << "请输入查找的元素:";
	cin >> e;
	LocateElem(L, e);  
	cout << "元素" << e << "的序号为:" << j << endl; 	
	
	cout << "请输入要插入的元素和位置:"; 
	cin >> e >> i;
	ret= ListInsert(L,i,e);
	if(ret)
		cout << "插入成功" << endl;
	else
		cout << "插入失败" << endl;	
	cout << "插入后的单链表长度为:"  << ListLength(L) << endl; 
	
	cout << "请输入要删除的元素的序号:"; 
	cin >> i ;
	ret= ListDelete(L,i,e);
	if(ret)
		cout << "删除成功" << endl;
	else
		cout << "删除失败" << endl;	
	
	cout << "清空线性表" << endl; 
	ClearList(L);
	
	ListEmpty(L);
	if(ListEmpty(L))
		cout << "线性表为空" << endl;
	else
		cout << "线性表非空" << endl;
			 
	DestroyList(L);
	cout << "线性表已销毁" << endl; 
	
	return 0;
} 




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

Status DestroyList(LinkList &L){   //销毁单链表L  
	while(L){
		p = L;
		L=L->next;
		delete p;
	}
}

Status ClearList(LinkList &L){   //清空单链表L 
	 
	p=L->next;
	while(p){       //没到表尾 
		q=p->next;
		delete p;
		p=q;
	}
	L->next=NULL;   //头结点指针域为空 
	return OK;
} 

int  ListEmpty(LinkList L){   //若L为空表,则返回1,否则返回0 
	if(L->next)    //非空 
		return 0;
	else
		return 1;	
} 
 
int ListLength(LinkList L){  //返回L中数据元素个数 
	p=L->next;      //p指向第一个结点 
	int i=0;
	while(p){       //遍历单链表,统计结点数 
		i++;
		p=p->next;
	}
	return i;
} 

Status  GetElem(LinkList L,int i,ElemType &e){   //获取线性表L中的某个数据元素的内容,通过变量e返回 
	p=L->next;j=1;  //初始化  
	while(p&&j<i){    //先后扫描,直到p指向第i个元素或p为空 
		p=p->next;
		++j;
	}
	if(!p||j>i)
		return ERROR;   //第i个元素不存在 
	else{
		e = p->data;       //取第i个元素 
		return OK;
	}	
}

//在线性表L中查找值为e的数据元素的位置序号 
Status LocateElem(LinkList L, ElemType &e){  //返回L中值为e的数据元素的位置序号,查找失败返回0 
	p=L->next;
	j=1;
	while(p && p->data!=e){
		p=p->next;
		j++;
	} 
	if(p)
		return j;
	else
		return 0;	
} 

//在L中第i个元素之前插入数据元素e
Status ListInsert(LinkList &L,int i,ElemType e){
	p=L;j=0;
	while(p && j < i-1){    //寻找第i-1个结点,p指向i-1结点 
		p=p->next;          
		++j;      
	}
	if(!p||j>i-1)           //i大于表长+1或者小于1,插入位置非法 
		return ERROR;
	s = new LNode;          //生成新结点s,将结点s的数据域置为e
	s->data	= e;           
	s->next = p->next;      //将结点s插入L中 
	p->next = s;
	return OK;
} 

//将线性表L中第i个数据元素删除 
Status ListDelete(LinkList &L,int i,ElemType &e){  
	p=L;j=0;
	while(p->next && j < i-1){   //寻找第i个结点,并令p指向其前驱 
		p=p->next;
		++j;
	}
	if(!(p->next)||j>i-1)  //删除位置不合理 
		return ERROR;
	q=p->next;                //临时保存被删结点的地址以备释放 
	p->next=q->next;         //改变删除结点前驱节点的指针域 
	e=q->data;               //  保存删除结点的数据域 
	delete q;                //  释放删除结点的空间 
	return OK;	
} 

void CreateList_H(LinkList &L,int n){
	L = new LNode;
	L->next=NULL;   //先建立一个带头结点的单链表 
	for(int i=n;i>0;--i){
		p=new LNode;  //生成新结点 p=(LNode*)malloc(sizeof(LNode)); 
		cin >> p->data;  // 输入元素值scanf(&p->data); 
		p->next = L->next;   //插入到表头 
		L->next = p;
	}
}  //CreateList_H 

////正位序输入n个元素的值,建立带头表结点的单链表L
void CreateList_R(LinkList &L,int n){
	L=new LNode;  L->next=NULL;
	r = L;           //尾指针r指向头结点 
	for(int i=0;i<n;++i){
		p=new LNode;  cin >> p->data;  //生成新结点,输入元素值 
		p->next=NULL;
		r->next=p;   //插入到表尾 
		r=p;   //指针r指向新的尾结点 
	}
} 

发布了7 篇原创文章 · 获赞 37 · 访问量 8527

猜你喜欢

转载自blog.csdn.net/diviner_s/article/details/104027467