2022-10-03 线性表

顺序表

#include<bits/stdc++.h>
using namespace std;
#define InitSize 1000
typedef struct {
	int* elem;
	int length;
}Sqlist;
//初始化
void InitList(Sqlist& L)
{
	L.length = 0;
	L.elem = new int[InitSize];
}
//判断是否为空
bool Empty(Sqlist& L)
{
	if (L.length == 0)
		return true;
	else return false;
}

//插入
bool ListInsert(Sqlist& L, int i, int e)
{
	if (i<1 || i>L.length + 1) return false;
	if (L.length >= InitSize)     return false;
	for (int j = L.length; j >= i; j--)
	{
		L.elem[j] = L.elem[j - 1];
	}
	L.elem[i - 1] = e;
	L.length++;
	return true;
}
//获取位置
int LocateElem(Sqlist L, int e)
{
	for (int i = 0; i < L.length; i++)
	{
		if (L.elem[i] == e)
			return i + 1;
	}
}
//删除
bool ListDelete(Sqlist& L, int i, int& e)
{
	if (i<1 || i>L.length) return false;
	e = L.elem[i - 1];
	for (int j = i; j <= L.length; j++)
	{
		L.elem[j - 1] = L.elem[j];
	}
	L.length--;
	return true;
}
//输出
void printList(Sqlist L)
{
	for (int i = 0; i < L.length; i++)
	{
		cout << L.elem[i] << ' ';
	}
}
int main()
{
	//1.初始化一个顺序表SL。
	Sqlist sl;
	InitList(sl);
	//2.判断SL是否是空。
	if (Empty(sl)) cout << "yes" << endl;
	else cout << "no" << endl;
	//3.将值2, 5, 16, 55, 8依次存入SL中。
	int an[6] = { 0,2,5,16,55,8 };
	for (int i = 1; i <= 5; i++)
	{
		ListInsert(sl, i, an[i]);
	}
	//4.输出SL中元素的个数。
	cout << "SL中元素的个数:" << sl.length << endl;;
	//5.获取SL中元素5的位置。
	cout << "SL中元素5的位置" << LocateElem(sl, 5) << endl;
	//6.在SL首端插入值为25 的数据。
	ListInsert(sl, 1, 25);
	//7.在元素5之后插入元素11。
	int i = LocateElem(sl, 5);
	ListInsert(sl, i + 1, 11);
	//8.删除值为16的元素。
	int j = LocateElem(sl, 16);
	int e;
	ListDelete(sl, j, e);
	//9.将SL中所有元素依次输出。
	printList(sl);

}

单链表(有头节点)

#include<iostream>
using namespace std;

//创建单链表节点类型
typedef struct LNode {
	int data;//数据域
	struct LNode* next;//指针域
}LNode, * LinkList;

//头插法创建单链表
LinkList List_HeadInsert(LinkList& L) {
	LNode* s;
	L = (LinkList)malloc(sizeof(LNode));//创建头节点
	L->next = NULL;//初始化空链表
	//创建1-10的数据元素存储在链表中
	for (int i = 1; i <= 10; i++)
	{
		s = (LNode*)malloc(sizeof(LNode));//创建新节点
		s->data = i;
		s->next = L->next;
		L->next = s;//先将新节点的指针域指向第一个数据元素;再将头节点的指针域指向新节点。
	}
	return L;
}

//尾插法创建单链表
LinkList List_TailINsert(LinkList& L)
{
	LNode* s, * r;//r为表尾指针
	L = (LinkList)malloc(sizeof(LNode));//创建头节点
	r = L;//初始化空链表
	//创建1-10的数据元素存储在链表中
	for (int i = 1; i <= 10; i++)
	{
		s = (LNode*)malloc(sizeof(LNode));//创建新节点
		s->data = i;
		r->next = s;
		r = s;//尾节点的指针域指向新节点,然后将新节点置为尾节点
	}
	r->next = NULL;
	return L;
}

//按序号查找节点值
LNode* GetElem(LinkList L, int i)//链表L中查找第i个节点
{
	if (i == 0) return L;
	if (i < 1)return NULL;
	LNode* m = L->next;//第一个指针节点赋给m.
	int j = 1;
	while (m != NULL && j++ < i)
	{
		m = m->next;
	}
	return m;
}

//按值查找节点
LNode* LocateElem(LinkList L, int i)
{
	LNode* n;
	n = L->next;
	while (n != NULL && n->data != i)
	{
		n = n->next;
	}
	return n;
}

//插入节点
void charu(LinkList L, int i, LNode* x)//值为x的新节点插入到i位置
{
	LNode* t = GetElem(L, i - 1);
	x->next = t->next;
	t->next = x;
}

//打印单链表
void dayin(LinkList L)
{
	LNode* p = L->next;
	while (p != NULL)
	{

		cout << p->data << " ";
		p = p->next;
	}
}

//删除节点
void shanchu(LinkList L, int i)//第i个节点删除
{
	LNode* t = GetElem(L, i - 1);
	LNode* T = GetElem(L, i);
	t->next = T->next;
}

int main()
{
	//头插法测试
	LinkList L;
	List_HeadInsert(L);
	LNode* p = L->next;
	cout << "头插法测试" << endl;
	cout << "头插法创建单链表" << endl;
	dayin(L);
	cout << endl << endl;

	//尾插法测试
	LinkList Q;
	List_TailINsert(Q);
	LNode* q = Q->next;
	cout << "尾插法测试" << endl;
	cout << "尾插法创建单链表" << endl;
	dayin(Q);
	cout << endl << endl;

	//按序号查找节点值测试
	LNode* ans = GetElem(L, 3);
	cout << "按序号查找节点值测试" << endl;
	cout << "第三个节点的值为" << ans->data << endl << endl;

	//按值查找节点测试
	LNode* ans1 = LocateElem(L, 8);
	cout << "按值查找节点测试" << endl;
	cout << "值为8的节点的内存" << ans1->next;
	cout << endl << endl;

	//插入测试
	LNode* x;
	x = (LNode*)malloc(sizeof(LNode));
		x->data = 90;
	x->next = NULL;
	cout << "插入90在位置5" << endl;
	charu(L, 5, x);
	dayin(L);
	cout << endl << endl;

	//删除节点测试
	shanchu(L, 7);
	cout << "删除节点7" << endl;
	dayin(L);
	cout << endl << endl;
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值