线性表

头文件List.h

#ifndef __LIST_H__
#define __LIST_H__

#include <stdio.h>
#include <stdlib.h>
#define LIST_INIT_SIZE 100 //线性表初始化长度
#define LISTINCREMENT 10	//线性表增长长度

typedef int ElemType;
typedef int Status;
#define ERROR 0
#define OK 1
#define TRUE 1
#define FALSE 0
#define OVERFLOW -1


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

void showMenu();

Status InitList(SqList &L);

void showList(SqList &L);

Status ListInsert(SqList &L,int i,ElemType e);

Status ListDelete(SqList &L,int i,ElemType &e);

#endif

 

实现文件List.cpp

#include "List.h"

int main(){
	int cmd;
	SqList L;
	int i;
	ElemType e;
	showMenu();
	scanf("%d",&cmd);
	while(cmd){
		switch(cmd){
		case 1:
			InitList(L);
			break;
		case 2:
			showList(L);
			break;
		case 3:break;
		case 4:
			printf("输入要插入的位置和数据:");
			scanf("%d,%d",&i,&e);
			while(i<1||i>(L.length+1)){
				getchar();
				printf("输入要插入的位置和数据:");
				scanf("%d,%d",&i,&e);
			}
			ListInsert(L,i,e);
			break;
		case 5:
			printf("输入要删除的位置:");
			scanf("%d",&i);
			while(i<1||i>(L.length+1)){
				getchar();
				printf("输入要删除的位置:");
				scanf("%d",&i);
			}
			ListDelete(L,i,e);
			break;
		case 6:break;
		default:
			exit(-1);
			break;
		}
		showMenu();
		scanf("%d",&cmd);
	}
	return 0;
}

void showMenu(){
	char *str="\t\t************************";
	printf("%s\n",str);
	printf("\t\t1.初始化一个空线性表\n");
	printf("\t\t2.显示线性表\n");
	printf("\t\t3.清空线性表\n");
	printf("\t\t4.插入元素\n");
	printf("\t\t5.删除元素\n");
	printf("\t\t0.退出\n");
	printf("%s\n",str);
}

//
Status InitList(SqList &L){
	//构造一个空的L
	L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
	if(!L.elem)return OVERFLOW;//申请内存失败
	L.length=0;//初始化为链表长度为0
	L.listsize=LIST_INIT_SIZE;//初始化链表容量
	return OK;
}

void showList(SqList &L){
	printf("\n");
	int i;
	for(i=1;i<=L.length;i++){//线性表起始位置为1
		printf("\t\t%3d",L.elem[i-1]);
		if(i>0&&i%10==0){
			printf("\n");
		}
	}
	printf("\n");
}

Status ListInsert(SqList &L,int i,ElemType e){
	//重新分配空间指针、插入位置、移动指针
	ElemType *newbase,*p,*q;
	//插入位置是否合法
	if(i<1||i>L.length+1)return ERROR;
	if(L.length>=L.listsize){//当前线性表已满
		//重新申请空间,并释放原空间
		newbase=(ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
		if(!newbase)return OVERFLOW;//申请失败
		L.elem=newbase;//重新指向新申请的空间
		L.listsize+=LISTINCREMENT;//增大线性表容量
	}
	q=&L.elem[i-1];//取出要输入位置的地址
	for(p=&(L.elem[L.length-1]);p>q;--p){//循环移动
		*(p+1)=*p;
	}
	*q=e;
	++L.length;
	
	return OK;
}

//删除元素
Status ListDelete(SqList &L,int i,ElemType &e){
	ElemType *p,*q;
	if(i<1||i>L.length)return ERROR;
	q=&L.elem[i-1];//取出要删除的元素指针
	e=*q;//将删除的元素返回
	for(p=q;p<L.elem+L.length-1;++p){//从删除位置到表尾,元素前移
		*p=*(p+1);
	}
	L.length--;
	
	return OK;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值