ps:自己写的方便复习
目录
一、顺序表(数组)
1.顺序表的初始化
//顺序表类定义
class SeqList {
private:
int *list; //元素数组
int maxsize; //顺序表最大长度
int size; //顺序表实际长度
public:
~SeqList(); //析构函数
//顺序表其他操作
SeqList(int s); //构造函数,动态创建顺序表,设置顺序表最大长度
int Insert(int item, int i);//插入一个元素
int DEL(int i); //删除一个元素
int get_i(int i); //返回第i位置元素
int fine_d(int d); //查找元素d所在的位置
void print(); //打印顺序表所有数据
};
2.构造函数+初始赋值
SeqList::SeqList(int s){
list=new list[100];
maxsize=100;
size=s;
for(int i=0;i<size;i++){
int x;
cin>>x;
list[i]=x;
}
}
3.插入(item为实际的位置,i为插入的数值),O(n)
int SeqList::Insert(int item, int i) {
if (item < 1 || item > size + 1 || size == maxsize)
return ERROR;
for (int j = size - 1; j >= item - 1; j--) {
list[j + 1] = list[j];
}
list[item - 1] = i;
size++;
return OK;
}
4.删除第i个位置的元素O(n)
int SeqList::DEL(int i) {
if (i < 1 || i > size)
return ERROR;
for (int j = i; j < size; j++)
list[j - 1] = list[j];
size--;
return OK;
}
5.查找第i个位置的元素值 O(1)
int SeqList::get_i(int i) {
if (i < 1 || i > size)
return ERROR;
return list[i - 1];
}
6.查找元素所在位置
int SeqList::find_(int d){
for(int i=0;i<size;i++){
if(list[i]==d)
return i;
}
return ERROR;
}
7.销毁表
SeqList::~SeqList() //析构函数
{ delete []list; }
二、链表
1.结点类的定义
struct Node {
int data;
Node* next=nullptr;
};
2.链表类的定义
class LinkList {
//带头结点的单链表
private:
Node* head; //头结点
int size; //表长
public:
LinkList(); //构造函数,创建头结点
~LinkList(); //析构函数,逐个结点回收
int LL_insert(int item, int i); //第i位置插入元素
int LL_del(int i); //删除第i位置的元素
int LL_get(int i); //获取位置i的元素的数值
void LL_print(); //打印单链表所有数据
};
3.构造函数 创建头结点
LinkList::LinkList():
{ head = new Node(); }
4.析构函数
LinkList::~LinkList() //要逐个结点回收
{ Node*p, *q;
p=head->next;
while (p != NULL) {
q=p; p=p->next;
delete q;
}
size = 0;
delete head;
}
5.第i位置插入元素
int LinkList::LL_insert(int item, int i) {
Node *p=head, *s=new Node();
int j = 0;
while (p && j < i - 1) { //p指向第i-1元素
p = p->next ;
j++;
}
if (!p || j > i - 1)
return ERROR;
s->data = item;
s->next = p->next;
p->next = s;
return OK;
}
6.删除第i位置
int LinkList::LL_del(int i) {
Node *p=head,*q=new Node();
int j = 0;
while (p->next && j < i - 1) {
p = p->next ;
j++;
}
if (!(p->next) || j > i - 1)
return ERROR;
q = p->next;
p->next = q->next;
delete q;
q = NULL;
return OK;
}
5.6中插入和删除操作的时间复杂度都是O(n),都是由于要先查找到该位置。
头插法的时间复杂度则是O(1)
7. 输出单链表的所有数据(不含尾空格)
void LinkList::LL_print() {
Node* p=head->next ;
while (p) {
if (p->next) {
cout << p->data << " ";
} else
cout << p->data;
p = p->next ;
}
cout << endl;
}