大话数据结构(代码实现)

2.算法

2.3 两种算法的比较

求1+2+3+…+100的结果

方法一

#include<iostream>
using namespace std;

int main()
{

	int sum{};
	for (int i = 1; i <= 100; i++)
	{
		sum = sum + i;
	}
	cout << sum << endl;

	system("pause");
	return 0;
}


方法二

#include<iostream>
using namespace std;

int main()
{

	int sum{};
	int n = 100;
	sum = (1 + n) * n / 2;
	cout << sum << endl;

	system("pause");
	return 0;
}


3. 线性表

3.4 线性表的顺序存储结构

#include<iostream>
using namespace std;
#define MAXSIZE 20

struct SqList
{
	int data[MAXSIZE];		// 数组存储数据元素,最大值为MAXSIZE
	int length;				// 线性表当前长度
};

// 遍历当前线性表
void ListShow(SqList L)
{
	for (int i = 0; i < L.length; i++)
	{
		cout << "第" << i+1 << "个元素是:" << L.data[i] << endl;
	}
}

// 获得元素操作
bool getElem(SqList L, int i, int* val)
{
	if (L.length == 0 || i<1 || i>L.length)
	{
		return false;
	}
	else
	{
		*val = L.data[i - 1];
		return true;
	}
}

// 插入操作
bool ListInsert(SqList* L, int i, int elem)
{
	int k;
	if (L->length == MAXSIZE)			// 顺序线性表已满
	{
		return false;
	}
	if (i < 1 || i > L->length + 1)		// 当i不在范围时
	{
		return false;
	}
	if (i <= L->length)					// 若插入的数据位置不在表尾
	{
		for (k = L->length - 1; k >= i - 1; k--)
		{
			L->data[k + 1] = L->data[k];
		}
	}
	L->data[i - 1] = elem;
	L->length++;
	return true;
}

// 删除操作
bool ListDelete(SqList *L, int i, int* val)
{
	int k;
	if (i<1 || i>L->length)
	{
		return false;
	}
	*val = L->data[i - 1];
	if (i < L->length)
	{
		for (k = i ; k < L->length; k++)
		{
			L->data[k - 1] = L->data[k];
		}
	}
	L->length--;
	return true;
}

int main()
{
	SqList L;
	L.data[0] = 10;
	L.data[1] = 20;
	L.data[2] = 30;
	L.data[3] = 40;
	L.data[4] = 50;
	L.data[5] = 60;
	L.length = 6;



	// 获取元素测试
	int val;
	if (getElem(L, 2, &val))
	{
		cout << "获取元素成功,元素是 " << val << endl;
	}
	else
	{
		cout << "获取元素失败!" << endl;
	}
	cout << endl;
	

	// 插入操作测试
	cout << "插入前线性表元素是:" << endl;
	ListShow(L);

	if (ListInsert(&L, 2, 4))
	{
		cout << "插入元素成功"<< endl;
	}
	else
	{
		cout << "插入元素失败!" << endl;
	}

	cout << "插入后线性表元素是:" << endl;
	ListShow(L);
	cout << endl;


	// 删除操作测试
	cout << "删除前线性表元素是:" << endl;
	ListShow(L);

	if (ListDelete(&L, 2, &val))
	{
		cout << "删除元素成功" << endl;
	}
	else
	{
		cout << "删除元素失败!" << endl;
	}

	cout << "删除后线性表元素是:" << endl;
	ListShow(L);
	cout << endl;



	system("pause");
	return 0;
}


3.6 线性表的链式存储结构

#include<iostream>
using namespace std;
#include<stdlib.h>

struct Node
{
	int data;
	Node* next;
};


void CreateListHead(Node * pHead, int n);
void CreateListTail(Node* pHead, int n);
void traverseList(Node* pHead);
bool getElem(Node* pHead, int i, int* val);
bool ListInsert(Node* pHead, int i, int val);
bool ListDelete(Node* pHead, int i, int* val);
bool ClearList(Node* pHead);


