【王道】【数据结构】

01| 从顺序表中删除具有最小值的元素(假设唯一)并由函数返回被删元素的值。空出的位置由最后一个元素填补,若顺序表为空,则显示出错信息并退出运行。

#include<stdio.h> 
#include<stdlib.h>
#define MaxSize 100
#define FALSE -1

typedef struct {
	int data[MaxSize];
	int length;	
} SqList;

int Del_Min(SqList *L)
{
	if(L->length == 0)
        return FALSE;
	int i, pos, temp;
	for(i=0, pos=0; i < L->length; i++)
		if(L->data[pos] > L->data[i])
			pos = i;
	temp = L->data[pos];
	L->data[pos] = L->data[--L->length];
	return temp;
}

int main()
{
	SqList L;
	scanf("%d", &L.length);
	for(int i=0; i<L.length; i++)
	    scanf("%d", &L.data[i]);
	
	int img = Del_Min(&L);
	if(img == FALSE)
	{
		printf("error!\n");
		exit(0);
	}
	printf("%d\n", img);
	
	for(int i=0; i<L.length; i++)
	    printf("%d ", L.data[i]);
 
	return 0;
} 

02|设计一个高效算法,将顺序表L的所有元素逆置,要求算法的空间复杂度为O(1)。

#include<stdio.h> 
#include<stdlib.h>
#define MaxSize 100
#define FALSE -1

typedef struct {
	int data[MaxSize];
	int length;	
} SqList;

void Reverse(SqList *L)
{
	int i, temp;
	for(i=0; i < L->length/2; i++)
	{
		temp = L->data[i];
		L->data[i] = L->data[L->length-1-i];
		L->data[L->length-1-i] = temp;
	}
}

int main()
{
	SqList L;
	scanf("%d", &L.length);
	for(int i=0; i<L.length; i++)
	    scanf("%d", &L.data[i]);
	
	Reverse(&L);
	
	for(int i=0; i<L.length; i++)
	    printf("%d ", L.data[i]);
 
	return 0;
} 

03|对长度为n的顺序表L,编写一个时间复杂度为O(n)、空间复杂度为O(1)的算法,该算法删除线性表中所有值为x的数据元素。

#include<stdio.h> 
#include<stdlib.h>
#define MaxSize 100
#define FALSE -1

typedef struct {
	int data[MaxSize];
	int length;	
} SqList;

void Del_x_1(SqList *L, int x)
{
	int i, pos = -1, p_num = 0;
	for(i=0; i < L->length; i++)
	{
		if(L->data[i] == x)
		{
			if(p_num == 0) pos = i;
			p_num ++;
		}
		else if(L->data[i] != x && pos != -1 && p_num != 0)
		{
			L->data[pos] = L->data[i];
			pos ++;
		}
		
		if(pos+p_num == L->length)
		{
			L->length -= p_num;
		}
	}
}

int main()
{
	SqList L;
	scanf("%d", &L.length);
	for(int i=0; i<L.length; i++)
	    scanf("%d", &L.data[i]);
	
	int x;
	scanf("%d", &x);
	Del_x_1(&L, x);
	
	for(int i=0; i<L.length; i++)
	    printf("%d ", L.data[i]);
 
	return 0;
} 

解法1:用k记录顺序表L中不等于x的元素个数(即需要保存的元素个数),扫描时将不等于x的元素移动到下标k的位置,并更新k值。扫描结束后修改L的长度。

#include<stdio.h> 
#include<stdlib.h>
#define MaxSize 100
#define FALSE -1

typedef struct {
	int data[MaxSize];
	int length;	
} SqList;

int Del_x_1(SqList *L, int x)
{
	if(L->length == 0)	return FALSE;
	int i, k = 0;
	for(i=0; i < L->length; i++)
	{
		if(L->data[i] != x)
		{
			L->data[k] = L->data[i];
			k ++;
		}
	}
	L->length = k;
}

int main()
{
	SqList L;
	scanf("%d", &L.length);
	for(int i=0; i<L.length; i++)
	    scanf("%d", &L.data[i]);
	
	int x;
	scanf("%d", &x);
	int img = Del_x_1(&L, x);
	if(img == FALSE)
	{
		printf("error!\n");
		exit(0);
	}
	
	for(int i=0; i<L.length; i++)
	    printf("%d ", L.data[i]);
 
	return 0;
} 

解法2:用k记录顺序表L中等于x的元素个数(即需要删除的元素个数), 把边扫描边统计k,并将不等于x的元素前移k个位置。扫描结束后修改L的长度。

#include<stdio.h> 
#include<stdlib.h>
#define MaxSize 100
#define FALSE -1

