顺序表的基本操作

    最近想用C把数据结构刷一遍,事实上当初学也是只理解了皮毛,只有实际动手才能有深刻的体会,闲话少说,直接上码。

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


#define LIST_INIT_SIZE	100		//顺序表存储空间的初始分配量
#define LISTINCREAMENT	10		//顺序表存储空间的分配增量


typedef struct  students
{
	char sno[5];			//学号
	char name[20];			//姓名
	char sex[3];			//性别
	int score;				//分数
}ElemType;


typedef struct  
{
	ElemType *elem;		//存储空间基址
	int length;			//当前长度
	int listsize;		//当前分配的存储容量(以sizeof(ElemType)为单位)
}SqList;


SqList * InitSqList();								// 构造空的顺序表
int InsertSqList(SqList *l, int n, ElemType *e);	// 在顺序表第 n 个位置之前插入新元素 e
int AppendSqList(SqList *l, ElemType *e);			// 在末尾追加元素e
bool IsEmpty(SqList *l);							// 判断是否为空
bool IsFull(SqList *l);								// 判断是否为满
void FreeSqList(SqList *l);							// 释放顺序表
int DeleteSqList(SqList *l, int n, ElemType *e);		// 在顺序表中删除第 n 个元素,并用 e 返回其值
void PrintSqList(SqList *l);						// 打印


ElemType stu[4] = 
{
	{"S101","张三","男",80},
	{"S102","李四","女",75},
	{"S103","王五","男",90},
	{"S104","笨蛋","女",85}
};



int main()
{
	int i;
	SqList * list = InitSqList();	
	ElemType t;

	if (IsEmpty(list))
	{
		printf("list is empty\n\n");
	}

	for (i = 0; i < 3; ++i)
	{
		InsertSqList(list,i + 1,&stu[i]);
	}
	PrintSqList(list);
	printf("\n\n");

	AppendSqList(list,&stu[3]);
	PrintSqList(list);
	printf("\n\n");

	DeleteSqList(list,2,&t);
	PrintSqList(list);
	printf("\n\n");

	FreeSqList(list);
	PrintSqList(list);

	return 0;
}


// 构造空的顺序表
SqList * InitSqList()
{
	SqList * l = (SqList *)malloc(sizeof(SqList));
	if (NULL == l)
	{
		exit(0);
	}
	
	l->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
	if (NULL == l->elem)
	{
		exit(0);
	}
	
	l->length = 0;
	l->listsize = LIST_INIT_SIZE;
	return l;
}


// 在顺序表第n个位置之前插入新元素e
int InsertSqList(SqList *l, int n, ElemType *e)
{
	ElemType *newelem = NULL, *t = NULL, *p = NULL;
	int i;

	if (NULL == l || n < 1 || n > l->length + 1 || NULL == e)
	{
		return 0;
	}
	if (IsFull(l))
	{
		newelem = (ElemType *)realloc(l->elem, (l->listsize + LISTINCREAMENT) * sizeof(ElemType));
		l->elem = newelem;
		l->listsize += LISTINCREAMENT;
	}	
//	t = &l->elem[n - 1];
	for (i = l->length - 1; i >= n - 1; --i)			//插入位置及之后的元素右移,下面那种实现也可以
	{
		l->elem[i] = l->elem[i - 1];
	}
// 	for(p = &(l->elem[l->length-1]); p >= t; p--)
// 	{
// 		*(p+1) = *p;							//插入位置及之后的元素右移
// 	}
//	*t = *e;
	l->elem[n - 1] = *e;
	++l->length;
	return 1;
}


// 在末尾追加元素e
int AppendSqList(SqList *l, ElemType *e)
{
	ElemType *newelem = NULL, *t = NULL;

	if (NULL == l || NULL == e)
	{
		return 0;
	}
	if (IsFull(l))
	{
		newelem = (ElemType *)realloc(l->elem,(l->listsize + LISTINCREAMENT) * sizeof(ElemType));
		if (NULL == newelem)
		{
			return 0;
		}
		l->elem = newelem;
		l->listsize += LISTINCREAMENT;
	}
// 	t = &l->elem[l->length];
// 	*t = *e;
	l->elem[l->length] = *e;
	++l->length;
	return 1;
}


