线性表(List)

定义: 由同数据元素构成有序数列的线性结构。 1.线性表元素的个数称为线性表的长度 2.线性表中没有元素时,称为空表 3.表起始位置称表头,表结束位置称作表尾

线性表的顺序表示

指用一组地址连续的存储单元依次储线性表的数据元素。(利用数组的连续存储空间顺序存放线性表各元素)

###主要实现操作

先回忆一下C语言中的一个函数的用法--malloc 屏幕截图 20220908 145541.jpg 参考链接

初始化

建立空的顺序表 1.先申请一个结构,空间 2.将指针指向Last并赋值为-1 3.返回指针

查找

1.需要一个线性表,和线性表结构指针 2.用一个循环来一一遍历,比较值是否相等,找到以后返回储存位置,没有找到返回-1.

插入

注意:先移动,再插入 1.判断表有没有满还有插入位置的合法性(即申请空间最大值【数组大小】和表的长度范围内) 2.将i后面的的元素倒序向后移动,插入新元素

删除

将i之后的全部元素往前挪动 1.检查删除位置的合法性(有没有在表的长度范围内) 2.将i之后的数从左往右顺序向前移动

线性表的链式存储

不要求逻辑上相邻的两个元素物理上也相邻;通过“链”建立其数据元素之间的逻辑关系 即删除,插入不需要移动数据元素,只需要修改“链”

链表的每一个节点都是一个结构

class ListNode//链表节点类定义
class ListNode//链表节点类定义
{
public:
	int data;//代表节点所对应的数据
	ListNode* next;//下一个节点的位置next指针
	ListNode() { next = NULL; }
};

主要实现操作

求表长

链表由于不像顺序表一样类似于数组,我们不清楚表长为多少,我们只知道链表的头指针。 1.设一个临时指针P指向链表的头 2.然后用一个循环来遍历链表,每遍历一个表长加一。 3.返回长度

查找

在数组里面的查找指定位置的元素是很方便的,直接返回就可以了,但是在链表里面需要我们遍历。 1.设一个临时指针P指向链表的头 2.设i=1(P指向第一个元素)来表示P指向的是第几个元素。 3.使用循环(表不空,i<k(所要找的位置元素))

插入

1.先构造一个新节点,用s指向; 2.再找到链表的第i-1个节点,用P指向; 3.然后修改指针,插入节点(将新节点插在P后面)

P->next=s;
s->next=p->next;

删除

1.找到链表的第i-1个节点,用P指向; 2.再用S指针指向要被删除的节点(P的下一个节点) 3.然后修改指针删除S所指向的节点

s=p->next;
p->next=s->next;
delete s;

习题练习

DS顺序表--类实现(创建、插入、删除、查找)

屏幕截图 20220908 163738.jpg

屏幕截图 20220908 163752.jpg

//A. DS顺序表--类实现

#include <iostream>
using namespace std;

#define ok 0;
#define error -1;

//顺序表类定义
class SeqList
{
private:
	int* list;//元素数组
	int maxsize;//顺序表最大长度
	int size;//顺序表实际长度
public:
	SeqList();//构造函数
	~SeqList();//析构函数
	int list_size(int a);//获取顺序表实际长度
	int list_insert(int i, int item);//插入一个元素,参数是插入的数值和位置
	int list_del(int i);//删除一个元素,参数是删除的位置
	int list_get(int i);//获取一个元素,参数是获取的位置
	void list_display();//输出
	
};
SeqList::SeqList()
{
	maxsize = 1000;
	size = 0;
	list = new int[maxsize];
}
SeqList::~SeqList()
{
	delete[]list; //回收空间
}

int SeqList::list_size(int a)
{
	 list[size]=a;
	size++;
	return size;
}
int SeqList::list_insert(int i,int item)
{
	if (i<0 || i>size+1)
	{
		cout << "error" << endl;
		return 0;
	}
	else
	{
		for (int j = size; j > i-1 ; j--)
		{
			list[j] = list[j - 1];
		}
		list[i - 1] = item;
		size++;
		list_display();
		return 0;
	}
}
int SeqList::list_del(int i)
{
	if (i <= 0 || i > size)
	{
		cout << "error" << endl;
		return 0;
	}
	else
	{
		for (int j = i - 1; j < size-1; j++)
		{
			list[j] = list[j + 1];
		}
		size--;
		list_display();
		
	}
	return 0;
}
int SeqList::list_get(int i)
{
	if (i > 0 && i <= size)
	{
		cout << list[i - 1] << endl;
		return list[i - 1];
	}
	else
	{
		cout << "error" << endl;
		return 0;
	}
}
void SeqList::list_display()
{
	cout << size << " ";
		for (int i = 0; i < size; i++)
		{
			cout << list[i] << " ";
	}
		cout << endl;
}
int main()
{
	int n,a;
	cin >> n;
	SeqList S;
	for (int j = 0; j < n; j++)
	{
		cin >> a;
		S.list_size(a);
	}
	S.list_display();
	int i, item;
	cin >> i >> item;
	S.list_insert(i, item);

	cin >> i >> item;
	S.list_insert(i, item);

	cin >> i;
	S.list_del(i);

	cin >> i;
	S.list_del(i);

	cin >> i;
	S.list_get(i);

	cin >> i;
	S.list_get(i);
	return 0;
}

