线性表 顺序 c语言,线性表的顺序表示和实现(C语言)

最近开始准备软件设计师考试,所以把数据结构的知识梳理一遍。

首先线性表的顺序表示。

//list.c

#include

#include

#define ERROR -1

#define OVERFLOW 2

#define TRUE 1

#define FALSE 0

#define OK 1

#define LIST_INIT_SIZE 100

#define LIST_INCREMENT 10

typedef struct{

int * elem;

int length;

int listsize;

}sq_list;

int init_list_sq(sq_list *sl);

void destroy_list_sq(sq_list * sl);

int clear_list(sq_list * sl);

int list_empty(sq_list sl);

int list_length(sq_list sl);

void get_elem(sq_list sl, int index, int * elem);

int locate_elem(sq_list sl, int elem);

int prior_elem(sq_list sl, int curelem, int *priorelem);

int next_elem(sq_list sl, int curelem, int *nextelem);

int insert_elem(sq_list *sl, int index, int elem);

int list_delete_elem(sq_list * sl, int index, int * elem);

int visit_all(sq_list sl);

int init_list_sq(sq_list *sl)

{

sl->elem = (int*)malloc(LIST_INIT_SIZE * sizeof(int));

if(!sl->elem)

exit(OVERFLOW);

sl->length = 0;

sl->listsize = LIST_INIT_SIZE;

return OK;

}

void destroy_list_sq(sq_list * sl)

{

free(sl->elem);

}

int clear_list(sq_list * sl)

{

destroy_list_sq(sl);

init_list_sq(sl);

return OK;

}

int list_empty(sq_list sl)

{

if(sl.length)

return FALSE;

else

return TRUE;

}

int list_length(sq_list sl)

{

return sl.length;

}

void get_elem(sq_list sl, int index, int * e)

{

*e = sl.elem[index-1];

}

int locate_elem(sq_list sl, int e)

{

int len;

for (len = 1; len <= sl.length; len++)

if(sl.elem[len-1] == e)

return len;

return ERROR;

}

int insert_elem(sq_list *sl, int index, int e)

{

int * insert_ptr, * temp_ptr;

if(index < 1 || index > sl->length + 1)

return ERROR;

if(sl->length >= sl->listsize)

{

sl->elem = (int *)realloc(sl->elem, (sl->listsize + LIST_INCREMENT) * sizeof(int) );

if(!sl->elem)

exit(OVERFLOW);

sl->listsize += LIST_INCREMENT;

}

insert_ptr = &(sl->elem[index-1]);

for ( temp_ptr = &(sl->elem[sl->length-1]); temp_ptr >= insert_ptr; temp_ptr--)

*(temp_ptr+1) = *temp_ptr;

* insert_ptr = e;

sl->length++;

return OK;

}

int list_delete_elem(sq_list * sl, int index, int * e)

{

int * end_ptr, * temp_ptr;

if(index < 1|| index > sl->length)

return ERROR;

end_ptr = &(sl->elem[sl->length-1]);

temp_ptr = &(sl->elem[index-1]);

*e = *temp_ptr;

for (; temp_ptr < end_ptr; temp_ptr++ )

{

*temp_ptr = *(temp_ptr+1);

}

sl->length--;

return OK;

}

int prior_elem(sq_list sl, int curelem, int *priorelem)

{

int * temp_ptr;

if( (sl.elem[0]) == curelem)

return ERROR;

temp_ptr = sl.elem;

for(++temp_ptr; temp_ptr < sl.elem+sl.length; temp_ptr++)

{

if(*temp_ptr == curelem )

{

*priorelem = *(temp_ptr-1);

return OK;

}

}

return ERROR;

}

int next_elem(sq_list sl, int curelem, int *nextelem)

{

int * temp_ptr;

if( (sl.elem[sl.length-1]) == curelem)

return ERROR;

temp_ptr = sl.elem;

for(; temp_ptr < sl.elem+sl.length-1; temp_ptr++)

{

if(*temp_ptr == curelem)

{

*nextelem = *(temp_ptr+1);

return OK;

}

}

return ERROR;

}

int visit_all(sq_list sl)

{

int *temp_ptr;

temp_ptr = sl.elem;

for(; temp_ptr<= sl.elem+sl.length-1; temp_ptr++)

printf("%5d", *temp_ptr);

return OK;

}

下面是主函数

//main.c

#include"list.c"

#include"prompt.c"

int main()

{

sq_list sl;

int elem, pos, elem1;

int op;

while((op = prompt()) >= 0 && op <= 9 )

{

switch(op){

case 0 :

if (init_list_sq(&sl) == OK)

printf("A table has beend created.\n");

break;

case 1 :

printf("Enter an element and position:");

scanf("%d %d", &elem, &pos);

if(insert_elem(&sl, pos, elem) == OK)

printf("Insertion succeed!\n");

break;

case 2 :

printf("Enter deleteted position:");

scanf("%d", &pos);

if(list_delete_elem(&sl, pos, &elem) == OK)

printf("Delete succeed!\n");

break;

case 3 :

printf("Enter an element's position:");

scanf("%d", &pos);

get_elem(sl, pos, &elem1);

printf("get elemnet:%d\n", elem1);

break;

case 4 :

printf("Enter an element :");

scanf("%d", &elem);

if (prior_elem(sl, elem, &elem1) == OK)

printf("%d's prior element:%d\n", elem, elem1);

break;

case 5 :

printf("Enter an element :");

scanf("%d", &elem);

if (next_elem(sl, elem, &elem1) == OK)

printf("%d's next element:%d\n", elem, elem1);

break;

case 6 :

printf("length:%d\n", list_length(sl));

break;

case 7 :

printf("Enter an element:");

scanf("%d", &elem);

printf("position:%d\n", locate_elem(sl,elem) );

break;

case 8 :

destroy_list_sq(&sl);

printf("The table has been destroyed!\n");

break;

case 9 :

if(list_empty(sl) == TRUE)

printf("The table is blank!\n");

else

printf("The table is not blank!\n");

break;

case 'x' :

return 0;

default :

printf("Enter a number (0-9)\n");

break;

}

}

return 0;

}

还有提示操作选项的

//prompt.c

int prompt()

{

int option;

printf("\n\n ********The Sequential Table********\n");

printf(" 0. Create an new senquential table.\n");

printf(" 1. Insert an element into the table.\n");

printf(" 2. Delete an element from the table.\n");

printf(" 3. Get an specific element from the table.\n");

printf(" 4. Get an specific element's prior element.\n");

printf(" 5. Get an specific element's next element.\n");

printf(" 6. Get the table's length.\n");

printf(" 7. Locate an specific elemnet.\n");

printf(" 8. Destory the table.\n");

printf(" 9. Whether if the table is empty?\n");

printf(" x. Exit\n");

printf("Enter your option: ");

scanf("%d", &option);

return option;

}

Makefile文件

#makefile

main: main.o

cc -o $@ $^

main.o: main.c

clean:

rm main.o list.o prompt.o

心得体会:

基础很重要,还要注意细节。哈哈

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值