线性表的基本操作(顺序表)

本文介绍了一个简单的线性表操作实现,包括初始化、插入、删除等基本功能,并提供了完整的C语言代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#define MAXSIZE 10
#define ALPHA 20

typedef struct{
	char name[ALPHA];
	int n;
}Item;

typedef struct{
	Item *item;			//指向数据的指针 
	int len;			//个数 
}List;

void InitList(List *l);	//初始化操作,建立一个空线性表 
void DestroyList(List *l);	//销毁线性表 
void ClearList(List *l);	//清空线性表 
bool IsEmpty(List *l);		// 空返回 true  不空 返回 false
int ListLength(List *l);		//返回元素个数 
bool ListInsert(List *l, int i, Item e);	// 在第 i 个位置 插入元素 
bool ListDelete(List *l, int i, Item * e);	// 删除 第 i 个位子的元素 
int LocateElem(List *l, Item e);	//查找 与 e 相等的元素,成功返回序号,否则返回 0
bool GetElem(List *l, int i, Item *e);//第 i 个位子的元素 返回给 e	

void Traverse(List *l);	//遍历 

int main(void)
{
	List list = {.item = NULL};
	Item temp;
	int i = 0, n = 0;
	
	temp.n = 100;
	strcpy(temp.name,"AAA");
	
	InitList(&list);		// 初始化 
	
	while(i<MAXSIZE && scanf("%s",list.item[i].name) != EOF)	// 输入内容 
	{
		scanf("%d", &list.item[i++].n);
		list.len++;
	}
	printf("****************\n");
	if(i != 0)
		Traverse(&list);		// 遍历 
		
	printf("****************\n");
	
	if(ListInsert(&list , 1, temp))			// 在第 i 个位置 插入元素
		Traverse(&list);		// 遍历 
	
	printf("****************\n");
	
	if(ListDelete(&list, 1, &temp))			// 删除 第 i 个位子的元素
		printf(" %d  %s \n",temp.n, temp.name);
		
	DestroyList(&list);			//销毁 
	
	return 0;
}

bool GetElem(List *l, int i, Item *e)	//第 i 个位子的元素 返回给 e
{
	
	if(IsEmpty(l) || (i < 1 || i >l->len) )	// 如果表空,或者位子不对 返回 false 
		return false;
	*e = l->item[i-1];
		return true;
}

int LocateElem(List *l, Item e)
{
	int i;
	
	for(i=0;i<l->len;++i)
		if(strcmp(l->item[i].name, e.name) ==0 && l->item[i].n == e.n) 
			return i+1;
	return 0;		
}

bool ListDelete(List *l, int i, Item * e)	// 删除 第 i 个位子的元素 
{
	int n;
	if(IsEmpty(l) || (i < 1 || i >l->len) )	// 如果表空,或者位子不对 返回 false 
		return false;
	
	*e = l->item[i-1];
	
	for(n = i;n < l->len; ++n)
		l->item[n-1] = l->item[n];
	l->len--;
	return true;
}

bool ListInsert(List *l, int i, Item e)	// 在第 i 个位置 插入元素 
{
	int n;
	
	
	if(i < 1 || i > l->len +1 )		// 插入位置不合法  返回 false 
		return false;
	
	if(l->len == MAXSIZE)		//表满无法插入 
		return false;
	
	for(n = l->len; n > i-1; n--)	//一次把元素的位子往后移动一位。 
		l->item[n] = l->item[n-1];
		
	l->item[n] = e;	
	l->len++;	
	
	return true;
}

int ListLength(List *l) //返回元素个数
{
	return l->len;
}

bool IsEmpty(List *l)	// 空返回 true  不空 返回 false 
{
	if(l->len == 0)
		return true;
	else	
		return false;
}

void ClearList(List *l)	//清空线性表 
{
		l->len = 0;
}

void DestroyList(List *l)	//销毁线性表 
{
	if(l->item)		
		free(l->item);
}
	
void InitList(List *l)		//初始化操作,建立一个空线性表 
{
	l->item = (Item *) malloc(sizeof(Item) * MAXSIZE);		//分配一个线性空间 
	l->len = 0;
}

void Traverse(List *l)		//遍历 
{
	int i;
	
	for(i = 0;i < l->len; ++i)
		printf(" %d  %s \n", l->item[i].n, l->item[i].name);
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值