线性表的链式表示

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<stdlib.h>
#include<string.h>

typedef int ElemType;
typedef int Status;

typedef struct Lnode {
	ElemType data;
	struct Lnode* next;
}Lnode, * LinkList;

Status InitList(LinkList& L) {
	L = new Lnode;
	L->next = NULL;

	return 1;
}

//判断是否为空

Status IsEmpty(LinkList L) {
	if (L->next)
	{
		return 0;
	}
	else
		return 1;
}

//销毁

Status DestroyList(LinkList& L) {
	LinkList p;
	while (L != NULL)
	{
		p = L;
		L = L->next;
		delete p;
	}
	return 1;
}


//清空
Status ClearList(LinkList& L) {
	LinkList p;
	p = L->next;
	LinkList q;
	q = p->next;

	while (p != NULL)
	{
		delete p;
		p = q;
		q = q->next;

	}

	L->next = NULL;
	return 1;
}

//求链表表长

int LengthList(LinkList& L) {
	LinkList p;
	p = L->next;
	int i = 0;
	while (p != NULL)
	{
		i++;
		p = p->next;
	}
	return i;
}



//取值
int GetElem(LinkList L, int i, ElemType& e) {
	LinkList p;
	p = L->next;
	int j = 1;
	while (p != NULL && j < i)
	{
		p = p->next;
		j++;
	}
	if (!p || j > i)
	{
		return 0;
	}
	e = p->data;
	return 1;
}

//查找
Lnode* LocateElem(LinkList L, ElemType e) {
	LinkList p;
	p = L->next;
	while (p != NULL && p->data != e)
	{
		p = p->next;
	}

	return p;
}

//插入
Status InsertList(LinkList& L, int i, ElemType e) {
	LinkList p;
	p = L->next;
	int j = 1;
	while (p != NULL && j < i - 1)//寻找第i-1个节点
	{
		j++;
		p = p->next;

	}
	if (p == NULL || j > i - 1)
	{
		return 0;
	}
	Lnode* s = new Lnode;
	s->data = e;
	s->next = p->next;
	p->next = s;

	return 1;
}

//删除
Status DeleteList(LinkList& L, int i, ElemType& e) {
	LinkList p;
	p = L->next;
	int j = 1;
	while (p != NULL && j < i - 1)
	{
		j++;
		p = p->next;

	}
	if (p == NULL || j > i - 1)
	{
		return 0;
	}
	LinkList q;
	q = p->next;
	p->next = q->next;
	e = q->data;
	delete q;

	return 1;

}



//头插法建立链表
void CreateList1(LinkList& L, int n) {
	L = new Lnode;
	L->next = NULL;
	for (int i = 0; i < n; i++)
	{
		LinkList p;
		p = new Lnode;
		p->next = L->next;
		L->next = p;
	}
}

//尾插法建立链表
void CreateList2(LinkList& L, int n) {
	L = new Lnode;
	L->next = NULL;
	LinkList r;
	r = L;
	for (int i = 0; i < n; i++)
	{
		LinkList p = new Lnode;
		scanf("%d", &p->data);
		p->next = NULL;
		r->next = p;
		r = p;
	}
}

//带尾指针的循环链表的合并
LinkList Connect(LinkList Ta, LinkList Tb) {
	LinkList p;
	p = Ta->next;
	Ta->next = Tb->next->next;
	delete Tb->next;
	Tb->next = p;
	return Tb;
}


//双向链表定义
typedef struct DuLNode {
	ElemType data;
	struct DuLNode* prior, * next;
}DuLNode, * DuLinkList;

//双向链表中插入新节点
void ListInsert_Du(DuLinkList& L, int i, ElemType e) {
	DuLinkList p;
	p = L->next->next;
	int j = 1;
	while (p != NULL && j < i)
	{
		j++;
		p = p->next;
	}
	if (p == NULL)
	{
		exit(-1);
	}
	DuLinkList s = new DuLNode;
	s->prior = p->prior;
	p->prior->next = s;
	p->prior = s;
	s->next = p;

}

//删除

void DeleteDuList(DuLinkList& L, int i, ElemType& e) {
	DuLinkList p;
	p = L->next->next;
	int j = 1;
	while (p != NULL && j < i)
	{
		j++;
		p = p->next;
	}
	if (p == NULL)
	{
		exit(-1);
	}
	e = p->data;
	p->prior->next = p->next;
	p->next->prior = p->prior;
	delete p;


}


//线性表的合并 La:7,5,3,11   Lb:2 6 3  La和Lb分别表示两个集合A和集合B,先要求一个新的集合A∪B
// 合并后:La:7 5 3 11 2 6

void merge(LinkList& La, LinkList& Lb) {
	int La_length = LengthList(La);
	int Lb_length = LengthList(Lb);
	for (int i = 1; i <= Lb_length; i++)
	{
		ElemType e;
		GetElem(Lb, i, e);
		if (LocateElem(La, e) == NULL)
		{
			//printf("yes");
			InsertList(La, ++La_length, e);

		}
	}

}

//输出链表中的每一个数据
void output(LinkList L) {
	int length = LengthList(L);
	LinkList p = L->next;

	for (int i = 0; i < length; i++)
	{
		printf("%d ", p->data);
		p = p->next;
	}

}
//有序表的合并
void merge_list(LinkList& LA, LinkList& LB, LinkList& LC) {
	LinkList pa,  pb,  pc;
	pa = LA->next;
	pb = LB->next;
	pc = LC = LA;
	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;
	}

}


int main() {
	//线性表的合并
	LinkList La, Lb;
	CreateList2(La, 4);
	CreateList2(Lb, 3);
	//output(La);
	//output(Lb);
	//int a = LengthList(La);

	//ElemType e;
	//GetElem(La, 2, e);
	//printf("%d\n%d\n",a, e);



	merge(La, Lb);

	//int a = LengthList(La);
	//printf("%d\n", a);

	output(La);
	//end

	//有序表的合并



	return 0;
}

getelem函数中的i是数据在链表中的位置不需要减一,如果for循环中用到getelem函数要注意循环变量应从1开始(合并线性表时踩的坑)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
线性表是一种常见的数据结构,它包含了一组有序的元素,元素之间具有前驱和后继关系。线性表链式表示是其中一种实现方式。 线性表链式表示通过使用节点和指针来表示表中元素之间的关系。具体来说,每个节点中都包含了一个元素和一个指向下一个节点的指针。通过不断地遍历指针,就可以顺着链表找到表中的所有元素。 链式表示的优点是可以动态地插入和删除元素,而不需要移动其他元素。这是因为链表中的节点通过指针相互连接,可以在任意位置插入和删除元素。同时,链式表示可以节省内存空间,因为节点不需要连续的存储空间,可以灵活地分配内存。 实现链式表示的方式是使用结构体来定义节点和指针。节点结构体中包含了一个元素和一个指向下一个节点的指针。使用指针的方式可以实现链表节点之间的相互连接。 在C语言中,可以通过定义一个节点结构体来表示链表的节点,然后使用指针指向链表的头节点。通过遍历指针,可以遍历整个链表,并对链表进行插入、删除等操作。 总之,线性表链式表示通过节点和指针的方式来实现表中元素之间的关系。链式表示可以动态地插入和删除元素,并且节省内存空间。在C语言中,可以通过定义节点结构体和指针来实现链式表示,实现链表的各种操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

湿物男

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值