Chap2 - 1.顺序表;《数据结构》-C语言版本源码实现,严蔚敏版

本文深入解析了顺序表的实现原理及关键操作,包括初始化、清空、销毁、判断空表、获取长度、元素检索、前后元素查找、插入、遍历和删除等。通过具体代码示例,展示了如何在C语言中有效管理和操作顺序表。

0·说明:

本文源码参考书籍和网上资料,如果有错误之处还请指出,欢迎大家一起交流。其中一些关键字需要参考Chap1。下面是干货分享:

1.sequenceList.c

#include "sequenceList.h"

Status InitList_Sq(SqList *L)
{
	(*L).elem = (ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
	if(!(*L).elem)
		exit(OVERFLOW);      //内存分配失败

	(*L).length = 0;   //初始化顺序表长度为0;
	(*L).listsize = LIST_INIT_SIZE;

	return OK;
}

void ClearList_Sq(SqList *L)
{
	(*L).length = 0;
}

void DestroyList_Sq(SqList *L)
{
	free((*L).elem);
	
	(*L).elem = NULL;
	(*L).length = 0;
	(*L).listsize = 0;
}

//判断单链表是否为空表
Status ListEmpty_Sq(SqList L)
{
	return L.length==0 ? TRUE:FALSE;
}

int ListLength_Sq(SqList L)
{
	return L.length;
}

Status GetElem_Sq(SqList L,int i,ElemType *e)
{
	if(i<1 || i>L.length)
		return ERROR;
	else
		*e = L.elem[i-1];

	return OK;
}

int LocateElem_Sq(SqList L,ElemType e,Status(Compare)(ElemType,ElemType))
{
	int i=1;

	while(i<=L.length && !Compare(e,L.elem[i-1]))
		++i;

	if(i<=L.length)
		return i;
	else 
		return ERROR;
}


Status NextElem_Sq(SqList L,ElemType cur_e,ElemType *next_e)
{
	int i=0;

	for(i=0;i<L.length;i++)
		if(L.elem[i] == cur_e)
			break;
	
	if(i==L.length)
		return ERROR;
	else
		*next_e = L.elem[i+1];

	return OK;
}

Status PriorElem_Sq(SqList L,ElemType cru_e,ElemType *pre_e)
{
	int i=0;

	while(i<L.length && L.elem[i] != cru_e)
		i++;

	if(i<L.length)
	{
		*pre_e = L.elem[i-1];
		return OK;
	}

	return ERROR;
}


//向单链表L的第i位插入数据e
Status ListInsert_Sq(SqList *L,int i,ElemType e)
{
	ElemType *newbase;
	ElemType *p,*q;

	if(i<1 || i>(*L).length+1)  //i值不合法
		return ERROR;

	if((*L).length >= (*L).listsize)  //若存储空间已满,需要开辟新空间
	{
		newbase = (ElemType*)realloc((*L).elem,((*L).listsize+LISTINCREMENT)*sizeof(ElemType));
		if(!newbase)
			exit(OVERFLOW);
		(*L).elem = newbase;
		(*L).listsize += LISTINCREMENT;
	}

	q = &(*L).elem[i-1];  //q为插入位置

	for(p=&(*L).elem[(*L).length-1];p>=q;--p)
		*(p+1) = *p;
	
	*q = e;
	(*L).length ++;
	
	return OK;
}


//对元素进行函数调用
Status ListTraverse_Sq(SqList L,void(Visit)(ElemType))
{
	int i;

	for(i=0;i<L.length;i++)
		Visit(L.elem[i]);

	return OK;
}


//删除L中第i个元素,并且返回被删除的值
Status ListDelete_Sq(SqList *L,int i,ElemType *e)
{
	if(i<1 || i>(*L).length)
		return ERROR;
	
	*e = (*L).elem[i-1];

	for(i=i-1;i<(*L).length-1;i++)
		(*L).elem[i] = (*L).elem[i+1];

	(*L).length --;

	return OK;
}

/*
//第1种尝试,不可行:
  ElemType *p;
	for(i=i-1;i<(*L).length-1;i++)
	{
		*p = (*L).elem[i+1];
		(*L).elem[i] = *p;
	}

  改正,需要对P指针进行初始化

//第2种尝试,可行
  	for(i=i-1;i<(*L).length-1;i++)
		(*L).elem[i] = (*L).elem[i+1];

//第3种尝试,可行
	ElemType temp;
	for(i=i-1;i<(*L).length-1;i++)
	{
		temp = (*L).elem[i+1]; 
		(*L).elem[i] = temp;
	}
*/

2.sequenceList.h

#ifndef _SEQUENCELIST_H
#define _SEQUENCELIST_H

#include <stdio.h>
#include <stdlib.h>
#include "Status.h"

typedef int ElemType;

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

typedef struct
{
	ElemType *elem;    //存储空间基地址;
	int length;   //当前顺序表长度;
	int listsize; //当前分配的存储空间容量;
}SqList;


Status InitList_Sq(SqList *L);
void ClearList_Sq(SqList *L);
void DestroyList_Sq(SqList *L);
Status ListEmpty_Sq(SqList L);
int ListLength_Sq(SqList L);
Status GetElem_Sq(SqList L,int i,ElemType *e);
int LocateElem_Sq(SqList L,ElemType e,Status(Compare)(ElemType,ElemType));
Status ListTraverse_Sq(SqList L,void(Visit)(ElemType));
Status ListDelete_Sq(SqList *L,int i,ElemType *e);
Status ListInsert_Sq(SqList *L,int i,ElemType e);
Status NextElem_Sq(SqList L,ElemType cur_e,ElemType *next_e);
Status PriorElem_Sq(SqList L,ElemType cru_e,ElemType *pre_e);

#endif

3.main.c

#include "sequenceList.h"

void printf_Elem(ElemType elem)
{
	printf("%d	",elem);
}

void main()
{
	SqList La;
	int i;
	ElemType temp_Elem;

	InitList_Sq(&La);
	ListEmpty_Sq(La) ? printf("La 为空!\r\n") : printf("La 不为空!\r\n");

	for(i=1;i<=6;i++)
	{
		printf("在La第%d个位置插入:\"%d\"\r\n",i,2*i);
		ListInsert_Sq(&La,i,2*i);
	}
	ListEmpty_Sq(La) ? printf("La 为空!\r\n") : printf("La 不为空!\r\n");

	ListTraverse_Sq(La,printf_Elem);
	printf("\r\n");

	ListDelete_Sq(&La,3,&temp_Elem);
	printf("删除的第%d元素为:%d\r\n",3,temp_Elem);

	ListTraverse_Sq(La,printf_Elem);
	printf("\r\n");

	printf("插入元素9在第3位\r\n");
	ListInsert_Sq(&La,3,9);
	ListTraverse_Sq(La,printf_Elem);
	printf("\r\n");

	NextElem_Sq(La,4,&temp_Elem);
	printf("4后面的元素为:%d\r\n",temp_Elem);

	PriorElem_Sq(La,10,&temp_Elem);
	printf("10前面的元素为:%d\r\n",temp_Elem);

	while(1);
}

4.预期结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值