我是靠谱客的博主 潇洒玉米,这篇文章主要介绍篇章二线性表---常见操作,现在分享给大家,希望可以做个参考。

1.顺序表数组R[],元素0~m+n-1,前m个有序,后n个元素有序递增,使其整体有序

void insertSort(int R[],int n)
{
	int i,j,temp;
	for(i=m;i<=m+n-1;i++)
	{
		temp=R[i];
		for(j=i-1;j>=0&&temp<R[j];j--)
			R[j]=R[j+1];
		R[j+1]=temp;
	}	
}

2.递增有序的单链表A,B,求出A和B的差集(仅在A出现,而不再B出现)

void differ(LNode *A,LNode *B)
{
	LNode *p=A->next;LNode *q=B->next;
	LNode *pre=A;
	LNode *r;
	while(p!=NULL&&q!=NULL)
	{
		if(p->data<q->data)
		{
			pre=p;
			p=p->next;
		}
		else if(p->data>q->data)
			q=q->next;
		else
		{
			pre->next=p->next;
			r=p;
			p=p->next;
			free(r);
		}
	}
}

3.将顺序表中的元素逆置

void reverse(SqList *&L)
{
	int i,j;
	int temp;
	for(i=0,j=L.length-1;i<j;i++,j--)
	{
		temp=L.data[i];
		L.data[i]]=L.data[j];
		L.data[j]=temp;
	}
}

 

4.从一给定的顺序表中删除下标i-j

void delete(Sqlist &L,int i,int j)
{
	int k,deleta;
	deleta=j-i+1;
	for(k=j+1;k<L.length;k++)
		L.data[k-deleta]=L.data[k];
	L.length=deleta;
}

5.顺序表整型数据,将L中所有小于表头元素放前面,大于表头元素的放在后半部分。

void move(Sqlist &L)
{
	int i,j;int temp;
	i=0,j=L.length-1;
	temp=L.data[i];
	while(i<j)
	{
		while(i<j&&L.data[j]>temp)	
			j--;
		if(i<j)
		{
			L.data[i]=L.data[j];
			i++;
		}
		while(i<j&&L.data[i]<temp)
			i++;
		if(i<j)
		{
			L.data[j]=L.data[i];
			j--;
		}
	}
	L.data[i]=temp;
}

6.递增非空单链表,设计一个算法删除值域重复的结点

void delsll(LNode *L)
{
	LNode *p=L->next,*q;
	while(p->next!=NULL)
	{
		if(p->data==p->next->data)
		{
			q=p->next;
			p->next=q->next;
			free(q);
		}
		p=p->next;
	}
}

 

7.删除单链表L中最小值结点


void delminnode(LNode *&L)
{
	LNode *pre=L;LNode *p=L->next;
	LNode *minpre,minp=p;
	while(p!=NULL)
	{
		if(p->data<minp->data)
		{
			min=p;
			minpre=pre;
		}
		pre=p;
		p=p->next;
	}
	minpre->next=minp->next;
	free(minp);
}

8.带头结点的单链表逆置

void reverse(LNode *L)
{
	LNode *p=L->next,*q;
	L->next=NULL;
	while(p!=NULL)
	{
		q=p;
		p=p->next;
		q->next=L->next;
		L->next=q;
	}
}

9.带头结点单链表分解成两个单链表A,B,A只含data域为奇数结点,B中只含data域为偶数结点

void split(LNode *A,LNode *&B)
{
	LNode *p,*q,*r;
	B=(LNode*)malloc(sizeof(LNode));
	B->next=NULL;
	r=B;
	p=A;
	while(p->next!=NULL)
	{
		if(p->next->data%2==0)
		{
			q=p->next;
			p->next=q->next;
			q->next=NULL;
			r->next=q;
			r=q;
		}
		else
			p=p->next;
	} 
} 

10.逆序输出单链表中的数据

void reprint(LNode *L)
{
	if(L!=NULL)
	{
		reprint(L->next);
		cout<<L->data;
	}
}

11.除去最大公共前缀后子表比较大小

int compare(float A[],int An,float B[],int Bn)
{
	int i=0;
	while(i<An&&i<Bn)
	{
		if(fabs(A[i]-B[i])<MIN)
			i++;
		else
			break;
	}
	if(i>=An&&i>=Bn)
		return 0;
	else if(i>=An&&i<Bn||A[i]<B[i])
		return -1;
	else 
		return 1;
		
} 

12.输出链表中倒数第k个位置上的结点

int findElem(LNode *head,int k) 
{
	LNode *q=head->next,*p=head;
	int i=1;
	while(q!=NULL)
	{
		q=q->next;
		i++;
		if(i>k)
			p=p->next;
	}
	if(p==head)
		return 0;
	else
	{
		cout<<p->data;
		return 0;
	}
}

13.对两个非递减有序的顺序表A,B进行合并,合并后的结果放A[]中

int comb(int A[],int &na,int B[],int nb)
{
	if(na+nb<maxsize)
		return -1;
	int i=na,j=nb;
	while(j>0)
	{
		if(i==0||A[i-1]<B[j-1])
		{
			A[j+i-1]=B[j-1];
			--j;
		} 
		else
		{
			A[j+i-1]=A[i-1];
			--i;
		}
	}
}

14.L为单链表,试写出下面运算的递归算法

//求链表中的最大整数
int getMax(LNode *L)
{
	if(L->next==NULL)
		return L->data;
	int temp=getMax(L-data);
	if(L->data>temp)
		return L->data;
	else
		return temp;
} 
//其链表中的结点个数
int getNum(LNode *L)
{
	if(L->next==NULL)
		return 1;
	return 1+getNum(L->next);
} 
//求所有整数的平均值
float getAvg(LNode *L,int n)
{
	if(L->next==NULL)
		return (float)(L->data);
	else
	{
		float sum=getAvg(L->next,n-1)*(n-1);
		return (float)(L->data+sum)/n;
	}
} 

 

最后

以上就是潇洒玉米最近收集整理的关于篇章二线性表---常见操作的全部内容,更多相关篇章二线性表---常见操作内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(120)

评论列表共有 0 条评论

立即
投稿
返回
顶部