屏幕截图 20220908 191220.jpg 屏幕截图 20220908 203923.jpg

DS顺序表--连续操作

屏幕截图 20220908 191456.jpg

// DS顺序表--连续操作


#include <iostream>
using namespace std;

#define ok 0;
#define error -1;

//顺序表类定义
class SeqList
{
private:
	int* list;//元素数组
	int maxsize;//顺序表最大长度
	int size;//顺序表实际长度
public:
	SeqList();//构造函数
	~SeqList();//析构函数
	int list_size(int a);//获取顺序表实际长度
	int list_insert(int i, int n,int item[]);//插入一个元素,参数是插入的数值和位置
	int list_del(int i,int n);//删除一个元素,参数是删除的位置
	void list_display();//输出

};
SeqList::SeqList()
{
	maxsize = 1000;
	size = 0;
	list = new int[maxsize];
}
SeqList::~SeqList()
{
	delete[]list; //回收空间
}

int SeqList::list_size(int a)
{
	list[size] = a;
	size++;
	return size;
}
int SeqList::list_insert(int i, int n,int item[])
{
	if (i<1 || i>size + 1||i+n>maxsize)
	{
		//cout << "error" << endl;
		return 0;
	}
	else
	{
		for (int j = size -1; j >= i - 1; j--)
		{
			list[j+n] = list[j ];
		}
		for (int j = i - 1; j < i + n-1; j++)
		{
			list[j] = item[j - i + 1];
		}
		size+=n;
		list_display();
		return 0;
	}
}
int SeqList::list_del(int i,int n)
{
	if (i <1|| i+n-1 > size||i>size)
	{
		//cout << "error" << endl;
		return 0;
	}
	else
	{
		for (int j = i - 1; j <size-n; j++)
		{
			list[j] = list[j +n];
		}
		size-=n;
		list_display();
		return 0;
	}
}

void SeqList::list_display()
{
	cout << size << " ";
	for (int i = 0; i < size; i++)
	{
		cout << list[i] << " ";
	}
	cout << endl;
}
int main()
{
	int n, a;
	cin >> n;
	SeqList S;
	for (int j = 0; j < n; j++)
	{
		cin >> a;
		S.list_size(a);
	}
	S.list_display();
	int i, f;
	cin >> i >> f;
	int* item = new int[f];
	for (int i = 0; i < f; i++)
	{
		cin>>item[i];
	}
	S.list_insert(i, f,item);


	cin >> i >> f;
	S.list_del(i,f);

	return 0;

}

屏幕截图 20220908 195527.jpg 屏幕截图 20220908 203402.jpg

DS顺序表--合并操作

屏幕截图 20220908 195854.jpg

//DS顺序表--合并操作

#include <iostream>
using namespace std;

#define ok 0;
#define error -1;

//顺序表类定义
class SeqList
{
private:
	int* list;//元素数组
	int maxsize;//顺序表最大长度
	int size;//顺序表实际长度
public:
	SeqList();//构造函数
	~SeqList();//析构函数
	int list_size(int a);//获取顺序表实际长度
	void list_insert(SeqList &s1,SeqList &s2);//插入一个元素,参数是插入的数值和位置
	void list_display();//输出

};
SeqList::SeqList()
{
	maxsize = 1000;
	size = 0;
	list = new int[maxsize];
}
SeqList::~SeqList()
{
	delete[]list; //回收空间
}

