zl程序教程

您现在的位置是:首页 >  后端

当前栏目

数据结构:顺序表

数据结构 顺序
2023-09-27 14:22:47 时间
#include <stdio.h>
#define  MAXLEN  100        	/*定义常量MAXLEN为
                                                       100表示存储空间总量*/
typedef  int  DataType;  /*定义DataType为int类型*/ 
typedef  struct               	          /*顺序表存储类型*/
{   DataType   data[MAXLEN];     /*存放线性表的数组*/
    int  Length;              	         /*Length是顺序表的长度*/
}SeqList;
SeqList  L;                   	         /*定义一个顺序表L*/ 
void  InitList( SeqList  *L )
{   /*初始化顺序表L函数*/ 
    L->Length=0;      /*初始化顺序表为空*/
	printf("初始化成功!\n\n");
} 
void CreateList(SeqList *L,int n)
{   /*建立顺序表并输入多个元素函数*/
    int i;
    printf("请输入%d个整数:",n);
    for(i=0;i<n;i++)
        scanf("%d",&L->data[i]);
    L->Length=i;               /*设线性表的长度为i*/
	printf("链表创建成功!\n\n");
} 
int GetElem(SeqList  *L, int i, DataType *x)
{  /*获取顺序表中第i位中元素函数*/
   if (i<1 || i>L->Length)  /*当查找位置i不正确时*/
        return  0;
   else
   {    *x = L->data[i-1];    /*将顺序表中第i个元素值赋给指针x所指变量*/
        return  1;
   }
}
int Locate(SeqList *L, DataType x)
{   /*在顺序表L中定位元素x函数*/
    int i=0;
    while(i<L->Length && L->data[i]!= x)
        i++;
    if (i>=L->Length) 
        return 0;
    else
        return i+1;                     /*返回的是元素位置*/
} 
int  InsElem(SeqList *L, int i, DataType x)
{   /*在顺序表L中在第i位中插入新元素x函数*/
	int j;
    if (L->Length>=MAXLEN)
    {   printf ("顺序表已满!"); 
        return -1;                           /*表满,不能插入*/
    }
    if (i<1 || i>L->Length+1) /*检查给定的插入位置的正确性*/
    {   printf("插入位置出错!");
        return 0; 
    }
if (i == L->Length+1)    /*插入的位置为表尾,则不需移动直接插入即可*/
    {   L->data[i-1]=x;
        L->Length++;
        return  1;            
    }
    for (j=L->Length-1; j>=i-1; j--) /*插入表中某位置,则插入点后各结点后移*/ 
        L->data[j+1]=L->data[j];
    L->data[i-1]=x;                      	/*新元素插入*/
    L->Length++;                           	/*顺序表长度增1 */
    return 1;                              	/*插入成功,返回*/
} 
int DelElem (SeqList *L, int i,  DataType *x)  
{   /*在顺序表L中删除第i位元素函数*/
    int  j;
    if (L->Length==0)
    {  printf ("顺序表为空!");
       return 0;    /*表空,不能删除*/
    }
    if (i<1 || i>L->Length) /*检查是否空表及删除位置的合法性*/
    {  printf ("不存在第i个元素");
       return 0;
    }
   *x= L->data[i-1]; /*用指针变量*x返回删除的元素值*/
    for(j=i;j<L->Length;j++)        	/*结点移动*/
       L->data[j-1]=L->data[j];
    L->Length--;            /*顺序表长度减1*/
    return 1;                  /*删除成功,返回*/
} 
//课后题4.2设计一个算法,删除顺序表中的值为x的所有结点 
void delall(SeqList *L , DataType x){
	int i = 0 , j , k;
	do{
		while(i<L->Length && L->data[i] != x){
			i++;
		}
		k = 0;
		for(j = i+1 ; j < L->Length ; j++){
			L->data[i+k] = L->data[j];
			k++;
		}
		L->Length--;
	}while(i<L->Length);
	L->Length = i;
}
void DispList(SeqList *L)
{   /*显示输出顺序表L的每个元素函数*/
    int i;
    for(i=0;i< L->Length;i++)
        printf("%5d ", L->data[i]);

	printf("\n\n") ;
}
void  Menu(){
	printf("===========线性表子系统==========\n");
	printf("\t1.---创建\n");
	printf("\t2.---插入\n");
	printf("\t3.---删除\n");
	printf("\t4.---按位置查找\n");
	printf("\t5.---按元素查找\n");
	printf("\t6.---删除表中的某个值\n");
	printf("\t0.---返回\n");
	printf("\t请输入0~6之间的数字\n");
	printf("============================\n");
}
int main() {
	SeqList  L; 
	InitList( &L );
	
	int n;
	DataType x;
	int i;
	int loc;
	char ch1 = 'y', ch2 , ch3;
	//Menu();
	
	
	while(ch1== 'y' ||ch1 == 'Y'){
		Menu();
		scanf("%c" , &ch2);
		switch(ch2){
			case '1':
				printf("请输入一个整数:") ;
				scanf("%d" , &n);
				CreateList(&L, n);
				DispList(&L); 
				break;
			case '2':
					printf("请输入要插入元素的位置:");
				scanf("%d" , &i);
				printf("请输入要插入的元素:") ;
				scanf("%d" , &x);
				loc = InsElem(&L, i, x);
				if(loc){
					printf("插入成功!\n");
					DispList(&L); 
				}else{
					printf("插入失败!\n\n");
				}
				break;
			case '3':
				printf("请输入要删除元素的位置:");
				scanf("%d" , &i);
	
				loc = DelElem (&L, i, &x);
				if(loc){
					printf("删除成功!\n");
					DispList(&L); 
				}else{
					printf("删除失败!\n\n");
				}
				break;
			case '4':
				printf("请输入要查找的位置:") ;
				scanf("%d" , &i);
	
				int loc;
				loc = GetElem(&L, i, &x);
				if(loc){
					printf("查找成功~\n\n");
					printf("在第%d位置上找到了元素%d\n\n" , i , x);
				}else{
					printf("查找不成功~\n\n");
				}
				break;			
			case '5':
				printf("请输入要查找的元素值:") ;
				scanf("%d" , &x);
				loc = Locate(&L, x);
				if(loc){
					printf("在第%d位置上找到了元素%d!\n\n" , loc , x);
				}else{
					printf("未找到元素%d!\n\n" ,  x);
				}
				break;
			case '6':
				printf("请输入要删除的元素值:");
				scanf("%d" , &x);
				delall(&L , x);
				DispList(&L);
				break;	
			case '0':
				ch1 = 'n'; 
				break;	
		}
		if(ch2 != '\0'){
			printf("\n按回车键继续 , 按做任意键返回主菜单\n");
			ch3 = getchar();
			if(ch3 != '\xA'){
				getchar();
				ch1 = 'n';
			}
		}
	}

}