顺序表的基本操作,以及排序,二分查找等

arr.h文件

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
#define maxsize 1
typedef int datetype;
typedef struct seqlist
{
	datetype *myarr;
	size_t size;
	
	size_t capicity;
}seqlist,*pseqlist;
void initseqlist(pseqlist pseq);//初始化顺序表
void sqpushback(pseqlist pseq, datetype date);//尾插法插入元素
void sqpopback(pseqlist pseq);//尾删
void sqpushfront(pseqlist pseq, datetype date);//头插
void sqpopfront(pseqlist pseq);//头删
void sqprint(pseqlist pseq);//打印顺序表
void sqcheckcapicity(pseqlist pseq);//增容
void sqemptymyarr(pseqlist pseq);//判空
void sqpushpos(pseqlist pseq,int pos, datetype date);//在pos位插入
void sqpoppos(pseqlist pseq, int pos);//在pos位删除
void sqfinddate(pseqlist pseq, datetype x);//寻找x元素的下标
void sqdestory(pseqlist pseq);//清空所创建的空间
void sqmodify(pseqlist pseq, int pos, datetype x);//修改pos位的值
void sqremove(pseqlist pseq, datetype x);//删除元素
void sqbubblesort(pseqlist pseq);//冒泡排序
void sqremoveall(pseqlist pseq, datetype x);//删除所有x元素
void sqremoveall2(pseqlist pseq, datetype x);
void sqbinaryfind(pseqlist pseq, datetype x);//二分查找

arr.c文件

#include"arr.h"
void sqinitseqlist(pseqlist pseq,size_t capicity)//初始化顺序表
{
	assert(pseq);
		pseq->capicity = maxsize;
		pseq->size = 0;
	pseq->myarr= (datetype*)malloc(sizeof(datetype)*capicity);
	assert(pseq->myarr);
	if (pseq->myarr ==NULL)
		printf("创建失败");
	
}
void sqpushback(pseqlist pseq, datetype  date)//尾插法插入元素
{
	assert(pseq);
	sqcheckcapicity( pseq);
	pseq->myarr[pseq->size] = date;
	pseq->size++;
}
 void sqcheckcapicity(pseqlist pseq)//检查容量并增容
{
	assert(pseq);
	if (pseq->size == pseq->capicity)
	{
		if (pseq->capicity == 0)
		{
			pseq->capicity = 2;
		}
		datetype * temp=(datetype *)realloc(pseq->myarr, pseq->capicity * 2 * sizeof(datetype));
		pseq->myarr = temp;
		pseq->capicity *= 2;
	}
	return pseq;
}
void sqemptymyarr(pseqlist pseq)//判空
{
	assert(pseq);
	if (pseq->size == 0)
		printf("顺序表为空");
}

void sqprint(pseqlist pseq)//打印顺序表
{
	assert(pseq);
	for (int i = 0; i<(pseq-> size); i++)
	{
		printf("%d ", pseq->myarr[i]);

	}printf("\n");
}
void sqpopback(pseqlist pseq, datetype  date)//尾删
{
	assert(pseq);
	sqemptymyarr(pseq);
	pseq->size--;
	return pseq;
}
void sqpushfront(pseqlist pseq, datetype  date)//头插
{
	assert(pseq);
	sqcheckcapicity(pseq);
	for (int i = (pseq->size-1); i >=0; i--)//从后往前挪
	{
		pseq->myarr[i+1] = pseq->myarr[i];
	}
	pseq->myarr[0] = date;
	pseq->size++;
}

void sqpopfront(pseqlist pseq)//头删
{
	assert(pseq);
	sqemptymyarr(pseq);//从前往后挪
	for (int i = 0; i < (pseq->size); i++)
	{
		pseq->myarr[i] = pseq->myarr[i + 1];
	}
	pseq->size--;
}
void sqpushpos(pseqlist pseq, int pos,datetype date)//在pos位插入
{
	assert(pseq);
	sqcheckcapicity(pseq);

	if (pos<1 || pos>pseq->size)
		printf("插入位置不合法\n");
	else
	{
		for (int i = (pseq->size); i>(pos - 1); i--)
		{
			pseq->myarr[i] = pseq->myarr[i - 1];
		}
		pseq->myarr[pos - 1] = date;
		pseq->size++;

	}
	
}
void sqpoppos(pseqlist pseq, int pos)//在pos位删除
{
	assert(pseq);
	sqemptymyarr(pseq);
	if (pos<1 || pos>pseq->size)
	{
		printf("删除位置不合法\n");
	}
	else
	{
		for (int i = (pos - 1); i<(pseq->size); i++)
		{
			pseq->myarr[i] = pseq->myarr[i + 1];
		}
		pseq->size--;
	}
}
void sqfinddate(pseqlist pseq, datetype x)
{
	assert(pseq);
	int flag = 0;
	for (int i = 0; i < (pseq->size); i++)
	{
		if (pseq->myarr[i] == x)
		{
			printf("%d ", i); flag = 1;//可以找到x元素的所有下标
		}
			
	}printf("\n");
	if (flag == 0)
		printf("没有找到此元素\n");
	
}
void sqdestory(pseqlist pseq)//清空所创建的空间
{
	assert(pseq);
	pseq->size = 0;
	pseq->capicity = 0;
	free(pseq->myarr);
	sqemptymyarr(pseq);
	
}
void sqmodify(pseqlist pseq, int pos, datetype x)//修改pos位的值
{
	assert(pseq);
	if (pos<1 || pos>pseq->size)
		printf("修改位置不合法\n");
	else
	{
		pseq->myarr[pos-1] = x;
	}
	
}
void sqremove(pseqlist pseq, datetype x)//删除元素
{
	assert(pseq);
	sqemptymyarr(pseq);
	int count = 0; int flag = 0;
	for (int i = 0; i < (pseq->size); i++)
	{
		if (pseq->myarr[i] == x)
			flag = 1;


	}
	if (flag == 0)
	{
		printf("没找到\n");
		return;
	}
	for (int i = 0; i < (pseq->size); i++)
	{
		
		if ((pseq->myarr[i]) == x)
		{
		
			for (count; count< (pseq->size);count++)
			{
				pseq->myarr[count] = pseq->myarr[count+1];
			}
			
		}
		count++;
	}
	pseq->size--;
}
void sqremoveall(pseqlist pseq, datetype x)//删除所有x元素   //垃圾算法,赶紧优化0
{
	assert(pseq);
	sqemptymyarr(pseq);
	int temp = 0; int flag = 0;
	for (int i = 0; i < (pseq->size); i++)
	{
		if (pseq->myarr[i] == x)
			flag = 1;


	}
	if (flag == 0)
	{
		printf("没找到\n");
		return;
	}
	for (int i = 0; i < (pseq->size); i++)
	{
		int j = temp;
		if ((pseq->myarr[i]) == x)
		{

			for (; j< (pseq->size);j++)
			{
				pseq->myarr[j] = pseq->myarr[j+ 1];
			}
			i--; temp--;
			pseq->size--;
		}
		temp++;//让temp和i保持一致

	}
}