int SeqList::list_size(int a)
{
	list[size] = a;
	size++;
	return size;
}
void SeqList::list_insert(SeqList& s1, SeqList& s2)
{
	size = s1.size + s2.size;
	int a = 0, b = 0,i=0;
	while (a<s1.size && b<s2.size)
	{

		if (s1.list[a] < s2.list[b])
		{
			list[i] = s1.list[a];
			a++;
			i++;
		}
		else
		{
			list[i] = s2.list[b];
			b++;
			i++;
		}
	}
	while (a < s1.size)
	{
		list[i] = s1.list[a];
		a++;
		i++;
	}
	while (b < s2.size)
	{
		list[i] = s2.list[b];
		b++;
		i++;
	}
	list_display();
}


void SeqList::list_display()
{
	cout << size << " ";
	for (int i = 0; i < size; i++)
	{
		cout << list[i] << " ";
	}
	cout << endl;
}
int main()
{
	int n, m,a;
	cin >> n;
	SeqList s1;
	for (int i= 0; i < n; i++)
	{
		cin >> a;
		s1.list_size(a);
	}

	cin >> m;
	SeqList s2;
	for (int i = 0; i < m; i++)
	{
		cin >> a;
		s2.list_size(a);
	}
	SeqList S;
	S.list_insert(s1, s2);
	return 0;

}

屏幕截图 20220908 203309.jpg

DS顺序表之循环移位

屏幕截图 20220908 204216.jpg

//DS顺序表之循环移位

#include <iostream>
using namespace std;

#define ok 0;
#define error -1;

//顺序表类定义
class SeqList
{
private:
	int* list;//元素数组
	int maxsize;//顺序表最大长度
	int size;//顺序表实际长度
public:
	SeqList();//构造函数
	~SeqList();//析构函数
	int list_size(int a);//获取顺序表实际长度
	void list_insert(int d,int t);//插入一个元素,参数是插入的数值和位置
	void list_display();//输出

};
SeqList::SeqList()
{
	maxsize = 1000;
	size = 0;
	list = new int[maxsize];
}
SeqList::~SeqList()
{
	delete[]list; //回收空间
}

int SeqList::list_size(int a)
{
	list[size] = a;
	size++;
	return size;
}
void SeqList::list_insert(int d,int t)
{
	int* temp = new int[size];
		for (int i = 0; i < size; i++)
		{
			temp[i] = list[i];
	}
	if (d == 0)
	{
		for (int j = 0; j < size - t; j++)
		{
			list[j] = temp[j + t];
		}
		for (int j = size - t; j < size; j++)
		{
			list[j] = temp[j - (size - t)];
		}
		list_display();
	}
	else
	{
		for (int j = t; j < size; j++)
		{
			list[j] = temp[j - t];
		}
		for (int j = 0; j < t; j++)
		{
			list[j] = temp[size - t + j];
		}
		list_display();
	}
	delete[]temp;
}


void SeqList::list_display()
{
	
	for (int i = 0; i < size; i++)
	{
		cout << list[i] << " ";
	}
	cout << endl;
}
int main()
{
	int n, m, a;
	cin >> n;
	SeqList s1;
	for (int i = 0; i < n; i++)
	{
		cin >> a;
		s1.list_size(a);
	}
	s1.list_display();
	int d, t;
	cin >> d >> t;
	s1.list_insert(d, t);
	cin >> d >> t;
	s1.list_insert(d, t);
	return 0;

}

屏幕截图 20220908 214853.jpg

DS单链表--类实现

屏幕截图 20220908 215001.jpg 屏幕截图 20220908 215016.jpg

//vDS单链表--类实现

#include <iostream>
using namespace std;

#define ok 0;
#define error -1;

//链表节点类定义
class ListNode
{
public:
	int data;
	ListNode* next;
	ListNode() { next = NULL; }
};

//带头结点的单链表类定义
class LinkList
{
public:
	ListNode* head;
	int len;
	//操作定义
	LinkList();
	~LinkList();
	ListNode* LL_index(int t)//返回第i个结点的指针,若不存在返回NULL
	{
		if (t<0 || t>len)return NULL;
		ListNode* l = head;
		for (int i = 0; i < t; i++)
		{
			l = l->next;
		}
		return l;
	}
	void init(int n)
	{
		ListNode* node = head;
		len = n;
		int num;
		while (n--)
		{
			cin >> num;
			ListNode* l = new ListNode;
			l->data = num;
			node->next = l;
			node = node->next;
		}
	}
	int LL_get(int i);//获取第i个元素的数据
	int LL_insert(int i, int item);//把数值item插入第i个位置
	int LL_del(int i);//删除第i个结点
	void LL_display();//输出单链表的内容
};
LinkList::LinkList()
{
	head = new ListNode();
	len = 0;
}
LinkList::~LinkList()
{
	ListNode* p, * q;
	p = head;
	while (p != NULL)
	{
		q = p;
		p = p->next;
		delete q;
	}
	len = 0;
	head = NULL;
}

