您的位置:首页 > 理论基础 > 数据结构算法

C语言 数据结构 线性表的顺序表示

2008-04-28 20:22 761 查看
已经大三下学期了,不准备考研,但是想把考研的相关专业课程复习复习,这段时间看看数据结构,看到第一章的线性表了,想到编一个程序实现一下子线性表的顺序实现。本来刚开始想用c++的,后来想数据结构的书是c语言的版本,还是用turbo c做环境,这样更富有挑战。好啦,废话少说,把代码和大家分享把。
如果代码中有什么错误希望您不吝赐教,有什么问题发送到我的邮箱:yijiyong100@163.com我会尽快回复的!

C语言 数据结构 线性表的顺序表示


/****************************************/
/*Desciption:Sequence List*/
/*Email:yijiyong100@163.com*/
/*Author:yi_landry Haerbin Normal University Computer Science*/
/*Date:2008-4-26*/
/*Copyright:HNU2008.cop*/
/*Environment:turbo c 2.01 English Version*/
/****************************************/

# include<stdlib.h>
# include<stdio.h>
# define LIST_INIT_SIZE 200/*distribute the memory size of the list*/
# define LIST_INCREMENT 20/*if the memory size overfolw ,everytime add LIST_INCREMENT*/
# define OVERFLOW 0
# define OK 1

struct SqList
{
int * element;/*the base address of the sequece list*/
int length;  /*current length*/
int listsize;/*size of the sequence list*/
}L;

/****************************************/
/*Initial the list*/
/****************************************/
InitList(struct SqList * L)
{
L->element=(int *)malloc(LIST_INIT_SIZE*sizeof(int));
if (! L->element) exit(OVERFLOW);
L->length = 0;
L->listsize = LIST_INIT_SIZE;
printf("Initial the list successfuly!/n");
}

/****************************************/
/*Judge the list is empty or not*/
/****************************************/
ListEmpty(struct SqList * L)
{
if (L->length ==0)
{
printf("The list is empty!/n");
}
else
{
printf("The list is not empty!/n");
}
}

/****************************************/
/*Get the length of the list*/
/****************************************/
ListLength(struct SqList * L)
{
printf("The length of the list is %d/n",L->length);
}

/****************************************/
/*Destroy the list and free the memory distributed at first*/
/****************************************/
DestroyList(struct SqList *L)
{
free(L->element);
L->length = 0;
L->listsize = 0;
printf("Destory the list successfully!/n");
}

/****************************************/
/*Clear all the elements the list*/
/****************************************/
ClearList(struct SqList * L)
{
L->length = 0;
printf("Clear the list successfully!/n");
}

/****************************************/
/*Get the element at tbe location i */
/****************************************/
GetElement(struct SqList * L,int i)
{
int * p = L->element +i-1;
printf("The element of Location %d is %d/n",i,(*p));
}

/****************************************/
/*Find a number if or not in the list*/
/****************************************/
FindElement(struct SqList * L,int elm)
{
int *p,*q;
int totalfind=0;
for (p=L->element;p<=L->element+L->length-1;p++)
{
if ((*p)==elm)
{
printf("We can find  %d in the list at of the location of %d/n",elm,p-L->element+1);
totalfind++;
}
}
if (totalfind==0)
{
printf("We can not find %d in the list!/n",elm);
}
else
{
printf("We totally find %d <%d> in the list/n",totalfind,elm);
}
}

/****************************************/
/*Get prior element of some element in the list*/
/****************************************/
PriorElement(struct SqList * L,int elm)
{
int *p;
int totalPrior=0;
for (p = L->element+1;p<= L->element + L->length-1;p++)
{
if ((*p) == elm)
{
printf("The prior of %d is %d/n",elm,*(p-1));
totalPrior++;
}
}
if (totalPrior ==0)
{
printf("We can not find the prior of %d in the list!/n",elm);
}
}

/****************************************/
/*Get next element of some element in the list*/
/****************************************/
NextElement(struct SqList * L,int elm)
{
int *p;
int totalNext=0;
for (p = L->element;p<= L->element + L->length-2;p++)
{
if ((*p) == elm)
{
printf("The prior of %d is %d/n",elm,*(p+1));
totalNext++;
}
}
if (totalNext ==0)
{
printf("We can not find the next of %d in the list!/n",elm);
}
}

/****************************************/
/*Insert a element into the list*/
/****************************************/
ListInsert(struct SqList * L,int i,int elm)
{
int *p,*q;
if (i < 1 || i >L->length+1)
{
printf("The location %d you input is not valid!/n",i);
}
else if (L->length >= L->listsize)
{
int * newbase = (int *)malloc((L->listsize+LIST_INCREMENT)*sizeof(int));
if (!newbase) exit(OVERFLOW);
L->element = newbase;
L->listsize += LIST_INCREMENT;
}
else
{
q = L->element+i-1; /*The address of element i*/
for (p = L->element+L->length-1;p >=q;p--)  *(p+1)= *p;
* q = elm;
L->length ++;
printf("The element of %d insert into the list successfully!/n",elm);
}
}

/****************************************/
/*Delete the element at the location i in the list*/
/****************************************/
ListDelete(struct SqList * L,int i)
{
int *p,*q,deletedElm;
if (i<0 || i>L->length+1)
{
printf("The location you input you want to delete is not valid!/n");
}
else
{  q = L->element+i;
deletedElm = *(q-1);
for (p =q;p<=L->element+L->length;p++)
{
*(p-1)=*p;
}
L->length--;
printf("The element %d at location %d was deleted successfully!/n",deletedElm,i);
}
}

