数据结构自学笔记——线性表
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的数组和链表简单题咯~
以上是关于数据结构自学笔记——线性表的主要内容,如果未能解决你的问题,请参考以下文章
数据结构学习笔记二线性表---顺序表篇(画图详解+代码实现)