int LinkList::LL_get(int i)
{
	if (i<1 || i>len)
	{
		cout << "error" << endl;
		return NULL;
	}
	else
	{
		cout << LL_index(i)->data << endl;
		return LL_index(i)->data;
	}
}
int LinkList::LL_insert(int i, int item)
{
	if (i<1 || i>len + 1)
	{
		cout << "error" << endl;
		return -1;
	}
	else
	{
		ListNode* l = LL_index(i - 1);
		ListNode* ll = new ListNode;
		ll->data = item;
		ll->next = l->next;
		l->next = ll;
		len++;
		LL_display();
		return 0;
	}
}
int LinkList::LL_del(int i)
{
	if (i<1 || i>len)
	{
		cout << "error" << endl;
		return -1;
	}
	else
	{
		ListNode* l = LL_index(i - 1);
		ListNode* ll = l->next;
		l->next = ll->next;
		l = NULL;
		len--;
		LL_display();
		return 0;
	}
}
void LinkList::LL_display()
{
	ListNode* p;
	p = head->next;
	while (p)
	{
		cout << p->data << " ";
		p = p->next;
	}
	cout << endl;
}

int main()
{
	int n;
	cin >> n;
	LinkList L;
	L.init(n);
	L.LL_display();
	int i, item;
	cin >> i >> item;
	L.LL_insert(i, item);
	cin >> i >> item;
	L.LL_insert(i, item);
	cin >> i;
	L.LL_del(i);
	cin >> i;
	L.LL_del(i);
	cin >> i;
	L.LL_get(i);
	cin >> i;
	L.LL_get(i);
	return 0;
}

屏幕截图 2022-09-09 094451.jpg

DS单链表--结点交换

image.png

//DS单链表--结点交换

#include <iostream>
using namespace std;

#define ok 0;
#define error -1;

//链表节点类定义
class ListNode
{
public:
	int data;
	ListNode* next;
	ListNode() { next = NULL; }
};

//带头结点的单链表类定义
class LinkList
{
public:
	ListNode* head;
	int len;
	//操作定义
	LinkList();
	~LinkList();
	ListNode* LL_index(int t)//返回第i个结点的指针,若不存在返回NULL
	{
		if (t<0 || t>len)return NULL;
		ListNode* l = head;
		for (int i = 0; i < t; i++)
		{
			l = l->next;
		}
		return l;
	}
	void init(int n)
	{
		ListNode* node = head;
		len = n;
		int num;
		while (n--)
		{
			cin >> num;
			ListNode* l = new ListNode;
			l->data = num;
			node->next = l;
			node = node->next;
		}
	}
	int swap(int pa, int pb); //pa和pb表示两个结点在单链表的位置序号
	int swap1(ListNode* p, ListNode* q);  //p和q表示指向两个结点的指针
	void LL_display();//输出单链表的内容
};
LinkList::LinkList()
{
	head = new ListNode();
	len = 0;
}
LinkList::~LinkList()
{
	ListNode* p, * q;
	p = head;
	while (p != NULL)
	{
		q = p;
		p = p->next;
		delete q;
	}
	len = 0;
	head = NULL;
}
int LinkList::swap(int pa, int pb)
{
	if ((pa<1 || pa>len) || (pb<1 || pb>len))
	{
		cout << "error" << endl;
		return 0;
	}
	else
	{
		ListNode* p = LL_index(pa - 1);
		ListNode* q = LL_index(pb - 1);
		if (p->next == q)
		{
			p->next = q->next;
			q->next = p->next->next;
			p->next->next = q;
			return true;
		}
		ListNode* t = p->next;
		p->next = q->next;
		q->next = t;

		t = p->next->next;
		p->next->next = q->next->next;
		q->next->next = t;
		LL_display();
		return true;
	}
	return pa, pb;
}

void LinkList::LL_display()
{
	ListNode* p;
	p = head->next;
	while (p)
	{
		cout << p->data << " ";
		p = p->next;
	}
	cout << endl;
}
int main()
{
	int n;
	cin >> n;
	LinkList L;
	L.init(n);
	L.LL_display();
	int pa, pb;
	cin >> pa >> pb;
	L.swap(pa, pb);

	cin >> pa >> pb;
	L.swap(pa, pb);

	return 0;
}

屏幕截图 2022-09-09 104407.jpg

未完待续....