数据结构自学笔记——线性表

Posted 每天告诉自己要努力

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构自学笔记——线性表相关的知识,希望对你有一定的参考价值。

线性表有顺序表:(静态)和链表(动态)两种,链表又有单链表、单循环链表、双链表、双循环链表
线性表的特点:元素具有相同特性、有限、序列

一、顺序表建表 算法代码:

int A[maxSize];
int length;
int createList(int A[],int &length)
{
	cin>>length;
	if(length>maxSize) 
	return 0;
	
	for(int i=0;i<length;i++) 
	{	
		cin>>A[i];
		return 1;
	}
}

二、链表建表 算法代码

**尾插法**
void createLinkListR(LNode *&head)  //R代表尾插法
{
	head = (LNode*)malloc(sizeof(LNode));
	head->next = NULL; //前两句是申请节点空间的固定语法,可以当成公式
	
	LNode *p =NULL,*r = head; //p是接受新节点的指针,r是始终指着尾部的指针
	int n;//数据个数
	cin>>n;
	for(int i = 0;i<n;i++)
	{
		P=(LNode*)malloc(sizeof(LNode));
		P->next = NULL;//申请新节点的公式
		cin>> p->date;
		r->next = p;//把P跟最后一个节点连起来,因为是尾插
		r=p;//更r的节点,让r指着链表的尾巴
	}
}
**头插法**
void createLinkListH(LNode *&head)  //H代表头插法
{
	head = (LNode*)malloc(sizeof(LNode));
	head->next = NULL; //前两句是申请节点空间的固定语法,可以当成公式
	
	LNode *p =NULL; //p是接受新节点的指针
	int n;//数据个数
	cin>>n;
	for(int i = 0;i<n;i++)
	{
		P=(LNode*)malloc(sizeof(LNode));
		P->next = NULL;//申请新节点的公式
		cin>> p->date;
		p->next = head->next;
		head->next = p;
	}
}

*例题:
在这里插入图片描述解法:

void createLinkNoSameElem(LNode *&head)
{
	head = (LNode*)malloc(sizeof(LNode));
	head->next =NULL;//公式
	LNode *p;
	int n;
	char ch;
	cin >> n;
	for(i=0;i<n;i++)
	{
		cin>>ch;
		p = head->next;
		while (p!=NULL)
		{
			if(p->data == ch) break; //扫描当前这个p指着的data,如果一样就结束while循环
			else p = p->next;//如果不一样的话,p指针就指向下一个,一直扫描过去,直到为空
		}
		if(p == NULL)
		{
			p = (LNode*)malloc(sizeof(LNode));
			p->next = NULL;//公式
			p->data = ch;
			p->next = head->next;
			head->next = p;		
		}
	}
}

三、逆置问题

//数组逆置万能函数公式:
void reverse(int a[],int left,int right,int k)
{
	int temp;
	for(int i=left,j=right;i<left+k && i<j;i++,j--)
	{
		temp = a[i];
		a[i] = a[j];
		a[j] = temp;
	}
}

四、最值问题

//链表求最大值
LNode *p,*q;
int max = head->next->data;
q=p=head->next;
while(p!= NULL)
{
	if(max< p->data)
	{
		max = p->data;
		q=p;
	}
	p = p->next;
}

*例题:在这里插入图片描述

void maxFirst(DLNode *head)
{
	DLNode *p = head->rlink,*q = NULL;
	int max = p->data;
	//最值
	while(p!= NULL)
{
	if(max< p->data)
	{
		max = p->data;
		q=p;
	}
	p = p->next;
}

//删除,但不清空节点
DLNode *l = q->llink,*r = q->rlink;
l->rlink = r;
if (r != NULL)
	r->llink = l;

//插入
q->llink = head;
q->rlink = head->rlink;
head->rlink = q;
q->rlink->llink = q;

}

五、二路归并(链表)

//尾插
void merge(LNode *A,LNode *B,LNode *&C) // 顺序归并,用尾插
{
	LNode *p = A->next;
	LNode *q = B->next;
	LNode *r;//尾
	C = A;
	C->next =NULL;
	free(B);
	r = C; //此时的C是只有一个结点,头尾是同一个节点,所以r指向尾部即指向C
	while(p!=NULL && q!=NULL)
	{
		if(p->data <= q->data)
		{
		r->next = p;
		p = p->next;
		r = r->next;
		}
		else
		{
			r->next = q;
			q = q->next;
			r = r->next;
		}
	if(p!=NULL) r->next = p;
	if(q!=NULL) r->next = q;
	}
}
//***头插***
void mergeR(LNode *A,LNode *B,LNode *&C) //R表示逆序,要用头插法
{
	LNode *p = A->next;
	LNode *q = B->next;
	LNode *s;//头
	C = A;//取A的头节点为归并后的C链表的头节点
	C->next =NULL;
	free(B);//释放掉B的头节点
	while(p!=NULL && q!=NULL)
	{
		if(p->data <= q->data)
		{
		s = p;
		p = p->next;
		s->next = C->next;
		C->next = s; //???
		}
		else
		{
		s = q;
		q = q->next;
		s->next = C->next;
		C->next = s; //???
		}
			while(p!=NULL)
			{
				s = p;
				p = p->next;
				s->next = C->next;
				C->next = s; //???
			}		
			while(q!=NULL)
			{
				s = q;
				q = q->next;
				s->next = C->next;
				C->next = s; //???
			}	

	}

学完线性表,去刷leetcode的数组和链表简单题咯~

以上是关于数据结构自学笔记——线性表的主要内容,如果未能解决你的问题,请参考以下文章

数据结构学习笔记二线性表---顺序表篇(画图详解+代码实现)

数据结构学习笔记二线性表---顺序表篇(画图详解+代码实现)

Java数据结构学习笔记之一线性表的存储结构及其代码实现

《大话数据结构》笔记--线性表的顺序存储结构

《R语言实战》自学笔记71-主成分和因子分析

数据结构自学笔记 链表超进化