线性表操作
1.建立顺序表
int sqlist[maxsize];
int length;
int createlist(int sqlist[],int &length)
{
cin>>length;
if(length>maxsize)
return 0;
for(i=0;i<length;i++)
cin>>sqlist[i]
return 1;
}
1.1在顺序表p的位置插入元素e
int sqlist[maxsize]={1,2,3,.....,n};
int length=n;
int insert(int sqlist[],int &length,int p,int e)
{
if(p<0||p>length)
return 0;//不符合插入条件
if(int i=length-1;i>=p;--i)
sqlist[i+1]=sqlist[i];//从顺序表的最后一个元素
sqlist[p]=e;
++length;
return 1;
}
1.2删除元素
int deleteelm(int sqlist[],int &length,int p,int &e)
{
if(p<0||p>length-1)
return 0;
e=sqlist[p];
for (int i=p;i<length-1;++i)
sqlist[i]=sqlist[i+1];//从删掉元素的位置元素逐个前移
--length;
return 1;
}
2.建立链表
2.1尾插发
typedef struct LNode
{
int data;
struct LNode *next;
}LNode;//定义链表结点
void creatlinklistR(LNode *&head)
{
head=(LNode*)malloc(sizeof(LNode));
head->next=NULL;
LNode *p=NULL,*r=head;//用p指向新插入的结点,r指向尾结点
int n;//用户输入链表长度
scanf('%d',&n);
for(int i =0;i<n;++i)
{
p=(LNode*)malloc(sizeof(LNode));
p->next=NULL;
scanf('%d',&(p->data));
r->next=p;
r=p;
}
}
2.2头插法
typedef struct LNode
{
int data;
struct LNode *next;
}LNode;//定义链表结点
void creatlinklistR(LNode *&head)
{
head=(LNode*)malloc(sizeof(LNode));
head->next=NULL;
LNode *p=NULL;//用p指向新插入的结点
int n;//用户输入链表长度
scanf('%d',&n);
for(int i =0;i<n;++i)
{
p=(LNode*)malloc(sizeof(LNode));
p->next=NULL;
scanf('%d',&(p->data));
p->next=head->next;
head->next=p;
}
}
3.链表的删除某个结点
对于链表而言,就很简单
q=p->next;//删除p的后继结点
p->next=p->next->next;
free(q);
4.表的逆置
假设将数组a[1,2,3,4,5,6]逆置为a[6,5,4,3,2,1]
对于顺序表而言,基本思想就是一个for循环
for(int i=left,j=right;i<j;++i,--j)
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
而对于链表来说,逆置p->next到q之间的结点
while(p->next!=q)//p指向链表中q前面的某个结点,q指向链表中某一个结点
{
t=p->next;//t始终指向要移动的链表结点,即在p的next
p->next=t->next;
t->next=q->next;
q->next=t;
}
5.表的取最值
加入取最大值,对于顺序表来说
int max=a[0]
int maxind=0;
for (int i=0;i<n;++i)
{
if(max<a[i])
{
max=a[i];
maxind=i;
}
}
对于链表而言
LNode *p,*q;
int max=head->next->data;
q=p=head->next;//p指针用来扫描链表,q指针用来标记当前已得最大值的链表
while(p!=NULL)
{
if(max<p->data)
{
max=p->data;
q=p;
}
p=p->next;//p指针扫描链表
}
6.表的归并
对于顺序表来说
void merge(int a[],int m,int b[],int n,int c[])
{
int i=0,j=0//分别为两个数组的第一个数的下标
int k=0;
while(i<m&&j<n)
{
if(a[i]<b[j])//按照升序合并
c[k]=a[i];
k++;
i++;
else
c[k]=b[j];
k++;
j++;
}
while(i<m)//当a数组中的元素有剩余
c[k]=a[i];
k++;
i++;
while(j<n)//当b数组中的元素有剩余
c[k]=b[j];
k++;
j++;
}
对于链表来说
void merge(LNode *A,LNode *B,LNode *&C)
{
LNode *p=A->next;
LNode *q=B->next;
LNode *r;//始终标记C尾部位置的指针
C=A;
C->next=NULL;
free(B);//释放掉B的头结点
r=C;
while(p!=NULL&&q!=NULL)
{
if(p->data<=q->data)
{
r->next=p;p=p->next;
r=r->next;//r指向此时的尾结点
}
else
{
r->next=q;q=q->next;
r=r->next;//r指向此时的尾结点
}
}
if(p!=NULL)
r->next=p;
if(p!=NULL)
r->next=q;
}
7.表的划分
将顺序表中的元素以某个数为界限划分为左右两个部分
void partition(int a[],int n)
{
int temp;
int i=0,j=n-1;
temp=a[0];
while(i<j)
{
while(i<j&&a[j]>=temp) --j;
if(i<j)
{
a[i]=a[j];
++i;
}
while(i<j&&a[i]<=temp) ++i;
if(i<j)
{
a[j]=a[i];
--j;
}
}
a[i]=temp;
}