DS 线性表(顺序表+单链表的基本操作)

ps:自己写的方便复习

目录

一、顺序表(数组)

1.顺序表的初始化

 2.构造函数+初始赋值

3.插入(item为实际的位置,i为插入的数值),O(n)

4.删除第i个位置的元素O(n)

5.查找第i个位置的元素值 O(1)

6.查找元素所在位置

7.销毁表

二、链表

1.结点类的定义

2.链表类的定义

3.构造函数 创建头结点

4.析构函数

5.第i位置插入元素

6.删除第i位置

7. 输出单链表的所有数据(不含尾空格)

一、顺序表(数组)

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值