typedef struct {
	int data[MaxSize];
	int length;	
} SqList;

int Del_x_2(SqList *L, int x)
{
	if(L->length == 0)	return FALSE;
	int i, k = 0;
	for(i=0; i < L->length; i++)
	{
		if(L->data[i] == x)
		    k ++;
		else
			L->data[i-k] = L->data[i];
	}
	L->length -= k;
}

int main()
{
	SqList L;
	scanf("%d", &L.length);
	for(int i=0; i<L.length; i++)
	    scanf("%d", &L.data[i]);
	
	int x;
	scanf("%d", &x);
	int img = Del_x_2(&L, x);
	if(img == FALSE)
	{
		printf("error!\n");
		exit(0);
	}
	
	for(int i=0; i<L.length; i++)
	    printf("%d ", L.data[i]);
 
	return 0;
} 

04| 从有序顺序表中删除其值在给定s与t之间(要求s<t)的所有元素,若s或t不合理或顺序表为空,则显示出错信息并退出运行。

删除元素下标连续

#include<stdio.h> 
#include<stdlib.h>
#define MaxSize 100
#define FALSE -1

typedef struct {
	int data[MaxSize];
	int length;	
} SqList;

int Del_s_t1(SqList *L, int s, int t)
{
	if(s >= t || L->length == 0)	return FALSE;
	int i, j;
	for(i=0; i < L->length && L->data[i] < s; i++);
	if(i >= L->length)	return FALSE;
	for(j=i; j < L->length && L->data[j] <= t; j++);
	for( ; j < L->length; i++, j++)
		L->data[i] = L->data[j];
	L->length = i;
}

int main()
{
	SqList L;
	scanf("%d", &L.length);
	for(int i=0; i<L.length; i++)
	    scanf("%d", &L.data[i]);
	
	int s, t;
	scanf("%d %d", &s, &t);
	int img = Del_s_t1(&L, s, t);
	if(img == FALSE)
	{
		printf("error!\n");
		exit(0);
	}
	
	for(int i=0; i<L.length; i++)
	    printf("%d ", L.data[i]);
 
	return 0;
} 

05| 从顺序表中删除其值在给定s与t之间(包含s和t,要求s<t)的所有元素,若S或T不合理或顺序表为空,则显示出错信息并退出运行。

#include<stdio.h> 
#include<stdlib.h>
#define MaxSize 100
#define FALSE -1

typedef struct {
	int data[MaxSize];
	int length;	
} SqList;

int Del_s_t1(SqList *L, int s, int t)
{
	if(s >= t || L->length == 0)	return FALSE;
	int i, k=0;
	for(i=0; i < L->length; i++)
	{
		if(L->data[i] < s || L->data[i] > t)
		{
			L->data[k] = L->data[i];
			k++;
		}
	}
	L->length = k;
}

int main()
{
	SqList L;
	scanf("%d", &L.length);
	for(int i=0; i<L.length; i++)
	    scanf("%d", &L.data[i]);
	
	int s, t;
	scanf("%d %d", &s, &t);
	int img = Del_s_t1(&L, s, t);
	if(img == FALSE)
	{
		printf("error!\n");
		exit(0);
	}
	
	for(int i=0; i<L.length; i++)
	    printf("%d ", L.data[i]);
 
	return 0;
} 

06| 从有序顺序表中删除所有其值重复的元素,使表中所有元素的值均不同。

#include<stdio.h> 
#include<stdlib.h>
#define MaxSize 100
#define FALSE -1
#define TRUE   1

typedef struct {
	int data[MaxSize];
	int length;	
} SqList;

int Del_Same(SqList *L)
{
	if(L->length == 0)	return FALSE;
	int i, j;
	for(i=0,j=1; j < L->length; j++)
	{
		if(L->data[j] != L->data[i])
		{
			L->data[++i] = L->data[j];
		} 
	}
	L->length = i + 1;
	return TRUE;
}

int main()
{
	SqList L;
	scanf("%d", &L.length);
	for(int i=0; i<L.length; i++)
	    scanf("%d", &L.data[i]);
	
	int img = Del_Same(&L);
	if(img == FALSE)
	{
		printf("error!\n");
		exit(0);
	}
	
	for(int i=0; i<L.length; i++)
	    printf("%d ", L.data[i]);
 
	return 0;
} 

07| 将两个有序顺序表合并为一个新的有序顺序表,并由函数返回结果顺序表。

#include<stdio.h> 
#include<stdlib.h>
#define MaxSize 100
#define FALSE -1
#define TRUE   1