int main()
{
	Node* pHead = new(Node);
	pHead->next = NULL;
	int val;


	// 测试创建链表
	CreateListHead(pHead, 4);
	cout << endl;

	//CreateListTail(pHead, 4);
	//cout << endl;

	// 测试遍历链表
	traverseList(pHead);
	cout << endl;

	// 测试获取第i个元素的操作
	if (getElem(pHead, 2, &val))
	{
		cout << "获取成功,元素是 " << val << endl;
	}
	else
	{
		cout << "输入有误,获取失败!" << endl;
	}
	cout << endl;

	// 测试单链表的插入
	if (ListInsert(pHead, 4, 8))
	{
		cout << "插入成功" << endl;
		traverseList(pHead);
	}
	else
	{
		cout << "插入失败" << endl;
	}
	cout << endl;

	// 测试单链表的删除
	if (ListDelete(pHead, 2, &val))
	{
		cout << "删除成功,元素是 " << val << endl;
	}
	else
	{
		cout << "删除有误!" << endl;
	}
	traverseList(pHead);
	cout << endl;

	// 测试单链表的整表删除
	ClearList(pHead);
	traverseList(pHead);
	cout << endl;


	system("pause");
	return 0;
}

// 创建链表(头插法)
void CreateListHead(Node* pHead, int n)
{
	Node* p;
	int i;
	srand(time(0));
	for (i = 0; i < n; i++)
	{
		p = new(Node);
		p->data = rand() % 100 + 1;
		cout << p->data << endl;		// 显示插入顺序
		p->next = pHead->next;
		pHead->next = p;
	}
}

// 创建链表(尾插法)
void CreateListTail(Node* pHead, int n)
{
	Node* p;
	Node* pTail;
	pTail = pHead;
	int i;
	srand(time(0));
	for (i = 0; i < n; i++)
	{
		p = new(Node);
		p->data = rand() % 100 + 1;
		cout << p->data << endl;		// 显示插入顺序
		pTail->next = p;
		pTail = p;
	}
	pTail->next = NULL;
}



// 遍历链表
void traverseList(Node* pHead)
{
	if (pHead->next == NULL)
	{
		cout << "链表为空!" << endl;
		return;
	}
	Node* p = pHead->next;

	cout << "遍历的链表内容如下:" << endl;
	while (p != NULL)
	{
		cout << p->data << "\t";
		p = p->next;
	}
	cout << endl;
	return;
}

// 获取第i个元素的操作
bool getElem(Node* pHead, int i, int* val)
{
	int j;
	Node* p;
	p = pHead;
	j = 1;
	while (p && j < i)
	{
		p = p->next;
		j++;
	}
	if (!p || j > i)
	{
		return false;
	}
	*val = p->next->data;
	return true;
}

// 单链表的插入
bool ListInsert(Node* pHead, int i, int val)
{
	// 在第i个位置前插入元素
	int j = 1;
	Node* p;
	p = pHead;
	while (p && j < i)
	{
		p = p->next;
		j++;
	}
	if (!p || j > i)
	{
		return false;
	}
	Node* s = new(Node);
	s->data = val;
	s->next = p->next;
	p->next = s;
	return true;
}

// 单链表的删除
bool ListDelete(Node* pHead, int i, int* val)
{
	int j;
	Node* p;
	Node* q;
	p = pHead;
	j = 1;
	while (p && j < i)
	{
		p = p->next;
		j++;
	}
	if (!p || j > i)
	{
		return false;
	}

	q = p->next;
	p->next = q->next;
	*val = q->data;
	delete q;
	return true;
}

// 单链表的整表删除
bool ClearList(Node* pHead)
{
	Node* p;
	Node* q;
	p = pHead->next;
	while (p)
	{
		q = p->next;
		free(p);
		p = q;
	}
	pHead->next = NULL;
	return true;
}
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值