顺序表
#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;
}