线性表的综合应用实例

Written by Robert_Wang in Southwest University of Science And Technology.

#include<iostream>
#define Max 100
using namespace std;
typedef int ElemType;
typedef struct
{
	ElemType data[Max];
	int length;
}SqList;
typedef struct Node
{
	ElemType data;
	struct Node *next;
}LinkList;
void InitList(SqList*&L)
{
	L = new SqList;
	L->length = 0;
}
void InitList(LinkList*&L)
{
	L = new LinkList;
	L->next = NULL;
}
void ListInsert(SqList *&L, ElemType e)
{
	int i = 0, j;
	while (i < L->length && L->data[i] < e) i++;//找到插入的位置
	for (j = L->length - 1; j >= i; j--) L->data[j + 1] = L->data[j];
	L->data[i] = e;
	L->length++;
}
void ListInsert(LinkList *&L, ElemType e)
{
	LinkList * pre = L, *p;
	while (pre->next && pre->next->data < e) pre = pre->next;
	LinkList *s = new LinkList;
	s->data = e;
	s->next = pre->next;
	pre->next = s;
}
//有序表(顺序表)的归并算法
void UnionList(SqList*La, SqList*Lb, SqList *&Lc)
{
	int i, j, k;
	i = j = k = 0;
	Lc = new SqList;
	Lc->length = La->length + Lb->length;
	//将La Lb分别比较,将较小的赋给Lc
	while (i < La->length && j < Lb->length)
	{
		if (La->data[i] < Lb->data[j]) { Lc->data[k++] = La->data[i++]; }
		else { Lc->data[k++] = Lb->data[j++]; }
	}
	while (i < La->length)//将还剩的元素加进来,二者只有一个还剩有元素
	{
		Lc->data[k++] = La->data[i++];
	}
	while (j < Lb->length)
	{
		Lc->data[k++] = Lb->data[j++];
	}
}
int Median(SqList *La, SqList *Lb, SqList *&L)
{
	L = new SqList;
	int i, j, k;
	i = j = k = 0;
	//归并La,Lb
	while (i < La->length && j < Lb->length)
	{
		if(La->data[i] < Lb->data[j]) { L->data[k++] = La->data[i++]; }
		else  { L->data[k++] = Lb->data[j++]; }
	}
	while (i < La->length) { L->data[k++] = La->data[i++]; }
	while (j < Lb->length) { L->data[k++] = Lb->data[j++]; }
	L->length = k;
	return L->data[(k-1) / 2];
}
void UnionList(LinkList*La, LinkList *Lb, LinkList *&Lc)
{
	LinkList *pa = La->next, *pb = Lb->next, *r, *s;
	Lc = new LinkList;
	Lc->next = NULL;
	r = Lc;
	while (pa && pb)
	{
		if (pa->data < pb->data)
		{
			s = new LinkList;
			s->data = pa->data;
			s->next = pa->next;
			r->next = s;
			r = r->next;
			pa = pa->next;
		}
		else 
		{
			s = new LinkList;
			s->data = pb->data;
			s->next = pb->next;
			r->next = s;
			r = r->next;
		pb = pb->next;
		}
	}
	while (pa)
	{
		s = new LinkList;
		s->data = pa->data;
		s->next = pa->next;
		r->next = s;
		r = r->next;
		pa = pa->next;
	}
	while (pb)
	{
		s = new LinkList;
		s->data = pb->data;
		s->next = pb->next;
	r->next = s;
		r = r->next;
		pb = pb->next;
	}
	r->next = NULL;
}

