首页 > 代码库 > 顺序表的功能的C代码

顺序表的功能的C代码

#include<stdio.h>
#include<stdlib.h>


#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define OK 1
#define OVERFLOW -2
#define ERROR 0


typedef int ElemType;
typedef int status;


typedef struct {
    ElemType *elem;
int length;
int listsize;
}SqList;




status InitList_Sq(SqList *L) 
{
L->elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L->elem)  
return OVERFLOW;//如果用exit的话一但退出就退出整个程序
L->length=0;
L->listsize=LIST_INIT_SIZE;
return OK;



status CreatList_Sq(SqList *L,int n)
{
int i;
printf("请输入表中元素:");
for(i=0;i<n;i++)
{
scanf("%d",&L->elem[i]);
if(L->elem[i]==‘\n‘)
break;
L->length++;
}
return OK;
}


status PrintfList_Sq(SqList *L)
{
int i;
printf("此顺序表元素如下:\n");
for(i=0;i<L->length;i++)
printf("%4d",L->elem[i]);
printf("\n");
    return OK;
}


status ListInsert_Sq(SqList *L,int i,ElemType e)
{
int *newbase,*p,*q;
if(i<1||i>L->length)
return ERROR;
if(L->length>=L->listsize)//当前存储空间已满,追加空间
{
newbase=(ElemType *)realloc(L->elem,(L->listsize+LISTINCREMENT)*sizeof(ElemType));
if(!newbase)
exit(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;//插入e
L->length++;//表长加1
return OK;
}


status ListDeleteNum_Sq(SqList *L,ElemType e)
{
int i;
int *p,*q;
for(i=0;i<L->length;i++)
{
if(L->elem[i]==e)
{
p=&L->elem[i];
break;
}  
}
if(i<L->length)
{
for(q=p;q<&(L->elem[L->length]);q++)
*(q)=*(q+1);//插入位置及之后的元素左移
L->length--;
return OK;
}
return ERROR;
}


status ListDeletePosition_Sq(SqList *L,int i)
{
int *p;
    //在顺序线性表L中删除第i个元素,并用e返回其值
if((i<1)||(i>L->length))
return ERROR;//i值不合法
for(p=&(L->elem[i-1]);p<&(L->elem[L->length]);p++)
*(p)=*(p+1);//被删除之后的元素左移
L->length--;
return OK;

}




status ListNiZhi_Sq(SqList *L,SqList *M)
{


int i,j;
for(i=L->length-1,j=0;i>=0;i--,j++)
{
M->elem[j]=L->elem[i];
}
printf("操作成功\n逆置后存入另一个顺序表中,此顺序表的元素为:\n");
for(j=0;j<L->length;j++)
printf("%4d",M->elem[j]);
return OK;
}


status ListOrder_Sq(SqList *L)
{
int i,j,temp;
for(i=1;i<L->length;i++)
for(j=0;j<L->length-i;j++)
{
if(L->elem[j]>L->elem[j+1])
{
                temp=L->elem[j];
L->elem[j]=L->elem[j+1];
L->elem[j+1]=temp;
}
}
return OK;
}


void MergeList_Sq(SqList La,SqList Lb,SqList *Lc)
{
//已知顺序线性表La和Lb的元素按值非递减排列
int *pa,*pb,*pc,*pa_last,*pb_last;
pa=La.elem;
pb=Lb.elem;
Lc->listsize=Lc->length=La.length+Lb.length;
    pc=Lc->elem=(ElemType *)malloc(Lc->listsize *sizeof(ElemType));
if(!Lc->elem)
exit(OVERFLOW);//存储分配失败

    pa_last=La.elem+La.length-1;
pb_last=Lb.elem+Lb.length-1;
while(pa<=pa_last&&pb<=pb_last)
{
//归并
if(*pa<=*pb)
*pc++=*pa++;
else
*pc++=*pb++;
}
while(pa<=pa_last)
*pc++=*pa++;//插入La的剩余元素
while(pb<=pb_last)
*pc++=*pb++;//插入Lb的剩余元素
}


int main()
{
SqList List_a;
SqList List_b;
SqList List_c;
int select,n;
int position,x,delnum;
while(select!=0)
{
printf("***************菜单栏***************\n");
printf("1 建立一个顺序表,输出顺序表及顺序表的长度\n");
printf("2 在顺序表指定位置i,插入一个值为x的结点\n");
printf("3 在顺序表中删除值为x的结点或者删除给定位置i的结点\n");
printf("4 将顺序表逆置,将结果保存到另外的顺序表中\n");
printf("5 将顺序表按升序排列\n");
printf("6 将两个顺序有序表A和B合并为一个有序表\n");
printf("0 退出程序\n");
printf("请输入你的选择:");
scanf("%d",&select);
switch(select)
{
case 1:
            if(InitList_Sq(&List_a))
printf("顺序表创建已成功!!!\n");
printf("请输入表长:");
scanf("%d",&n);
CreatList_Sq(&List_a,n);
PrintfList_Sq(&List_a);
printf("此顺序表的长度是:%d",List_a.length);
break;
case 2:
            if(InitList_Sq(&List_a))
printf("顺序表创建已成功!!!\n");
printf("请输入表长:");
scanf("%d",&n);
CreatList_Sq(&List_a,n);
            printf("请输入所希望所插入元素所在顺序表中的位置和插入元素的值\n");
scanf("%d%d",&position,&x);
ListInsert_Sq(&List_a,position,x);
PrintfList_Sq(&List_a);
break;
case 3:
if(InitList_Sq(&List_a))
printf("顺序表创建已成功!!!\n");
printf("请输入表长:");
scanf("%d",&n);
CreatList_Sq(&List_a,n);
printf("请选择你要删除的方式\n1 按元素值删除\n2 按结点位置删除\n请输入你的选择:");
scanf("%d",&select);
if(select==1)
{
printf("请输入你要删除的数值:");
scanf("%d",&delnum);
if(ListDeleteNum_Sq(&List_a,delnum)==OK)
PrintfList_Sq(&List_a);
else
printf("在此顺序表中不存在此数:%d\n",delnum);
}
else if(select==2)
{
printf("请输入要删除第几个元素:");
scanf("%d",&position);
ListDeletePosition_Sq(&List_a,position);
PrintfList_Sq(&List_a);
}
else
printf("输入有误,请核实……");
break;
case 4:
if(InitList_Sq(&List_a))
printf("顺序表创建已成功!!!\n");
printf("请输入表长:");
scanf("%d",&n);
CreatList_Sq(&List_a,n); 
InitList_Sq(&List_c);
            ListNiZhi_Sq(&List_a,&List_c);
break;
case 5:
if(InitList_Sq(&List_a))
printf("顺序表创建已成功!!!\n");
printf("请输入表长:");
scanf("%d",&n);
CreatList_Sq(&List_a,n); 
ListOrder_Sq(&List_a);
printf("已完成顺序表的升序排列\n");
PrintfList_Sq(&List_a);
// PrintfList_Sq(SqList *L)
break;
case 6:
//两个顺序表合并前,先分别对其排序
if(InitList_Sq(&List_a))
printf("A顺序表创建已成功!!!\n");
printf("请输入表长:");
scanf("%d",&n);
CreatList_Sq(&List_a,n); 
ListOrder_Sq(&List_a);//对a进行排序


if(InitList_Sq(&List_b))
printf("B顺序表创建已成功!!!\n");
printf("请输入表长:");
scanf("%d",&n);
CreatList_Sq(&List_b,n); 
ListOrder_Sq(&List_b);//对b进行排序


MergeList_Sq(List_a,List_b,&List_c);
printf("两个顺序表合并,结果如下:\n");
PrintfList_Sq(&List_c);
break;
case 0:
return ERROR;
default:
printf("输入有误,请核实……");
break;
}
printf("\n\n");
}

return 0;
}

顺序表的功能的C代码