void sqbubblesort(pseqlist pseq)//冒泡排序
{
	sqemptymyarr(pseq);
	for (int i = 0; i < (pseq->size-1); i++)
	{
		for (int j = 0; j < (pseq->size - i - 1); j++)
		{
			if (pseq->myarr[j]>pseq->myarr[j + 1])
			{
				int temp = pseq->myarr[j + 1];
				pseq->myarr[j + 1] = pseq->myarr[j];
				pseq->myarr[j] = temp;
			}
		}
	}
}
void sqremoveall2(pseqlist pseq, datetype x)
{
	int src = 0; int dst = 0; int flag = 0;
	for (int i = 0; i < (pseq->size); i++)
	{
		if (pseq->myarr[i] == x)
			flag = 1;
	}
	if (flag == 0)
	{
		printf("没找到\n");
		return;
	}
		
	while (src < (pseq->size))
	{
		if (pseq->myarr[src] == x)
		{
			src++; 
		}
		else
		{
			dst = src;
			printf("%d ",pseq->myarr[dst]);//只是打印出不为x元素下标所对应的元素,
										//	如果将src的值给dst就可以使用循环将dst打印出来
			src++;
		}
	}
	printf("\n");
}
void sqbinaryfind(pseqlist pseq,datetype x)//二分查找
{
	sqemptymyarr(pseq);
	int left = 0; int right = pseq->size ; int mid = (left + right) / 2;
	while (left <= right)
	{
		if (pseq->myarr[mid] > x)
		{
			right = mid - 1;
			mid = (left + right) / 2;
		}
		if (pseq->myarr[mid] <x)
		{
			left = mid + 1;
			mid = (left + right) / 2;
		}
		if (pseq->myarr[mid] == x)
		{
			printf("找到了,下标为%d\n",mid);
			return;
		}
	}
	printf("没有找到此元素\n");

}

test.c文件

#include"arr.h"
#define _CRT_SECURE_NO_WARNINGS 1
int main()
{
	seqlist  s;
	
	sqinitseqlist(&s);
	sqpushback(&s,  1);//尾插
	sqpushback(&s,  2);//尾插
	sqpushback(&s, 3);//尾插
	sqpushback(&s, 4);//尾插
	sqprint(&s);
	sqpopback(&s);//尾删
	sqprint(&s);
	sqpushfront(&s, 7);//头插
	sqpushfront(&s, 8);
	sqprint(&s);
	sqpopfront(&s);//头删
	sqprint(&s);


	sqpushpos(&s, 2, 9);//在pos位置插入
	sqprint(&s);
	sqpoppos(&s, 1);//在pos位删除
    sqprint(&s);
	sqpushpos(&s, 2, 7);//在pos位置插入
	sqprint(&s);
	sqpushpos(&s, 4, 7);//在pos位置插入
	sqprint(&s);
	sqfinddate(&s, 2);
	sqfinddate(&s, 3);
	sqpushpos(&s, 5, 7);
	sqmodify(&s, 3, 55);//修改pos位的值
	
	sqprint(&s);
	sqremove(&s, 7);//删除某个元素
	sqremoveall(&s,7);//删除所有x元素
	sqprint(&s);
	//sqremoveall2(&s, 7);
	sqpushback(&s, 1);//尾插
	sqpushback(&s, 2);//尾插
	sqpushback(&s, 3);//尾插
	sqpushback(&s, 4);//尾插
	sqbubblesort(&s);//排序
	sqprint(&s);
	sqbinaryfind(&s, 4);
	//sqprint(&s);
	//sqdestory(&s);//清空所创建的空间
	//sqprint(&s);
}


总结:万事开头难,以为自己不会写,看了看别人写的,大概悟出了一些东西,结构体挺难,写代码要细心,不能忽略一些极端情况,也要弄清楚边界问题。
加油咯,生活不易,努力学习。

发布了24 篇原创文章 · 获赞 4 · 访问量 2631

猜你喜欢

转载自blog.csdn.net/weixin_41548145/article/details/103076195
今日推荐