线性表的链式储存结构的基本操作(经编译)

版权声明:如有雷同,纯属巧合!!!!! https://blog.csdn.net/henu1710252658/article/details/83240324

/* 链表销毁的时候,是先销毁了链表的头,然后接着一个一个的把后面的结点销毁了,这样这个链表就不能再使用了。
链表清空的时候,是先保留了链表的头,然后把头后面的所有的结点都销毁,最后把头里指向下一个的指针设为空,这样就相当与清空了,但这个链表还在,还可以继续使用*/

#include<iostream>		 
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
using namespace std;

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -2
#define MAXSIZE 20


typedef int ElemType;

typedef struct LNode {
	ElemType data;
	struct LNode *next;
} LNode;

typedef struct LNode *LinkList;			
//初始化或重置链表
int ResetList(LinkList *L) { 
	LinkList p,q;
	p=(*L)->next;
	while(p) {
		q=p->next;
		free(p);
		p=q;
	}
	(*L)->next=NULL;
	cout<<"重置成功!"<<endl;
	return OK;
}
//销毁链表
int DestroyList(LinkList *L) {
	if(!(*L)) {
		cout<<"链表不存在!"<<endl;
		return FALSE;
	} else {
		LinkList q;
		while(*L) {
			q=(*L)->next;
			free(*L);
			*L=q;
		}
		cout<<"销毁成功!"<<endl;
		return OK;
	}
}

//链表中数据元素个数
int ListLength(LinkList L) {
	if(!L) {
		cout<<"链表不存在!"<<endl;
		return FALSE;
	} else {
		LinkList e;
		int num=0;
		e=L->next;
		while(e) {
			num++;
			e=e->next;
		}
		return num;
	}
}

//所指位序的元素值
int GetElem(LinkList L,int locate,ElemType *e) {
	int j=1;
	LinkList p;
	p=L->next;
	while(p && j<locate) {
		p=p->next;
		++j;
	}
	if( !p || j>locate) {
		cout<<"该位序不存在!"<<endl;
		return ERROR;
	}
	*e=p->data;
	cout<<"第"<<locate<<"个元素为:"<<*e<<endl;
	return OK;
}
//链表已存在元素的位序
int LocateElem(LinkList L,ElemType e) {
	int i=0;
	LinkList p=L->next;
	while(p) {
		i++;
		if( p->data == e )	return i;
		p=p->next;
	}
	return ERROR;
}


//请输入元素,求直接前驱
int PriorElem(LinkList L,ElemType cur_e,LinkList *pre_e) {
	*pre_e=L->next;
	int a,num=1;
	a=LocateElem(L,cur_e);
//	cout<<a<<endl;
	if(a==0) {
		cout<<"元素"<<cur_e<<"不存在!"<<endl;
		return OVERFLOW;
	} else if(a==1) {
		cout<<"元素"<<cur_e<<"没有前驱!"<<endl;
		return OVERFLOW;
	} else {
		while(pre_e && num<(a-1)) {
			*pre_e=(*pre_e)->next;
			++num;
		}
		if(num==(a-1)) {
			cout<<"元素"<<cur_e<<"的前驱为:"<<(*pre_e)->data<<endl;
			return OK;
		}
	}
}

//第二种方法
//	if(pre_e->data == cur_e){
//		cout<<"元素"<<cur_e<<"没有前驱!"<<endl;
//		return OVERFLOW;
//	}
//	else{
//		while(pre_e->next){
//			if(pre_e->next->data == cur_e){
//				cout<<"元素"<<cur_e<<"的前驱为:"<<pre_e->data<<endl;
//				return OK;
//			}
//			else{
//				pre_e=pre_e->next;
//			}
//		}
//		cout<<"元素"<<cur_e<<"不存在!"<<endl;
//		return OVERFLOW;
//	}