void DispList(SqList *L)
{
	for (int i = 0; i < L->length; i++)
	{
		cout << L->data[i] << " ";
	}
	cout << endl;
}
void DispList(LinkList *L)
{
	LinkList *p = L->next;
	while (p)
	{
		cout << p->data << " ";
		p = p->next;
	}
	cout << endl;
}
//三个链表公共元素的求法
void commndoe(LinkList *&La, LinkList *Lb, LinkList*Lc)
{
	LinkList *pa = La->next, *pb = Lb->next, *pc = Lc->next, *r, *s;
	La->next = NULL;
	r = La;//新建链表,此时只含有一个头结点
	while (pa)
	{
		while (pb && pb->data < pa->data) pb = pb->next;
		while (pc && pc->data < pa->data) pc = pc->next;
		if (pb && pc && pa->data == pb->data && pa->data == pc->data)
		{
			r->next = pa;
			r = pa;
			pa = pa->next;
		}
		else
		{
			s = pa;
			pa = pa->next;
			delete pa;
		}
	}
	r->next = NULL;
}
int Listlength(SqList*L)
{
	return L->length;
}
//删除链表中相同的元素
void del(LinkList *&L)
{
	LinkList *pre = L->next, *p = L->next->next,*r;
	while (p!=NULL && pre!=NULL)
	{
		if (pre->data == p->data)
		{
			r = p->next;
			pre->next = p->next;
			delete p;
			p = r;
			
		}
		else
		{
			pre = pre->next;
			p = p->next;
		}
	}
}
//void del(LinkList *&L)
//{
//	LinkList *p = L->next, *q;
//	while (p)
//	{
//		q = p->next;
//		if (p->data == p->next->data)
//		{
//			p->next = q->next;
//			delete q;
//		}
//		else
//		{
//			p = p->next;
//		}
//	}
//}
int main()
{
	/*LinkList * L;
	InitList(L);
	int i;
	for (i =10;i>=1; i--)
	{
		ListInsert(L, i);
	}
	DispList(L);*/
	//以下为顺序表的操作
	SqList* L,*M,*N;
	InitList(L);
	InitList(M);
	InitList(N);
	ListInsert(L, 11);
	ListInsert(L, 13);
	ListInsert(L, 15);
	ListInsert(L, 17);
	ListInsert(L, 19);
	L->length = 5;
	ListInsert(M, 2);
	ListInsert(M, 4);
	ListInsert(M, 6);
	ListInsert(M, 8);
	ListInsert(M, 20);
	M->length = 5;
	//UnionList(L, M, N);
	
	cout << "N的中位数为: " << Median(L,M,N) << endl;
	cout << "N的长度为: " << Listlength(N) << endl;
	DispList(N);

	//以下为链表的操作
	/*LinkList *l1, *l2, *l3;
	InitList(l1);
	InitList(l2);
	InitList(l3);
	for (int i = 10; i >= 1; i--)
	{
		if (i % 2) ListInsert(l1, 3);
		
	}
	DispList(l1);
	cout << "l1 has been del some node which are the same!" << endl;
	del(l1);
	DispList(l1);*/
	return 0;
}

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
栈是一种具有特定操作的线性表,它遵循"先进后出"的原则。头歌c 线性表应用栈有以下几个方面。 首先,栈在函数调用和递归算法实现中起到重要作用。当一个函数被调用时,函数的局部变量和其他相关信息都被保存在栈中。随着函数的执行过程,栈会不断压入新的数据帧,当函数执行结束后再逐个出栈,恢复之前的执行状态。这种方式使得程序的执行具有一定的顺序性和层次性,方便理解和调试。 其次,栈可以用于表达式求值和后缀表达式的转换。在进行表达式求值时,通过栈的压入和弹出操作,可以按照运算符的优先级进行计算。同时,后缀表达式通过将运算符放在操作数后面的方式,也可以通过栈的弹出和压入操作轻松实现。 此外,栈还广泛应用于编程语言解析器中,用于处理代码的括号匹配、语法分析等任务。当编写一个编译器或解释器时,栈可以用来存储解析过程中的临时数据,判断代码语法的正确性。 最后,栈还可用于实现浏览器的"后退"和"前进"功能。当用户在浏览器中点击后退按钮时,浏览器通过栈结构将访问过的网页地址依次弹出,实现回退的功能。当用户点击前进按钮时,浏览器将之前弹出的地址再次压入栈中,实现前进的功能。 综上所述,栈作为一种特殊的线性表,具有一些独特的应用场景。它在函数调用、表达式求值、语法分析和浏览器导航等领域有重要应用

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江湖无为

感谢你们的鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值