链式线性表源码

链式线性表源码 (c++)

//
//Description:自定义链式线性表
//
#include <iostream>
#include <malloc.h> 
using namespace std;

typedef  int  ElemType;
typedef  int  Status;
 
//--------链式线性表定义--------
typedef struct LNode
{
	ElemType data;
	struct LNode *next;
}LNode, *LinkList;
//----------全局变量----------
LNode    *p=NULL, *q=NULL;
LNode    *s=NULL;
LNode    *pa=NULL;
LNode    *pb=NULL;
LNode    *pc=NULL;

int j=0;
static int  num=0;
//---------------创建链表-----------------------
void CreateList_L(LinkList &L, int n)
{
	####逆位序输入n个元素的值,建立###带表头结点##的单链线性表L
	L = (LinkList)malloc(sizeof(LNode));
	L->next = NULL;
	for (int i = n; i > 0; i--)
	{
		p = (LinkList)malloc(sizeof(LNode));//-----
		cout << "\n请输入第" << i << "个结点的值\t";
		cin >> (p->data);
		p->next = L->next;
		L->next = p;
	}
	cout << endl;
}

//---------链式线性表中查找第i个结点的值------------
Status GetElem_L(LinkList L, int i, ElemType &e)
{

	if (i <= 0 || i > num)
	{
		cout << "\t查找位置不合法!" << endl;
		return 0;
	}//-------------------

	p = L->next;  ///------------------
	j = 1;        ///------------------
	while (p&&j<i)
	{
		p = p->next;
		++j;
	}

	if (!p || j>i)
		return 0;
	e = p->data;
	return 1;
}
//------------------链式线性表 合并非递减有序链表---------
void MergeList_L(LinkList &La, LinkList &Lb, LinkList &Lc)
{
	//已知单链线性表La和Lb的元素按值非递减排列
	//归并La和Lb得到新的单链线表Lc,Lc的元素也按值非递减排列
	pa = La->next;
	pb = Lb->next;
	Lc = pc = La;//用La头结点作为Lc的头结点
	while (pa&&pb)
	{
		if (pa->data <= pb->data)
		{
			pc->next = pa;
			pc = pa;
			pa = pa->next;
		}
		else
		{
			pc->next = pb;
			pc = pb;
			pb = pb->next;
		}
	}
	pc->next = pa ? pa : pb;
	free(Lb);
}
//--------------------链式线性表 插入-----------------
Status ListInsert_L(LinkList &L, int i, ElemType e)
{
	if (i <= 0 || i > num + 1)
	{
		cout << "\t插入位置不合法!" << endl;
		return 0;
	}//-------------------

	p = L;
	j = 0;
	while (p&&j<i - 1)
	{
		p = p->next;
		j++;
	}
	if (!p || j>i - 1)
		return 0;
	s = (LinkList)malloc(sizeof(LNode));
	s->data = e;
	s->next = p->next;
	p->next = s;
	num++;//--------
	return 1;
}

//--------------------链式线性表 删除-----------------
Status ListDelete_L(LinkList &L, int i, ElemType &e)
{
	if (i <= 0 || i > num)
	{
		cout << "\t删除位置不合法!" << endl;
		return 0;
	}//-------------------
	p = L;
	j = 0;
	while (p->next&&j<i - 1)
	{
		p = p->next;
		j++;
	}
	if (!(p->next) || j>i - 1)
		return 0;
	q = p->next;
	p->next = q->next;
	e = q->data;
	free(q);
	num--;//--------
	return 1;
}
//--------------------链式线性表 输出-----------------
void output(LinkList &L, int n)
{
	cout << "\n\n当前各结点值为:" << endl;
	p = L->next;
	for (int i = 1; i <= n; i++)
	{
		cout << "第" << i << "个结点的值为\t" << (p->data) << endl;

		p = p->next;
	}
}
//-------------主函数---------------
void main()
{
	cout << "\n\t======================链式线性表操作===========\n";
	cout << "-------------------------初始化---------------------------" << endl;
	cout << "请输入初始时链接线性表中结点的个数" << endl;
	cin >> num;
	LinkList L;
	CreateList_L(L, num);
	output(L, num);

	cout << "--------------------------查找----------------------------" << endl;
	int i;
	cout << "请输入欲查找的结点所处的次序\t" << endl;
	cin >> i;
	ElemType s;
	GetElem_L(L, i, s);
	cout << "所查找的第" << i << "个结点的值为\t " << s;
	output(L, num);//----

	cout << "--------------------------插入----------------------------" << endl;
	cout << "请输入欲插入的结点所处的位置和相应的数值\n";
	cin >> i >> s;
	ListInsert_L(L, i, s);
	output(L, num);

	cout << "--------------------------删除-----------------------------" << endl;
	cout << "请输入欲删除的结点所处的位置\t" << endl;
	cin >> i;
	ListDelete_L(L, i, s);
	cout << "所删除的元素位置为" << i << ",其值为\t" << s;
	output(L, num);

	cout << "----------------------合并非递减有序链表--------------------" << endl;
	cout << "\n请输入初始时 *非递减* 链式线性表 La 中结点的个数" << endl;
	int num_La;
	cin >> num_La;
	LinkList La;
	CreateList_L(La, num_La);

	cout << "\n请输入初始时 *非递减* 链式线性表 Lb 中结点的个数" << endl;
	int num_Lb;
	cin >> num_Lb;
	LinkList Lb;
	CreateList_L(Lb, num_Lb);
	cout << "\n La中" << endl;
	output(La, num_La);
	cout << "Lb中" << endl;
	output(Lb, num_Lb);
	LinkList Lc;
	MergeList_L(La, Lb, Lc);
	num = num_La + num_Lb;
	cout << "\n\n合并后 *非递减* 链式线性表Lc中" << endl;
	output(Lc, num);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值