c语言实现顺序表

c语言实现顺序表

  • 实现方法参考严蔚敏老师的数据结构教材

  • 采用动态分配内存的方法

list.h

/* list.h--顺序表接口 */
#ifndef LIST_H_
#define LIST_H_
#include <stdbool.h>

#define LIST_INIT_SIZE 2
#define LIST_INCREMENT 10

typedef int Item;

typedef struct
{
	Item *elem;
	int listsize;
	int length;
}List;

/*初始化一个列表*/
void InitializeList(List * plist);

/*销毁列表*/
void DestroyList(List *plist);

/*将列表重置为空表*/
void ClearList(List *plist);
/*判断列表是否为空*/
bool ListIsEmpty(const List plist);

/*判断列表是否已满*/
//bool ListIsFull(const List plist);

/*返回列表中项目的个数*/
unsigned int ListItemCount(const List plist);

/*向列表尾部添加一个项目*/
//bool AddItem(List &plist, Item e);

/*删除列表尾部的一个元素,并将其值返回e*/
//bool popItem(List &plist, Item *e);

/*在位置i之前插入一个元素e*/
bool InsertItem(List *plist, int i, Item e);

/*删除第i个数据元素并用e返回其值*/
bool DeleteItem(List *plist, int i, Item *e);

/*获取第i个数据元素的值并用e返回*/
bool GetElem(List plist, int i, Item *e);

/*查找表中第一个值为e的元素并返回数据元素的位序*/
int LocateList(List plist, Item e);

/*返回当前元素的前驱*/
bool PriorElem(List plist, Item cur_e, Item *pri_e);

/*返回当前元素的后继*/
bool NextElem(List plist, Item cur_e, Item *Nex_e);

/*遍历*/
void TravelList(List plist);

#endif

list.c

/* list.c列表操作的函数 */
#include <stdio.h>
#include <stdlib.h>
#include "list.h"

#define OVERFLOW -1
#define ERROR 0
#define OK 1

void InitializeList(List * plist) {
	plist->elem = (Item* )malloc(LIST_INIT_SIZE*sizeof(Item));
	if (!plist->elem)
		exit(OVERFLOW);
	plist->length = 0;
	plist->listsize = LIST_INIT_SIZE;
}

void DestroyList(List *plist) {
	free(plist->elem);
	plist->elem = NULL;
	plist->length = 0;
	plist->listsize = 0;
}

void ClearList(List *plist) {
	plist->length = 0;
}

bool ListIsEmpty(const List plist) {
	return plist.length == 0;
}


unsigned int ListItemCount(const List plist) {
	return plist.length;
}

bool InsertItem(List *plist, int i, Item e) {
	if (i < 1 || i > plist->length + 1)
		return ERROR;
	if (plist->length >= plist->listsize) {
		Item *newbase;
		newbase = (Item* )realloc(plist->elem, (plist->listsize + LIST_INCREMENT) *sizeof(Item));
		if (!newbase) {
			exit(OVERFLOW);
		}
		plist->listsize += LIST_INCREMENT;
		plist->elem = newbase;

	}
	Item *q = &(plist->elem[i - 1]);
	for (Item *p = &(plist->elem[plist->length - 1]); p>=q; p--) {
		*(p + 1) = *p;
	}
	*q = e;
	plist->length++;
	return OK;
}

bool DeleteItem(List *plist, int i, Item *e) {
	if (i < 1 || i > plist->length + 1)
		return ERROR;
	Item *q = &(plist->elem[i - 1]);
	Item *p = &(plist->elem[plist->length - 1]);
	*e = *q;
	for (q++; q <= p; q++)
	{
		*(q - 1) = *q;
	}
	plist->length--;
	return OK;
}

bool GetElem(List plist, int i, Item *e) {
	if (i < 1 || i > plist.length + 1)
		return ERROR;
	*e = plist.elem[i - 1];
	return OK;
}

int LocateList(List plist, Item e) {
	for (int i = 0; i < plist.length; i++) {
		if (plist.elem[i] == e) {
			return (i+1);
		}
	}
	printf("Not exit! ");
	return ERROR;
}

bool PriorElem(List plist, Item cur_e, Item *pri_e) {
	Item *p = plist.elem;
	for (int i = 0; i < plist.length; i++,p++) {
		if (i == 0 && *p == cur_e) {
			printf("无前驱元素");
			return ERROR;
		}

		if (*p == cur_e) {
			*pri_e = *--p;
			return OK;
		}
	}
	printf("没有此值");
	return ERROR;
}

bool NextElem(List plist, Item cur_e, Item *Nex_e) {
	Item *p = plist.elem;
	for (int i = 0; i < plist.length; i++,p++) {
		if (i != plist.length - 1 && *p == cur_e) {
			*Nex_e = *++p;
			return OK;
		}
		if (*p == cur_e) {
			printf("无后继元素");
			return ERROR;
		}

	}
	printf("没有此值");
	return ERROR;
}

void TravelList(List plist) {
    int *p = plist.elem;

    for (int i = 0; i < plist.length; i++,p++)
    {
        printf("%d: ", i+1);
        printf("%d\n", *p);
    }
}

用于测试的函数main.c

#include "list.h"
#include <stdio.h>
int main () {
	List L;
	Item e;
	InitializeList(&L);
	ClearList(&L);
	printf("%d\n", L.listsize);
	InsertItem(&L, 1 , 2);
	InsertItem(&L, 2 , 3);
	printf("%d\n", L.listsize);
	InsertItem(&L, 3 , 5);
	printf("%d\n", L.listsize);
	TravelList(L);
	PriorElem(L, 3, &e);
	printf("the Prior of the elem whose value is 3 is %d\n", e);
	NextElem(L, 3, &e);
	printf("the Next of the elem whose value is 3 is %d\n", e);
	DeleteItem(&L, 1, &e);
	printf("the delete elem is %d\n",e);
	TravelList(L);
	printf("the count of the elem is %d\n", ListItemCount(L));
	GetElem(L, 2, &e);
	printf("get the second location's value is %d\n", e);
	printf("get the position of whose value is 5 is %d\n", LocateList(L, 5));
	DestroyList(&L);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值