线性表相关算法
//1.逆转顺序表中的所有元素
void Reverse(int A[ ],int n)
{
int i,t;
for(i=0; i<n/2; i++)
{
t = A[i];
A[i] = A[n-i-1];
a[n-i-1] = t;
}
}
//2. 删除线性表中数据域为X的所有结点
void Del_X(Linklist &L,Elemtype X)
{
Linklist p,q = L;
p = L->next;
while (P!=NULL)
{
if(p->data == X)
{
q->next = p->next;
free(p);
p=q->next;
}
else
{
q = p;
p = p->next;
}
}
if(L->data == X)
{
q = L;
L = L->next;
free(q);
}
}
//3.删除不带头结点单链表L中所有值为X的结点(递归)
void Del_X(Linklist &L,Elemtype X)
{
LNode *p;
if(L==NULL)
return ;
if(L->data == X)
{
P = L;
L = L->next;
free(p);
Del_X(L,X);
}
else
{
Del_X(L->next,X);
}
}
//4.删除带头结点单链表L中所有值为X的结点
void Del_X(Linklist &L,Elemtype X)
{
LNode *p = L->next,*pre = L, *q;
while(P!=NULL)
{
if(P->data == X)
{
q = p;
p=p->next;
pre->next = p;
free(q);
}
else
{
pre = p;
p=p->next;
}
}
}
//注:本算法是在无序单链表中删除满足某种
//条件的所有结点; 如:若是要删除介于 max
//和 min 之间的所有结点, 只需将 if 语句改为
//if(p->data>min&&p->data<max)
//5.逆转线性表(不带头)
void reverse(Linklist &L)
{
Linklist p, q, r;
p = L;
q = NULL;
while(p!=NULL)
{
r = q;
q = p;
p = p->next;
q->next = r;
}
L = q;
}
//带头节点
Linklist reverse(Linklist L)
{
LNode *pre,*p=L->next,*r=p->next;
p->next = NULL;
while(r!=NULL)
{
pre = p;
p = r;
r = r->next;
p->next = pre;
}
L->next = p;
return L;
}
//6. 复制线性链表 (递归 )
Linklist copy(Linklist list1)
{
Linklist list2;
if(list1==NULL)
return NULL;
else
{
list2 =
(Linklist)malloc(sizeof(LNode));
list2 ->data = list1->data;
list2 -> next =
copy(list1->next);
return list2;
}
}
//7. 将两个按值有序排列的非空线性表合并为一个按值有序的线性表
Linklist Mergelist(Linklist L1,Linklist L2)
{
Linklist L3,p = L1,q = L2,r;
if(L1->data <= L2->data)
{
L3 = L1;
r = L1;
p = L1->next;
}
else
{
L3 = L2;
r = L2;
q = L2->next;
}
while(P!=NULL&&q!=NULL)
{
if(p->data <= q->data)
{
r->next = p;
r = p;
p = p->next;
}
else
{
r->next = q;
r = q;
q = q->next;
}
}
r->next=p!=NULL?p:q;
return L3;
}
//8. 将两个按值递增线性表合并为一个按值递减的线性表
void MergeList(LinkList &L1,LinkList &L2)
{
LNode *r,*p1=L1->next;
*p2=L2->next;
L1->next = NULL;
while(p1&&p2)
{
if(p1->data <= p2->data)
{
r = p1->next;
p1->next = L1->next;
L1->next=p1;
p1 = r;
}
else
{
r = p2->next;
p2->next = L1->next;
L1->next = p2;
p2 = r;
}
if(p1)
{
p2 = p1;
}
while(p2)
{
r = p2->next;
p2->next = L1->next;
L1->next = p2;
p2 = r;
}
free(L2);
}
}