//请输入元素,求直接后继
int NextElem(LinkList L,ElemType cur_e, LinkList next_e) {
	next_e=L->next;
	int a,num=1;
	a=LocateElem(L,cur_e);
//	cout<<ListLength(L)<<endl;
	if(a==0) {
		cout<<"元素"<<cur_e<<"不存在!"<<endl;
		return OVERFLOW;
	} else if(a==ListLength(L)) {
		cout<<"元素"<<cur_e<<"没有后驱!"<<endl;
		return OVERFLOW;
	} else {
		while(next_e && num<(a+1)) {
			next_e=next_e->next;
			++num;
		}
		if(num==(a+1)) {
			cout<<"元素"<<cur_e<<"的后驱为:"<<next_e->data<<endl;
		}
	}
	return OK;
}

//第二种方法:
//	while(next_e){
//		if(next_e->data == cur_e){
//			cout<<"元素"<<cur_e<<"的后驱为:"<<next_e->next->data<<endl;
//			return OK;
//		}
//		else{
//			next_e=next_e->next;
//		}
//		if(next_e->next == 0){
//			cout<<"元素"<<cur_e<<"没有后驱!"<<endl;
//			return OVERFLOW;
//		}
//	}
//	cout<<"元素"<<cur_e<<"不存在!"<<endl;
//	return OVERFLOW;

//在第i个位置插入元素
int ListInsert(LinkList *L,int i,ElemType e) {
	int j;
	LinkList p,s;
	p = *L;
	j = 1;
	while (p && j < i) {
		p = p->next;
		++j;
	}
	if (!p || j > i) {
		cout<<"插入失败!"<<endl;
		return ERROR;
	}
	s = (LinkList)malloc(sizeof(LNode));
	s->data = e;
	s->next = p->next;      /* 将p的后继结点赋值给s的后继  */
	p->next = s;          /* 将s赋值给p的后继 */
	cout<<"插入成功!"<<endl;
	return OK;
}

//删除第i个元素
int ListDelete(LinkList *L,int i,ElemType *e) {
	int j;
	LinkList p,q;
	p = *L;
	j = 1;
	while (p->next && j < i) {
		p = p->next;
		++j;
	}
	if (!(p->next) || j > i) {
		cout<<"删除失败!"<<endl;
		return ERROR;
	}
	q = p->next;
	p->next = q->next;			/* 将q的后继赋值给p的后继 */
	*e = q->data;               /* 将q结点中的数据给e */
	free(q);                    /* 让系统回收此结点,释放内存 */
	cout<<"删除成功!"<<endl;
	return OK;
}

//输出所输入的链表元素
int ListTraverse(LinkList L) {
	if(!L) {
		cout<<"链表不存在!"<<endl;
		return FALSE;
	} else {
		LinkList e;
		e=L->next;
		while(e) {
			cout<<e->data<<" ";
			e=e->next;
		}
		cout<<endl;
		return OK;
	}
}

//初始化并输入链表元素(尾插法!!!!!)
int InitList(LinkList *L) {
	LinkList rear,p;
	(*L)=(LinkList)malloc(sizeof(LNode));
	if(!(*L)) {
		cout<<"初始化失败!"<<endl;
		return ERROR;
	}
	rear=*L;
	int num;
	while(scanf("%d",&num) != EOF ) {
		if(num<0)  break;
		p=(LinkList)malloc(sizeof(LNode));
		p->data=num;
		rear->next=p;
		rear = p;
	}
	rear->next=NULL;
	return OK;
}