// 判断是否为空
bool IsEmpty(SqList *l)
{
	if (0 == l->length)
	{
		return true;
	}
	else
	{
		return false;
	}
}


// 判断是否为满
bool IsFull(SqList *l)
{
	if (LIST_INIT_SIZE == l->length)
	{
		return true;
	} 
	else
	{
		return false;
	}
}


// 释放顺序表
void FreeSqList(SqList *l)
{
	free(l->elem);
	free(l);
}


// 在顺序表中删除第 n 个元素,并用 e 返回其值
int DeleteSqList(SqList *l, int n, ElemType *e)
{
	int i;

	if (NULL == l || n < 1 || n > l->length || NULL == e)
	{
		return 0;
	}
	*e = l->elem[n - 1];
	for (i = n - 1; i < l->length; ++i)
	{
		l->elem[i] = l->elem[i + 1];
	}

	--l->length;
	return 1;
}


// 打印
void PrintSqList(SqList *l)
{
	int i;

	if (IsEmpty(l))
	{
		printf("list is empty !\n");
	}
	else
	{
		for (i = 0; i < l->length; ++i)
		{
			printf("%s\t%s\t%s\t%d\n",l->elem[i].sno,l->elem[i].name,l->elem[i].sex,l->elem[i].score);
		}
	}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
顺序表是一种线性表,它的基本操作包括初始化、插入、删除、查找、遍历等。下面是顺序表基本操作的实现方法: 1. 初始化:顺序表的初始化包括动态分配内存空间和初始化表头信息。具体实现方法如下: ``` Status InitList(SqList &L) { L.elem = (ElemType*)malloc(LIST_INIT_SIZE * sizeof(ElemType)); if (!L.elem) exit(OVERFLOW); L.length = 0; L.listsize = LIST_INIT_SIZE; return OK; } ``` 2. 插入:在顺序表的第i个位置插入元素x,需要将第i个位置及其后面的元素依次后移一位,然后将x插入到第i个位置。具体实现方法如下: ``` Status ListInsert(SqList &L, int i, ElemType x) { if (i < 1 || i > L.length + 1) return ERROR; if (L.length >= L.listsize) { ElemType* newbase = (ElemType*)realloc(L.elem, (L.listsize + LISINCREMENT) * sizeof(ElemType)); if (!newbase) exit(OVERFLOW); L.elem = newbase; L.listsize += LISINCREMENT; } ElemType* q = &(L.elem[i - 1]); for (ElemType* p = &(L.elem[L.length - 1]); p >= q; --p) *(p + 1) = *p; *q = x; ++L.length; return OK; } ``` 3. 删除:删除顺序表的第i个元素,需要将第i+1个位置及其后面的元素依次前移一位,然后将表长减1。具体实现方法如下: ``` Status ListDelete(SqList &L, int i) { if (i < 1 || i > L.length) return ERROR; ElemType* p = &(L.elem[i - 1]); ElemType* q = L.elem + L.length - 1; for (++p; p <= q; ++p) *(p - 1) = *p; --L.length; return OK; } ``` 4. 查找:查找顺序表中值为x的元素,需要依次遍历顺序表中的每个元素,直到找到值为x的元素或者遍历完整个顺序表。具体实现方法如下: ``` int LocateElem(SqList L, ElemType x) { int i; ElemType* p = L.elem; for (i = 1; i <= L.length; ++i, ++p) if (*p == x) return i; return 0; } ``` 5. 遍历:遍历顺序表中的每个元素,可以使用for循环或者while循环实现。具体实现方法如下: ``` void ListTraverse(SqList L) { int i; ElemType* p = L.elem; for (i = 1; i <= L.length; ++i, ++p) printf("%d ", *p); printf("\n"); } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值