/****************************************/
/*Print the list */
/****************************************/
PrintList(struct SqList * L)
{
int *p,*q;
if (L->length == 0)
{
printf("The list now is empty!/n");
}
else if (L->length == 1)
{
printf("The current list:/n%d",*(L->element));
}
else if (L->length == 2)
{
printf("The current list:/n%d->%d",*(L->element),*(L->element+1));
}
else if (L->length >2);
{
q = L->element +L->length-2;
printf("The current list :/n");
for (p = L->element;p<=q;p++)
{
printf("%d->",*p);
}
printf("%d/n",*(q+1));
}
}

/****************************************/
/*Traverse the list*/
/****************************************/
ListTraverse(struct SqList * L)
{
int *i,*j,*p,temp;
i = L->element;
j = L->element+ L->length-1;
p = i+(L->length-1)/2;
for (;i<p;i++,j--)
{
temp = * i;
* i = * j;
* j = temp;
}
}

/****************************************/
/*Show a example to the user*/
/****************************************/
ListExample()
{
InitList(&L);
ListInsert(&L,1,1);
ListInsert(&L,2,2);
ListInsert(&L,3,3);
ListInsert(&L,4,4);
ListInsert(&L,5,5);
ListInsert(&L,6,6);
ListInsert(&L,5,50);
ListInsert(&L,6,60);
ListInsert(&L,7,7);
ListInsert(&L,8,8);
ListInsert(&L,9,9);
FindElement(&L,6);
FindElement(&L,7);
FindElement(&L,10);
PriorElement(&L,6);
PriorElement(&L,10);
GetElement(&L,3);
PrintList(&L);
ListTraverse(&L);
PrintList(&L);
ListDelete(&L,4);
PrintList(&L);
ListDelete(&L,6);
PrintList(&L);
ListInsert(&L,18,9);
ListLength(&L);
DestroyList(&L);
ListLength(&L);
return 0;
}

/****************************************/
/*Show the help information to the user*/
/****************************************/
void help()
{
printf("      /*****************************************************************//n");
printf("      /*****************************************************************//n");
printf("      /*          The Sequence List Operation Version 1.0              *//n");
printf("      /*             View the example information            1         *//n");
printf("      /*             Insert a number into the list           2         *//n");
printf("      /*             Delete a number from the list           3         *//n");
printf("      /*          Find a number if or not in the list        4         *//n");
printf("      /*       Get the prior of some number from the list    5         *//n");
printf("      /*       Get the next  of some number from the list    6         *//n");
printf("      /*                Get the size of list                 7         *//n");
printf("      /*               Show the help information             8         *//n");
printf("      /*             View current  list information          9         *//n");
printf("      /*             View travesre list information          10        *//n");
printf("      /*                  Exit Sequence List                 Q         *//n");
printf("      /*****************************************************************//n");
}

main()
{
char userInput;
int insertItem,insertLocation,deleteLocation,findItem,priorItem,nextItem;
help();
InitList(&L);
while(1)
{
printf("Slect the operation you want to do: input the correspond number!you can enter 1 to view the example./n");
scanf("%c",&userInput);
switch(userInput)
{
case '1':ListExample();break;
case '2':
for(;;)
{
printf("Please input a integer and the location you want to insert into the list:/n");
printf("Forexample 1 1 if you do not want to insert a number into the list again,you can input 0 0/n");
scanf("%d %d",&insertItem,&insertLocation);
if (insertItem == 0 && insertLocation == 0)
break;
ListInsert(&L,insertLocation,insertItem);
PrintList(&L);
}
break;
case '3':
for(;;)
{
printf("Please input  the location  of the element you want to delete from the list:/n");
printf("Forexample 2.if you do not want to delete a number from the list again,you can input -1/n");
scanf("%d",&deleteLocation);
if ( deleteLocation== -1)
break;
ListDelete(&L,deleteLocation);
PrintList(&L);
}
break;
case '4':
for(;;)
{
printf("Please input a integer  you want to find from the list:/n");
printf("Forexample 1 . if you do not want to find a number from the list again,you can input -1/n");
scanf("%d",&findItem);
if (findItem == -1)
break;
FindElement(&L,findItem);
PrintList(&L);
}
break;
case '5':
for(;;)
{
printf("Please input a integer  you want to get the prior from the list:/n");
printf("Forexample 1. if you do not want to get the prior form the list again,you can input -1/n");
scanf("%d",&priorItem);
if (priorItem == -1) break;
PriorElement(&L,priorItem);
PrintList(&L);
}
break;
case '6':
for(;;)
{
printf("Please input a integer  you want to get the next from the list:/n");
printf("Forexample 1. if you do not want to get the next form the list again,you can input -1/n");
scanf("%d",&nextItem);
if (nextItem == -1) break;
NextElement(&L,nextItem);
PrintList(&L);
}
break;
case '7':ListLength(&L);break;
case '8':help();break;
case '9':PrintList(&L);break;
case '10':ListTraverse(&L);break;
case 'Q':break;
case 'q':break;

}
if (userInput == 'q'|| userInput == 'Q')
break;
}
}
如果代码中有什么错误希望您不吝赐教,有什么问题发送到我的邮箱:yijiyong100@163.com我会尽快回复的!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: