各种线性表的操作

#include<stdio.h>
#include<SeqList.h>

void SplitSeqList(SeqList *L);

void main()
{
	int flag, i, n;
	DataType e;
	SeqList L;
	int a[] = { -7, 0, 5, -8, 9, -4, 3, -2 };
	InitList(&L);
	n = sizeof(a) / sizeof(a[0]);
	for (i = 1; i <= n; i++)
	{
		if (InsertList(&L, i, a[i - 1]) == 0)
		{
			printf("位置不合适!");
			return ;
		}
	}
	printf("顺序表L中元素:");
	for (i = 1; i <= L.length; i++)
	{
		flag = GetElem(L, i, &e);
		if (flag == 1)
			printf("%4d", e);
	}
	printf("\n");

	printf("调整后的顺序表L为:");
	SplitSeqList(&L);
	for (i = 1; i <= L.length; i++)
	{
		flag = GetElem(L, i, &e);
		if (flag == 1)
			printf("%4d", e);
	}
	printf("\n");
	
}
void SplitSeqList(SeqList *L)
{
	int i, j;
	DataType e;
	i = 0;
	j = L->length - 1;
	while (i < j)
	{
		while (L->list[i] >= 0)
			i++;
		while (L->list[j] < 0)
			j++;
		if (i < j)
		{
			e = L->list[i];
			L->list[i] = L->list[j];
			L->list[j] = e;
		}
	}
}

/*SeqList.h*/
#include "stdio.h"
#include "math.h"

#define LISTSIZE 100
typedef int DataType;

typedef struct {
	DataType list[LISTSIZE];
	int length;
}SeqList;

/******************************************************
C 语言中
结构体变量用         .   运算符来访问结构体的成员
指向结构体的指针用   ->  来访问其指向的结构体的成员
*******************************************************/


// 1  初始化顺序表,将顺序表的长度置为0
void InitList(SeqList *L) {
	L->length = 0;
}


// 2  判断顺序表是否为空,为空返回1,不空返回0
int ListEmpty(SeqList L) {
	if (L.length == 0)
		return 1;
	else
		return 0;
}


// 3  按序号查找操作
int GetElem(SeqList L, int i, DataType *e)
{
	/*查找顺序表中第 i 个元素
	查找成功将该值返回给 e ,并返回 1 ;否则返回 -1 ,表示失败*/

	if (i<1 || i>L.length)   //查找之前判断序号是否合法
		return -1;
	*e = L.list[i - 1];      //将第 i 个元素赋值给 e
	return 1;
}


// 4  按内容查找操作
int LocateElem(SeqList L, DataType e) 
{
	/*查找顺序表中元素值为 e 的元素
	查找成功,将对应元素的序号返回;否则返回0,表示失败*/
	int i;
	for (i = 1; i <= L.length; i++)
	{
		if (L.list[i-1] == e)
			return i;           //返回的序号要搞清楚,从0开始
	}
	return 0;
}


// 5  插入操作
/*
插入                  i                  长度j
序号  1   2   3   4   5   6   7   8   9   10

list[i-1]            list[j-1]   list[j]
list  0   1   2   3   4   5   6   7   8   9
*/
int InsertList(SeqList *L, int i, DataType e)
{
	/*在顺序表的第 i 个位置插入 元素 e ,插入成功返回 1;
	插入位置不和法,返回 -1;
	顺序表满返回  0 */

	int j;
	if (i<1 || i > L->length + 1)
	{
		printf("插入位置不合法 !");
		return -1;
	}
	else if (L->length >= LISTSIZE)
	{
		printf("顺序表已满不能插入 !");
		return 0;
	}
	else
	{
		for (j = L->length; j >= i; j--)
			L->list[j] = L->list[j - 1];
		L->list[i - 1] = e;          //插入元素到底 i 个位置 
		L->length = L->length + 1;              //顺序表长度 +1
		return 1;
	}
}

// 6 删除操作
/*
删除                   i                  长度j
序号   1   2   3   4   5   6   7   8   9   10

list[i-1]            list[j-1]
list   0   1   2   3   4   5   6   7   8   9
*/
int DeleteList(SeqList *L, int i, DataType *e)
{
	int j;
	if (i<1 || i>L->length)
	{
		printf("删除位置不合法!");
		return -1;
	}
	else if (L->length <= 0) {
		printf("顺序表已空,不能进行删除操作!");
		return 0;
	}
	else
	{
		*e = L->list[i - 1];          //删除的值保存到 e 中,以防要用
		for (j = i; j <= L->length - 1; j++)
			L->list[j - 1] = L->list[j];
		L->length = L->length - 1;
		return 1;
	}

}

// 7 获取长度
int ListLength(SeqList L) {
	return L.length;
}

//清空操作
void ClearList(SeqList *L) {
	L->length = 0;
}

//遍历输出
void traversalList(SeqList L)
{
	int i,flag;
	DataType e;
	for (i = 1; i <= L.length; i++)
	{
		flag = GetElem(L, i, &e);
		if (flag == 1)
			printf("%4d", e);
	}
	printf("\n");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值