数据结构、算法、线性表学习总结

一、思维导图

二、重要概念笔记

1、链表头插法

void CreateListF(LinkList& L, int n) {
	L = new LNode;
	LinkList p;
	ElemType data;
	L->next = NULL;
	for (int i = 0; i < n; i++) {
		cin >> data;
		p = new LNode;
		p->data = data;
		p->next = L->next;
		L->next = p;
	}
}

2、链表尾插法

void CreateListR(LinkList& L, int n) {
	LinkList tail, p;
	ElemType data;
	L = new LNode;
	tail = L;
	while (n) {
		cin >> data;
		p = new LNode;
		p->data = data;
		p->next = NULL;
		tail->next = p;
		tail = p;
		n--;
	}
}

3、单链表逆置

void ReverseList(LinkList& L) {
	LinkList p1, p2=NULL;
	L = L->next;
	while (L) {
		p1 = new LNode;
		p1->data = L->data;
		p1->next = p2;
		p2 = p1;
		L = L->next;
	}
	p1 = new LNode;
	p1->next = p2;
	L = p1;
}

4、栈(stack)

栈之定义格式

stack<Elemtype> StackName;

栈之特点

先进后出式

栈之操作函数

出栈Stackname.pop();
入栈Stackname.push();
空栈判断Stackname.empty();
栈中元素个数Stackname.size();
栈顶元素Stackname.top();

5、队列(queue)

队列之定义格式

queue<Elemtype> QueueName;

队列之特点

先进先出式

队列之操作函数

出队QueueName.pop();
入队QueueName.push();
队头元素QueueName.front();
队尾元素QueueName.back();
空队列判断QueueName.empty();
队列中元素个数QueueName.size();

6、串(string)

串之定义格式

string StrName;

串之操作函数

读取一行getline(cin,StrName);
截取字符串StrName.substr(num1,num2);(num1表示截取位置,num2表示截取个数)
字符串长度StrName.size();
字符串连接

str1="hello ";
str2="world";
str3=str1+str2;//str3最终为hello world

三、疑难问题解决

关于字符串中KMP算法的next数组。

在求一个串对应字符的next数组值时,根据算法的特点,有多种next数组求法,例如从-1开始和从0开始,而恰巧课堂中和书本上正好不同,起初处于懵懂状态,无法在两种模式中切换自如,但是在一番观察后发现,花样再如何变都是异曲同工,给从-1开始的next数组每个元素加一,恰好是从0开始的next数组,再经过多次练习后,掌握该知识点。

//从-1开始的next数组计算代码
void GetNext(string t, int next[])
{
	int j = 0, k = -1;
	next[0] = -1;
	while (j < t.size() - 1)
	{
		if (k == -1 || t[j] == t[k])
		{
			j++;
			k++;
			next[j] = k;
		}
		else
			k = next[k];
	}
}
原文地址:https://www.cnblogs.com/zx224569/p/12589057.html