单链表的操作

#include<iostream>
using namespace std;

typedef int ElemType;
typedef struct LNode{
	ElemType data;
	struct LNode* next;
}LNode,*LinkList;

//初始化
//带头结点
void initList(LinkList& L) {
	L = new LNode;
	L->next = NULL;
}
//头部插入法建表
void InputList_H(LinkList& L, int n) {
	//initList(L);
	LNode* p;//用于开辟新的结点
	for (int i = 0; i < n; i++) {
		p = new LNode;
		cin >> p->data;
		//将新结点插入到头结点后
		p->next = L->next;
		L->next = p;
	}
}//头插法
//尾插法建表
void InputList_R(LinkList& L, int n) {
	//initList(L);
	LNode* p;//用于开辟新的结点
	LNode* r;//用于指向表尾结点
	r = L;
	for (int i = 0; i < n; i++) {
		p = new LNode;
		cin >> p->data;
		//将新结点插入到表尾后
		
		r->next = p;
		r = p;
	}
	r->next = NULL;
}//头插法
//输出
void ShowList(LinkList L) {
	if (L == nullptr) {
		cout << "链表未初始化" << endl;
		return;
	}
	LNode* p;
	p = L->next;
	while (p) {
		cout << p->data << " ";
		p = p->next;
	}
}
//尾部插入
void insertR(LinkList& L) {
	LNode* p;
	p = new LNode;
	p->next = NULL;
	cout << "请输入在表尾插入的结点:" << endl;
	cin >> p->data;
	LNode* r;
	r = L;
	while (r->next) {//找到尾结点
		r = r->next;
	}
	r->next = p;
}
//表长
int getLength(LinkList L) {
	LNode* p = L->next;
	int i = 0;
	while (p) {
		p = p->next;
		i++;
	}
	return i;
}
//读表元
bool  GetElem(LinkList L, int i, ElemType& e) {
	//L是带头结点的单链表,读L的第i个元素,用e返回其值
	LNode* p = L->next;int  j = 1;      //指针p指向a1
	while (p && j < i) { p = p->next; j++; }  //指针p右移i-1次
	if (!p || j > i)return false;  //i非法 !p:i太大,j>i:i太小
	e = p->data;
	return true;
}   //GetElem O(n)

//删除
bool ListDelete(LinkList L, int i, ElemType& e) {
	// L是带头结点的单链表,删除ai,用参数e带回被删结点的值
	LNode* p = L;int j = 0;    //p指向头结点,j是计数器
	while (p && j < i - 1) { p = p->next; j++; }   //p指向ai-1
	if (!p || j > i - 1) return false;         // i非法
	LNode* q = p->next; e = q->data;
	p->next = q->next; free(q);                 //修改指针
	return true;
}    // ListInsert  O(n) 
//插入
bool ListInsert(LinkList& L, int i, ElemType e) {
	// L是带头结点的单链表,在ai之前插入新结点e
	LNode* p = L; int j = 0;  //p指向头结点,j是计数器
	while (p && j < i - 1) { p = p->next; j++; }//找指向ai-1的p
	if (!p || j > i - 1) return false;//i非法,i大于表长或i<1
	LNode* s = (LNode*)malloc(sizeof(LNode));
	s->data = e;
	s->next = p->next;  p->next = s;   //修改指针
	return true;
}
//删除某个元素
bool Delete(LinkList& L, ElemType e) {
	LNode* p = L->next; LNode* q = L;
	while (p && p->data!=e) {
		p = p->next;
		q = q->next;
	}
	if (p) {
		q->next = p->next;
		free(p);
		return true;
	}
	else return false;
}

//合并
void  MergeList(LinkList  La, LinkList  Lb, LinkList& Lc) {
	//将有序线性表La和Lb归并成有序线性表Lc
	int i, j;
	i = j = 1;  int k = 0;  initList(Lc); //初始化 
	int ai, bj;
	int La_len = getLength(La); int Lb_len = getLength(Lb);//求表长 
	while (i <= La_len && j <= Lb_len) { //La和Lb均非空 
		  GetElem(La, i,ai); GetElem(Lb, j,bj);//读ai和bj 
		if (ai <= bj) { ListInsert(Lc, ++k, ai); i++; }
		else { ListInsert(Lc, ++k, bj); j++; }
	}
	while (i <= La_len) { //La中剩余元素一一插入Lc
		  GetElem(La, i++, ai); ListInsert(Lc, ++k, ai);
	}
	while (j <= Lb_len) { //Lb中剩余元素一一插入Lc
		  GetElem(Lb, j++, bj); ListInsert(Lc, ++k, bj);
	}
}// MergeList

int main(){
	LinkList L = nullptr; int n; ElemType e;
	LinkList La, Lb, Lc;
int data;
do {
	cout << endl;
	cout << "\t 1 单链表的初始化" << endl;
	cout << "\t 2 单链表的输入" << endl;
	cout << "\t 3 单链表的显示" << endl;
	cout << "\t 4 单链表的表长" << endl;
	cout << "\t 5 单链表的尾部插入" << endl;
	cout << "\t 6 单链表的位置查找" << endl;
	cout << "\t 7 单链表的插入" << endl;
	cout << "\t 8 单链表的按位置删除" << endl;
	cout << "\t 9 单链表中删除某个元素" << endl;
	cout << "\t 10 两个有序表的合并" << endl;
	cout << "\t 0 退出操作" << endl;
	cin >> data;
	if (data == 1) initList(L);
	else if (data == 2) {
		cout << "请输入你要输入的n数:"; cin >> n;
		cout << "请输入链式表的数值:";
		InputList_R(L, n);

	}
	else if (data == 3) {
		cout << "表中数据:";
		ShowList(L);
	}
	else if (data == 4) {
		cout << "表长:" << getLength(L);
	}
	else if (data == 5) {
		insertR(L);
	}
	else if (data == 6) {
		cout << "你想查找的位置:";
		cin >> n;
		
		if (GetElem(L, n, e)) cout << "该元素为:" << e;
		else cout << "未找到!";
	}
	else if (data == 7) {
		cout << "你想插入的位置和元素:";
		cin >> n>>e;
		if (ListInsert(L, n, e)) {
			cout << "表内元素为:";
			ShowList(L);
		}
		else cout << "插入位置有问题";
	}
	else if (data == 8) {
		cout << "你想删除的位置:";
		cin >> n;
		
		if (ListDelete(L, n, e))
			cout << "删除的元素是:" << e;
		else cout << "输入的位置有误";
	}
	else if (data == 9) {
		cout << "请输入你想要删除的元素:";
		cin >> e;
		if (Delete(L, e)) {
			cout << "删除后的表为:";
			ShowList(L);
		}
		else cout << "未找到该元素!";
	}
	else if (data == 10) {
		initList(La);
		initList(Lb);
		initList(Lc);
		cout << "请输入你要输入的n数:"; cin >> n;
		cout << "请输入链式表的数值:";
		InputList_R(La, n);
		cout << endl;
		cout << "请输入你要输入的n数:"; cin >> n;
		cout << "请输入链式表的数值:";
		InputList_R(Lb, n);
		cout << endl;
		MergeList(La, Lb, Lc);
		cout << "合并后的表为:";
		ShowList(Lc);
	}
} while (data != 0);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值