2.数据结构--线性表之链表实现

#include<iostream>
using namespace std;

#define ERROR 0
#define OK 1
typedef int Status;
typedef int ElemType;

typedef struct LNode {
	int data; //结点的数据域
	struct LNode *next; //结点的指针域
} LNode, *LinkList; //LinkList为指向结构体LNode的指针类型

Status InitList_L(LinkList &L)
{
	L = new LNode;
	L->next = NULL;
	return OK;
}

Status DestroyList_L(LinkList &L)
{
	LinkList p;
	while (L)
	{
		p = L;
		L = L->next;
		delete p;
	}
	return OK;
}

Status ClearList_L(LinkList &L)
{
	// 将L重置为空表 
	LinkList p = L->next;   //p指向第一个结点
	while (p)       //没到表尾 
	{
		LinkList q = p->next; 
		delete p;     
		p = q;
	}
	L->next = NULL;   //头结点指针域为空 
	return OK;
}

int ListLength_L(LinkList L)
{
	//返回L中数据元素个数
	LinkList p;
	p = L->next;  //p指向第一个结点
	int i = 0;
	while (p)
	{//遍历单链表,统计结点数
		i++;
		p = p->next;
	}
	return i;
}

int ListEmpty_L(LinkList L)
{
	//若L为空表,则返回1,否则返回0 
	if (L->next)   //非空 
		return 0;
	else
		return 1;
}

Status GetElem_L(LinkList L, int i, ElemType &e)
{
	LinkList p = L->next; 
	int j = 1; //初始化
	while (p && j<i){	//向后扫描,直到p指向第i个元素或p为空 
		p = p->next; 
		++j;
	}
	if (!p || j>i)return ERROR; //第i个元素不存在 
	e = p->data; //取第i个元素 
	return OK;
}

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

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

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

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

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

void PrintOut(LinkList L)
{
	LinkList P = L->next;
	while (P)
	{
		cout << P->data << " ";
		P = P->next;
	}
	cout << endl;
}

/************************************************************************/
/* 两个非递减的有序链表合并为一个非递减的有序链表,表中允许有重复数字      */
/************************************************************************/
void MergeList_1(LinkList &La, LinkList &Lb, LinkList &Lc) 
{
	LinkList pa = La->next;
	LinkList pb = Lb->next;
	LinkList pc = Lc = 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;    //插入剩余段  
	delete Lb;             //释放Lb的头结点
}

/************************************************************************/
/* 两个非递减的有序链表合并为一个非递减的有序链表,表中不允许有重复数字      */
/************************************************************************/
void MergeList_2(LinkList &La, LinkList &Lb, LinkList &Lc)  //归并元素,不允许有重复的元素
{
	LinkList pa = La->next;
	LinkList pb = Lb->next;
	LinkList pc = Lc = La;             //用La的头结点作为Lc的头结点 
	while (pa && pb)
	{
		if (pa->data < pb->data)
		{
			pc->next = pa;
			pc = pa;
			pa = pa->next;
		}
		else if (pa->data == pb->data)
		{
			pc->next = pa;
			pc = pa;
			pa = pa->next;

			LinkList Tmp = pb; //删除LB中和LA重复的元素
			pb = pb->next;
			delete Tmp;
		}
		else
		{
			pc->next = pb;
			pc = pb;
			pb = pb->next;
		}
	}
	pc->next = pa ? pa : pb;    //插入剩余段  
	delete Lb;             //释放Lb的头结点
}

/************************************************************************/
/* 两个非递减的有序链表合并为一个非递增的有序链表,表中允许有重复数字      */
/************************************************************************/
void MergeList_3(LinkList &La, LinkList &Lb, LinkList &Lc)
{
	LinkList pa = La->next;
	LinkList pb = Lb->next;
	LinkList pc = Lc = La;             //用La的头结点作为Lc的头结点 
	Lc->next = NULL;

	while (pa && pb)
	{
		if (pa->data <= pb->data)
		{
			LinkList pa_next = pa->next;
			pa->next = Lc->next;
			Lc->next = pa;
			pa = pa_next;
		}
		else
		{
			LinkList pb_next = pb->next;
			pb->next = Lc->next;
			Lc->next = pb;
			pb = pb_next;
		}
	}
	
	//插入剩余段
	while (pa)
	{
		LinkList pa_next = pa->next;
		pa->next = Lc->next;
		Lc->next = pa;
		pa = pa_next;
	}

	while (pb)
	{
		LinkList pb_next = pb->next;
		pb->next = Lc->next;
		Lc->next = pb;
		pb = pb_next;
	}
	delete Lb;             //释放Lb的头结点
}



int main()
{
	LinkList L1,L2;
	InitList_L(L1);
	ListInsert_L(L1, 1, 3);
	ListInsert_L(L1, 2, 4);
	ListInsert_L(L1, 3, 8);
	PrintOut(L1);

	InitList_L(L2);
	ListInsert_L(L2, 1, 3);
	ListInsert_L(L2, 2, 4);
	ListInsert_L(L2, 3, 8);
	PrintOut(L2);

	LinkList L3;
	MergeList_3(L1, L2, L3);
	PrintOut(L3);
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值