数据结构线性表的顺序实现

数据结构线性表的顺序实现

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXSIZE 100  //定义线性表的最大长度

typedef struct sq_list
{
	int ListData[MAXSIZE + 1]; //保存顺序表的数组
	int len;				   //顺序表已存结点 的数量
}sq_list;

void Init(sq_list *L)  
{
	L->len = 0;
}

int length(sq_list *L)
{
	return (L->len);
}

void PrintL(sq_list *L)

{
	for (int i = 0; i < L->len; i++)
	{
		printf("%d", L->ListData[i]);
	}
	printf("\n");
}

/* 增删改查 之 增1  */  //在尾巴后加元素

int Add(sq_list *L, int data)
{
	if (L->len >= MAXSIZE)
	{
		printf("顺序表已满\n");
		return 0;
	}
	L->ListData[++L->len] = data;
	return 1;
}

/* 增删改查 之 增2  */  //指定中间位置(最后一个元素之前都行)插入

int insert(sq_list *L, int n, int data)
{
	int i;
	if (L->len >= MAXSIZE)
	{
		printf("已满\n");
		return 0;
	}
	if (n < 0 || n>L->len - 1)
	{
		printf("插入序号不正确\n");
		return 0;
	}
	for (i = L->len-1; i >= n; i--)
	{
		L->ListData[i + 1] = L->ListData[i];
		if (i == n)
		{
			L->ListData[n] = data;
			L->len++;
		}
	}
	return 1;
}

/* 增删改查 之 增3  */  //有序表插入后仍保持有序
void insert_one(sq_list *s, int x)
{
	int begin = 0;
	int end = s->len - 1;
	int mid;
	int tmp;
	int i;

	while (begin <= end)
	{
		mid = (begin + end) / 2;
		if (s->ListData[mid] == x)
		{
			break;
		}
		else if (s->ListData[mid] > x)
		{
			end = mid - 1;
		}
		else
		{

			begin = mid + 1;
		}
	}

	if (s->ListData[mid] == x && mid != s->len - 1)
	{
		tmp = s->ListData[mid];
		s->ListData[mid] = s->ListData[mid + 1];
		s->ListData[mid + 1] = tmp;
	}

	// 形如 1 3 5 7 9 中插入 6 
	if (begin > end)
	{
		printf("%d  %d\n", begin, end);
		for (i = s->len; i > end; i--)
		{
			s->ListData[i + 1] = s->ListData[i];
		}

		s->ListData[i + 1] = x;
		s->len++;
	}

}

/* 增删改查 之 增4 插入排序 */
void insert_sort(sq_list *L)
{
	int tmp, j;
	for (int i = 0; i < L->len - 1; i++)
	{
		tmp = L->ListData[i + 1];
		for (j = i + 1; j >= 1 && tmp < L->ListData[j - 1]; j--)
		{
			L->ListData[j] = L->ListData[j - 1];
		}
		L->ListData[j] = tmp;
	}
}

/* 增删改查 之 删1  */
int Delete(sq_list* L, int n)
{
	int i;
	if (L->len == 0)
	{
		printf("已空\n");
		return 0;
	}
	if (n < 0 || n > L->len - 1)
	{
		printf("删除结点序号错误,不能删除结点!\n");
		return 0;
	}
	for (i = n;i<=L->len-1;i++)
		L->ListData[i] = L->ListData[i + 1];
	L->len--;
	return 1;
}

/* 增删改查 之 删2 */
int DelMin(sq_list *L)
{
	int min = L->ListData[0];
	int pos = 0;

	if (L->len == 0)
	{
		printf("已空\n");
		return 1;
		exit(1);
	}
	for (int i = 1; i < L->len; i++)
	{
		if (L->ListData[i] < min)
		{
			pos = i;
			min = L->ListData[pos];
		}
	}

	L->ListData[pos] = L->ListData[L->len - 1];
	L->len--;

	return min;
}

