数据结构——线性表的顺序表示

最近做了个实验,写个线性表,感觉挺好写,但还是发现了几个值得注意的地方,代码如下:

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
#define OVERFLOW -2
#define OK 1
#define ERROR 0
#define LIST_INIT_SIZE 10
#define LISTINCREMENT 4
typedef int Elemtype;
typedef int Status;
typedef struct
{
Elemtype *elem;
int length;
int listsize;
}Sqlist; //线性表结构
Status Init_list(Sqlist *L) //构造线性表
{
L->elem=(Elemtype *)malloc(LIST_INIT_SIZE*sizeof(Elemtype));
if(!L->elem)return(OVERFLOW);
L->length=0;
L->listsize=LIST_INIT_SIZE;
return OK;
}

Status Insert_list(Sqlist *L,int i,Elemtype e)//插入元素
{
Elemtype *p,*q,*newbase;
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>=&(L->elem[i-1]);p--)
*(p+1)=*p;
*q=e;
++L->length;
return OK;

}

Status Del_list(Sqlist *L,int i,Elemtype *e)//删除元素
{
Elemtype *p;
if(i<1||i>L->length)return ERROR;
p=&(L->elem[i-1]);
*e=*p;
for(p++;p<=&(L->elem[L->length-1]);p++)
*(p-1)=*p;
--L->length;
//此处不能free(p-1); 线性表不能随便free 不如链表
return OK;
}
void DisplayElem(Sqlist *L,int i)//显示一个元素
{
printf("%-4d\n",L->elem[i-1]);
}
void Display_list(Sqlist *L)//显示所有元素
{
int i;
for(i=0;i<L->length;i++)
printf("%-4d",L->elem[i]);
}
void print()
{
printf("1)插入\n2)删除\n3)查找一个元素\n4)查看所有元素\n0)退出\n");
}

int main()
{
Sqlist L;
Elemtype e;
int i,p=1;
char select;
if(Init_list(&L)==OK)
{
printf("请分别输入10个元素的数值:\n");
for(i=0;i<10;i++)
scanf("%d",&L.elem[i]);
L.length=10;
while(p==1)
{
p=0;
print();
getchar();//接收回车符
select=getchar();
switch(select)
{
case '1':printf("请分别输入插入位置和插入的元素:");scanf("%d%d",&i,&e);Insert_list(&L,i,e);p=1;break;
case '2':printf("请输入删除的位置:");scanf("%d",&i);Del_list(&L,i,&e);printf("删除的元素为%d\n",e);p=1;break;
case '3':printf("请输入显示的元素的位置:");scanf("%d",&i);DisplayElem(&L,i);p=1;break;
case '4':Display_list(&L);p=1;break;
case '0':p=0;break;
default:
{
printf("输入错误!请重新输入:0-4之间的数字:\n");
getchar();
p=1;
}
}//switch
if(p==1)
{
printf("\n请输入任意键进入主程序……\n");
getch();
system("cls");
}

}//while

}//if

return 0;
}

 

值得注意的地方:

1)数据结构书中所描述的算法中带‘&’的表示引用该值后还要返回该值。在写程序时函数中应该用‘*’,在主函数中实参应该用‘&’,不能混淆了;

2)结构体中Elemtype *elem 表示线性表的基地址,如果分配了一段空间,则能用数组形式比如L.elem[i],实际上L.elem[i] 即是L.*(elem+i);

即Elemtype *elem即是Elemtype elem[0];

3)比如删除元素后,不要释放空间,否则出错,链表则可以且应该;

4)不能把switch中的内容另外写到一个函数中,因为这样必须得定义一个线性表变量,则不是原来的线性表,就会出错;解决方法可以是用全局变量,不过不好;

5)函数很方便,要常用!

你可能感兴趣的:(数据结构)