顺序表相关操作及具体实现

关于C语言处理顺序表的一些基本算法

1、初始化顺序表

2、判断为空

3、求顺序表表长

4、打印链表

5、删除或插入指定位置的元素

6、获得指定位置的元素

7、定位元素

8、删除指定值元素

9、删除某一数值范围的元素

10、删除重复元素

11、合并顺序表

12、逆置表

13、移动元素是得奇数元素在顺序表前

14、移动元素使得奇数元素在奇数位,偶数元素在偶数位

#include<stdio.h>
#define OK 1
#define ERROR -1
#define TRUE 1
#define FALSE -1
#define MAXSIZE 20 
typedef int Status;
typedef int ElemType;
typedef struct List {
	ElemType data[MAXSIZE];
	ElemType length;
}SqList;
void initList(SqList& L);
int isEmpty(SqList L);
int listLength(SqList& L);
void printList(SqList L);
Status listDelete(SqList& L, ElemType i, ElemType& e);
Status listInsert(SqList& L, ElemType i, ElemType e);
Status getElem(SqList L, ElemType i);
Status locateElem(SqList L, int x);
int delete_x(SqList& L, int x);
int deleteStoT(SqList& L, int s, int t);
int delete_repeate(SqList& L);
int merge_list(SqList A, SqList B, SqList& C);
int reverse(SqList& L, int n, int m);
int move1(SqList &L);
int move2(SqList &L);
int main() {
	int n, a, index, e, local, x;
	int m1, n1;
	SqList L1, L2, L3;
	initList(L1);    //初始化链表 
	initList(L2);
	initList(L3);
	printf("输入表长及元素:\n");    //创建链表 
	scanf("%d", &n);
	for (int i = 0; i < n; i++) {
		scanf("%d", &L1.data[i]);
		L1.length++;
	}
	printList(L1);
//	printf("请输入需要逆置的位置");
//	scanf("%d %d", &n1, &m1);
//	reverse(L1, n1, m1);
	
	move2(L1);
	printList(L1);

	//printf("输入表长及元素:\n");    //创建链表 
	//scanf("%d", &n);
	//for (int j = 0; j < n; j++) {
	//	scanf("%d", &L2.data[j]);
	//	L2.length++;
	//}



	//	printf("输入需要删除元素的序号 :\n");  //删除元素 
	//	scanf("%d",&index);
	//	if(listDelete(L,index,e)==1)
	//		printf("OK\n");
	//	else
	//		printf("ERROR\n");
	//	printf("表长:%d\n",listLength(L));
	//	printList(L);	
	//	
	//	printf("输入需要插入的元素位置:\n");  //插入元素 
	//	scanf("%d",&index);
	//	printf("输入需要插入的元素:\n");
	//	scanf("%d",&a);
	//	listInsert(L,index,a);
	//	printf("表长:%d\n",listLength(L));
	//	printList(L);
	//	
	//	printf("输入需要查找的元素位置:\n");   //查找元素 
	//	scanf("%d",&index);
	//	printf("对应位置的元素是 %d\n",getElem(L,index));
	//	printf("表长:%d\n",listLength(L));
	//	printList(L);
	//	
	//	printf("输入需要查找元素的值:\n");  //定位元素 
	//	scanf("%d",&a);
	//	local=locateElem(L,a);
	//	if(local==-1)
	//		printf("元素不存在\n");
	//	else
	//		printf("The order in which the element is located is元素在链表中的位置是:%d",local);
	//	printf("%d\n",listLength(L));
	//	printList(L);

	//	printf("输入需要删除指定元素的值x:\n");  //定位元素 
	//	scanf("%d",&x);
	//	delete_x(L,x);
	//	printf("%d\n",listLength(L));
	//	printList(L);
	//	
	//	int s,t;
	//	printf("输入需要删除指定区间元素的值:\n");  //定位元素 
	//	scanf("%d %d",&s,&t);
	//	deleteStoT(L,s,t);
	//	printf("%d\n",listLength(L));
	//	printList(L);
	//	
	//	delete_repeate(L);
	//	printf("删除重复值之后的链表:\n"); 
	//	printf("%d\n",listLength(L));
	//	printList(L);
	//merge_list(L1, L2, L3);
	//printList(L3);
	return 0;
}
void initList(SqList& L) {    //初始化链表 
	L.length = 0;
	//void initList(SqList L){
//	L.length=0;
//	return L;
//} 
//void initList(SqList* L){
//	L->length=0;   //or  (*L).length=0;
//}
}
int isEmpty(SqList L) {  //判断是否为空 
	if (L.length == 0) {
		return 1;
	}
	else
		return -1;
}
int listLength(SqList& L) {   //返回表长 
	return L.length;
}
void printList(SqList L) {   //打印顺序表 
	int j;
	//ElemType *p=null;     //链表打印 
//	p=L.data[0];
//	for(;p<(L.data+L.length);p++){
//		printf("%d",*p);
//	}
	printf("List:");
	if (L.length == 0) {
		printf("List is empty表为空\n");
	}
	else {
		for (j = 0; j < L.length; j++) {
			printf("%d-", L.data[j]);
		}
		printf("\n");
	}
}
Status listDelete(SqList& L, ElemType i, ElemType& e) {   //删除元素 
	int j;
	e = L.data[i - 1];
	if (i<1 || i>L.length) {   //wrongful不合法 
		return -1;
	}
	if (i < L.length) {
		for (j = i; j <= L.length - 1; j++) {
			L.data[j - 1] = L.data[j];
		}
	}
	L.length--;
	return TRUE;
}
//删除值为X的元素 
int delete_x(SqList& L, int x) {
	int count = 0;
	for (int i = 0; i < L.length; i++) {
		if (L.data[i] == x)
			count++;
		else {
			L.data[i - count] = L.data[i];
		}
	}
	L.length = L.length - count;
	return true;
}
//删除在区间s-t之间的元素 
int deleteStoT(SqList& L, int s, int t) {
	int count = 0;
	for (int i = 0; i < L.length; i++) {
		if (L.data[i] >= s && L.data[i] <= t) {
			count++;
		}
		else {
			L.data[i - count] = L.data[i];
		}
	}
	L.length = L.length - count;
	return true;
}
//删有序表所有值重复的元素
int delete_repeate(SqList& L) {
	int count = 0;
	for (int i = 1; i < L.length; i++) {
		if (L.data[i] == L.data[count])
			continue;
		else {
			count++;
			L.data[count] = L.data[i];
		}
	}
	L.length = count + 1;
	return true;
}
//两个递增有序表合并成一个递增有序表
int merge_list(SqList A, SqList B, SqList& C) {
	int i = 0;
	int j = 0;
	int k = 0;
	while (i < A.length && j < B.length) {
		if (A.data[i] <= B.data[j])
			C.data[k++] = A.data[i++];
		else
			C.data[k++] = B.data[j++];
	}
	while (i < A.length)
		C.data[k++] = A.data[i++];
	while (j < B.length)
		C.data[k++] = B.data[j++];

	C.length = k;
	return true;
}
//逆置n~m位置顺序表算法 
int reverse(SqList& L, int n, int m) {
	if (n > m || m > L.length - 1)
		return false;
	int mid = (m + n) / 2;
	for (int i = 0; i <= mid - n; i++) {
		int temp = L.data[n + i];
		L.data[n + i] = L.data[m - i];
		L.data[m - i] = temp;
	}
	return true;
}
//迫使偶数在奇数的前面 
int move1(SqList &L){
	int i=0,j=L.length-1;
	int temp;
	while(i<=j){
		while(L.data[i]%2==0) i++;
		while(L.data[j]%2==1) j--;
		if(i<j){
			temp=L.data[i];
			L.data[i]=L.data[j];
			L.data[j]=temp;
		}
	}
	return true;
}
//迫使偶数或奇数在偶数位或奇数位上
int move2(SqList &L){
	int i=0,j=1,temp;
	while(i<L.length||j<L.length){
		while(L.data[i]%2==0)	i+=2;
		while(L.data[j]%2==1)	j+=2;
		temp=L.data[i];
		L.data[i]=L.data[j];
		L.data[j]=temp;
	}
	return true;
} 
Status listInsert(SqList& L, ElemType i, ElemType e) {
	int j;
	if (L.length >= 20)   //list is full元素溢出 
	{
		return FALSE;
	}
	else if (i<1 || i>L.length + 1)  //out of range  超出范围 
	{
		return FALSE;
	}
	else if (i <= L.length) {  //match condition  符合条件 
		for (j = L.length; j >= i; j--) {
			L.data[j] = L.data[j - 1];
		}
	}
	L.data[i - 1] = e;
	L.length++;
	return TRUE;
}
Status getElem(SqList L, ElemType i) {  //search element  查找元素 
	if (i<1 || i>L.length)
	{
		return FALSE;
	}
	return L.data[i - 1];
}
Status locateElem(SqList L, int x) {  //定位元素
	int i;
	for (i = 0; i < L.length; i++) {
		if (L.data[i] == x)
			return i + 1;
	}
	return FALSE;
}
//void listReserve(SqList &L){     //顺序表逆置   利用遍历首尾交换 
//	int temp;
//	for(int 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;	
//	}
//}  

//void listInsert(SqList &L,int x){    //插入元素后仍然有序 
//	int i=0,j;
//	while(i<L.length&&x>=L.data[i]){   //找到第一个比x大的元素  找到该值的下标 
//		i++;
//	}
//	for(j=L.length-1;j>=i;j++){   // 
//		L.data[j+1]=L.data[i];
//	}
//	L.data[i]=x;
//	L.length++;  
//} 

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

hithithithithit

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

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

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

打赏作者

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

抵扣说明:

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

余额充值