头文件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;
}