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;
}