typedef struct {
	int data[MaxSize];
	int length;	
} SqList;

int Merge(SqList *L1, SqList *L2, SqList *L)
{
	if(L1->length + L2->length > MaxSize)	return FALSE;
	int i=0, j=0, k=0;
	while(i < L1->length && j < L2->length)
	{
		if(L1->data[i] <= L2->data[j])
			L->data[k++] = L1->data[i++];
		else
			L->data[k++] = L2->data[j++];	
	}
	while(i < L1->length)
		L->data[k++] = L1->data[i++];
	while(j < L2->length)
	    L->data[k++] = L2->data[j++];
	L->length = k;
	return TRUE;
}

int main()
{
	SqList L1, L2, L;
	scanf("%d", &L1.length);
	for(int i=0; i<L1.length; i++)
	    scanf("%d", &L1.data[i]);
	    
	scanf("%d", &L2.length);
	for(int i=0; i<L2.length; i++)
	    scanf("%d", &L2.data[i]);

	int img = Merge(&L1, &L2, &L);
	if(img == FALSE)
	{
		printf("error!\n");
		exit(0);
	}
	
	for(int i=0; i<L.length; i++)
	    printf("%d ", L.data[i]);
 
	return 0;
} 

08| 已知在一维数组A[m+n]中依次存放两个线性表(a1,a2,···,am)和(b1,b2,···,bn)。编写一个函数,将数组中两个顺序表的位置互换,即:将(b1,b2,···,bn)放在(a1,a2,···,am)的前面。

#include<stdio.h> 
#include<stdlib.h>
#define MaxSize 100
#define FALSE -1
#define TRUE   1

typedef struct {
	int data[MaxSize];
	int length;	
} SqList;

void Exchange(SqList *L, int left, int right)
{
	int i=left, temp, len = right-left, j=0;
	while(j++ < len/2)
	{
		temp = L->data[i];
		L->data[i] = L->data[right-1-i+left];
		L->data[right-1-i+left] = temp;
		i++;
	}
}
int Reverse(SqList *L, int m, int n)
{
	if(L->length == 0)	return FALSE;
	else
	{
	 	Exchange(L, 0, L->length);
		Exchange(L, 0, n);
		Exchange(L, n, L->length); 
	} 
	return TRUE;
}

int main()
{
	SqList L;
	int m, n, i;
	scanf("%d %d", &m, &n);
	L.length = m + n;

	for(i=0; i < L.length; i++)
	    scanf("%d", &L.data[i]);
	    
	int img = Reverse(&L, m, n);
	if(img == FALSE)
	{
		printf("error!\n");
		exit(0);
	}
	
	for(int i=0; i < L.length; i++)
	    printf("%d ", L.data[i]);

	return 0;
} 

09| 线性表(a1,a2,···,an)中的元素递增有序且按顺序存储于计算机内。要求设计一个算法,完成用最少时间在表中查找数值为x的元素,若找到,则将其与后继元素位置相交换,若找不到,则将其插入表中并使表中元素仍递增有序。

最少时间,则折半查找

#include<stdio.h> 
#include<stdlib.h>
#define MaxSize 100
#define FALSE -1
#define TRUE   1

typedef struct {
	int data[MaxSize];
	int length;	
} SqList;

void p(SqList *L)
{
 	for(int i=0; i < L->length; i++)
	    printf("%d ", L->data[i]);
  	printf("\n");
} 

int SearchExchangeInsert(SqList *L, int x)
{
	if(L->length == 0)	return FALSE;
	int low=0, high = L->length-1, mid, temp;
	while(low <= high)
	{
		mid = (low + high) / 2;
		if(L->data[mid] == x)
		    break;
		else if(L->data[mid] < x)
			low = mid + 1;
		else
			high = mid - 1;
	}
	if(L->data[mid] == x && mid != L->length-1)
	{
		temp = L->data[mid];
		L->data[mid] = L->data[mid+1];
		L->data[mid+1] = temp;
	}
	int i;
	if(low > high)
	{
		for(i = L->length-1; i > high; i--)
		{
			L->data[i+1] = L->data[i];
		}
		L->data[i+1] = x;
		L->length ++;   
	}
	return TRUE;
}

int main()
{
	SqList L;
	int x;
	scanf("%d", &L.length);
	for(int i=0; i < L.length; i++)
	    scanf("%d", &L.data[i]);
	    
    scanf("%d", &x);
	int img = SearchExchangeInsert(&L, x);
	if(img == FALSE)
	{
		printf("error!\n");
		exit(0);
	}
	
	for(int i=0; i < L.length; i++)
	    printf("%d ", L.data[i]);

	return 0;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值