int main() {

	LinkList L=NULL,pre_e,next_e;
	int locate;
	ElemType e,cur_e;

	cout<<"可执行操作有:" <<endl;
	cout<<"************************************************************"<<endl;
	cout<<"*************   1.初始化或重置链表   	*******************"<<endl;
	cout<<"*************   2.销毁链表           	*******************"<<endl;
	cout<<"*************   3.链表中数据元素个数 	*******************"<<endl;
	cout<<"*************   4.所指位序的元素值   	*******************"<<endl;
	cout<<"*************   5.链表已存在元素的位序   *******************"<<endl;
	cout<<"*************   6.请输入元素,求直接前驱 *******************"<<endl;
	cout<<"*************   7.请输入元素,求直接后继 *******************"<<endl;
	cout<<"*************   8.在第i个位置插入元素    *******************"<<endl;
	cout<<"*************   9.删除第i个元素          *******************"<<endl;
	cout<<"*************   10.输出所输入的链表元素  *******************"<<endl;
	cout<<"*************   11.初始化并输入链表元素  *******************"<<endl;
	cout<<"*************   12.退出                  *******************"<<endl;
	cout<<"************************************************************"<<endl;
	cout<<endl<<"请输入你的选择:";
	int num;
	while(scanf("%d",&num)!= EOF) {
		switch(num) {
			case 1:
				if(!L) {
					cout<<"链表不存在!"<<endl;
					cout<<endl<<"请输入你的选择:";
					break;
				} else {
					ResetList(&L);
					cout<<"请输入链表元素(以一个负数结尾):";
					InitList(&L);
					cout<<endl<<"请输入你的选择:";
					break;
				}
			case 2:
				DestroyList(&L);
				cout<<endl<<"请输入你的选择:";
				break;
			case 3:
				if(!L) {
					cout<<"链表不存在!"<<endl;
					cout<<endl<<"请输入你的选择:";
					break;
				} else {
					cout<<"链表中数据元素个数为:"<<ListLength(L)<<endl;
					cout<<endl<<"请输入你的选择:";
					break;
				}
			case 4:
				if(!L) {
					cout<<"链表不存在!"<<endl;
					cout<<endl<<"请输入你的选择:";
					break;
				} else {
					cout<<"请输入一个位序数:";
					cin>>locate;
					GetElem(L,locate,&e);
					cout<<endl<<"请输入你的选择:";
					break;
				}
			case 5:
				if(!L) {
					cout<<"链表不存在!"<<endl;
					cout<<endl<<"请输入你的选择:";
					break;
				} else {
					cout<<"请输入需要查询的元素:";
					cin>>e;
					cout<<"元素"<<e<<"的位序为:"<<LocateElem(L,e)<<endl;
					cout<<endl<<"请输入你的选择:";
					break;
				}
			case 6:
				if(!L) {
					cout<<"链表不存在!"<<endl;
					cout<<endl<<"请输入你的选择:";
					break;
				} else {
					cout<<"请输入需要查询前驱的元素:";
					cin>>cur_e;
					PriorElem(L,cur_e,&pre_e);
					cout<<endl<<"请输入你的选择:";
					break;
				}
			case 7:
				if(!L) {
					cout<<"链表不存在!"<<endl;
					cout<<endl<<"请输入你的选择:";
					break;
				} else {
					cout<<"请输入需要查询后驱的元素:";
					cin>>cur_e;
					NextElem(L,cur_e,next_e);
					cout<<endl<<"请输入你的选择:";
					break;
				}
			case 8:
				if(!L) {
					cout<<"链表不存在!"<<endl;
					cout<<endl<<"请输入你的选择:";
					break;
				} else {
					cout<<"请输入需要插入的位序和元素:";
					cin>>locate>>e;
					ListInsert(&L,locate,e);
					cout<<endl<<"请输入你的选择:";
					break;
				}
			case 9:
				if(!L) {
					cout<<"链表不存在!"<<endl;
					cout<<endl<<"请输入你的选择:";
					break;
				} else {
					cout<<"请输入需要删除的位序:";
					cin>>locate;
					ListDelete(&L,locate,&e);
					cout<<endl<<"请输入你的选择:";
					break;
				}
			case 10:
				if(!L) {
					cout<<"链表不存在!"<<endl;
					cout<<endl<<"请输入你的选择:";
					break;
				} else {
					cout<<"该链表元素为:";
					ListTraverse(L);
					cout<<endl<<"请输入你的选择:";
					break;
				}
			case 11:
				cout<<"请输入链表元素(以一个负数结尾):";
				InitList(&L);
				cout<<endl<<"请输入你的选择:";
				break;
			case 12:
				return 0;
				break;
			default:
				cout<<"该数据无效,请重新输入:";
				break;
		}
	}
	return 0;		 
}

猜你喜欢

转载自blog.csdn.net/henu1710252658/article/details/83240324