/* 增删改查 之 删3 */
int DelABSorted(sq_list *L, int a, int b)
{
	int i, j, len;

	if (L->len == 0)
	{
		printf("已空\n");
		return 0;
	}
	
	if (a > b)
	{
		printf("a and b error\n");
		return 0;
	}

	for (i = 0; i < L->len; i++)
		if (L->ListData[i] > a)
			break;
	for (j = 0; j < L->len; j++)
		if (L->ListData[j] > b)
			break;

	len = L->len - (j - i);

	for (; j < L->len; j++)
	{
		L->ListData[i] = L->ListData[j];
		i++;
	}
	L->len = len;
}

/* 增删改查 之 删4 */
int DelABUnSorted(sq_list *L, int a, int b)
{
	int len = L->len;
	int j = 0;

	if (L->len == 0)
	{
		printf("已空\n");
		return 0;
	}

	if (a > b)
	{
		printf("a and b error\n");
		return 0;
	}

	for (int i = 0; i < L->len; i++)
	{
		if (L->ListData[i] < a || L->ListData[i] > b)
		{
			L->ListData[j++] = L->ListData[i];
		}else
		{
			len--;
		}
	}
	L->len = len;
	//这里还可以是L->len = j;  
	return 1;
}

/* 增删改查 之 查 */
int *FindByNum(sq_list *L, int n)
{
	if (n < 0 || n > L->len - 1)
	{
		printf("\n");
		return 0;
	}
	return &(L->ListData[n]);
}

/* 有序表的唯一化 */
void unique_sorted(sq_list *s)
{
	int i;
	int j = 0;
	int len = s->len;

	for (i = 1; i < s->len; i++)
	{
		if (s->ListData[j] != s->ListData[i])
		{
			s->ListData[j + 1] = s->ListData[i];
			j++;
		}
		else
		{
			len--;
		}
	}

	s->len = len;
}

/* 已知L1与L2中的数据元素按值非递减排列 
	归并L1和L2得到新的线性表L3,L3的数据元素也按值非递减排列(不改变表L1和L2)*/
void merge(sq_list *L1, sq_list *L2,sq_list *L3)
{
	int i = 0;
	int j = 0;
	int k = 0;
	while (i <= L1->len-1 && j <= L2->len-1)    //可以写成i< len ;
	//因为len表示顺序表已存的结点的数量,而i、j表示下标。所以不可写成i <= L1->len,
	{
		if (L2->ListData[j] <= L1->ListData[i])
		{
			L3->ListData[k++] = L2->ListData[j++];
		}
		else
		{
			L3->ListData[k++] = L1->ListData[i++];
		}
	}
	while (i <= L1->len)
	{
		L3->ListData[k++] = L1->ListData[i++];
	}
	while (j <= L2->len)
	{
		L3->ListData[k++] = L1->ListData[j++];
	}
	L3->len = k - 1;

}

int main()
{
	sq_list L0 = { {1,2,3,4,5},5 };     printf("%d\n", L0.len);PrintL(&L0);
	insert(&L0, 0, 8);                  printf("%d\n", L0.len);PrintL(&L0);
	Delete(&L0, 0);                     printf("%d\n", L0.len); PrintL(&L0);
	sq_list L11 = { {1,3,5,7,4,2},6 };
	//insert_sort(&L11);					PrintL(&L11);

	DelABUnSorted(&L11, 3, 7);				PrintL(&L11);

	sq_list s1 = { {3, 2, 21, 3, 9, 5, 2, 7, 5, 9, 9, 2}, 12 };
	insert_sort(&s1);
	PrintL(&s1);
	unique_sorted(&s1);
	PrintL(&s1);

	printf("----------------\n");

	sq_list L1 = { {1,3,5,7,9,11,13,15,17,19},10 };
	sq_list L2 = { {2,3,4,5,6},5 };
	sq_list L3;
	merge(&L1, &L2, &L3);
	PrintL(&L3);

	system("pause");
	return 0;
}

若有错误,欢迎指出,谢谢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员一修

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值