数据结构——顺序表的实现——C语言版

欢迎指正!


/*******************************************************
顺序表的实现——C语言版
********************************************************/

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

//函数结果状态代码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE (-1)
#define OVERFLOW (-2)

#define List_Init_Size 10  


//顺序表数据结构
typedef struct OrderList{
	int List[List_Init_Size]; 
	int listsize;  
}okk;

//进表
void InList(struct OrderList *pOrderlist){
	pOrderlist->listsize = 0;
	printf("空表:listsize = %d\n",pOrderlist->listsize);
}

//求表长
int OrderListLength(struct OrderList *pOrderlist){
	printf("求表长:listsize = %d\n",pOrderlist->listsize);
	return pOrderlist->listsize;
}

//取得第i个元素,并返回其值
int GetIValue(struct OrderList *pOrderlist, int i){
	if((i<1)||(i>pOrderlist->listsize)){
		printf("GetIValue() Wrong Used!!\n");
	}
    printf("取得第%d个元素,值是:%d\n",i,pOrderlist->List[i]);
	return pOrderlist->List[i];
}

//取得第一个值为value的元素,并返回其位序,若表中不存在该值,返回0
int LocateValue(struct OrderList *pOrderlist, int value){
	int i=0;
	while(i<pOrderlist->listsize-1&&pOrderlist->List[i]!=value)
		i++;
	if(i == pOrderlist->listsize){
		printf("Wrong!!\n");
		return 0;
	}
	printf("值为%d的元素第一次出现的位置:%d\n",value,i);
	return i;	//printf("该元素第一次出现的位置:%d",i);
}

//在第i位序插入元素,该元素值为value
int InsOrderList(struct OrderList *pOrderlist, int i, int value){
	int j;
	int k;
	k = i;

	printf("value = %d\n",value);
	
	if(i<0||i>pOrderlist->listsize-1){
		printf("插入元素错误,顺序表没有输入的位序长。\n");
		return ERROR;
	}
	
	printf("插入前,%d位序元素的值是:%d,表长是%d!!!\n",k,pOrderlist->List[k],pOrderlist->listsize);

	for(j=pOrderlist->listsize; j>=i; j--)
		pOrderlist->List[j] = pOrderlist->List[j-1];
	pOrderlist->List[j] = value;
	pOrderlist->listsize++;

	printf("插入后,%d位序元素的值是:%d,表长是%d!!!\nList=",k,pOrderlist->List[k],pOrderlist->listsize);
	for(k=0; k<pOrderlist->listsize; k++)
		printf("%d、",pOrderlist->List[k]);
	printf("\n");
	return OK;
}

//删除第i位序的元素
int DelOrderList(struct OrderList *pOrderlist, int i){
	int j;
	int k;
	k=i;

	if(i<0||i>pOrderlist->listsize-1)
		return ERROR;
	printf("删除前,%d位序元素的值是:%d,表长是%d!!!\n",k,pOrderlist->List[k],pOrderlist->listsize);
	for(j=i; j<pOrderlist->listsize-1; j++)
		pOrderlist->List[j] = pOrderlist->List[j+1];
	pOrderlist->listsize--;
	printf("删除后,%d位序元素的值是:%d,表长是%d!!!\nList",k,pOrderlist->List[k],pOrderlist->listsize);
	for(k=0; k<pOrderlist->listsize; k++)
		printf("%d、",pOrderlist->List[k]);
	printf("\n");
	return OK;
}
 
//顺序表元素按不减顺序排列  //冒泡法
void NotIncSort(struct OrderList *pOrderlist){
	int i,j,temp;
	
	for(i=0;i<pOrderlist->listsize-1; i++)
		for(j=0; j<pOrderlist->listsize-1-i; j++)
			if(pOrderlist->List[j]>pOrderlist->List[j+1]){
				temp = pOrderlist->List[j];
				pOrderlist->List[j] = pOrderlist->List[j+1];
				pOrderlist->List[j+1] = temp;
			}
	printf("NotIncSort is :");
	for(i=0; i<pOrderlist->listsize; i++)
		printf("%d",pOrderlist->List[i]);
	printf("\n");
}




int main(void)
{
	int i,select,j;int w;
	struct OrderList *pOrderlist;
	struct OrderList li;
	InList(&li);
	printf("请输入数据:\n");
 	pOrderlist=&li ;
  	pOrderlist->listsize=0;
  	for (i=0;i<5; i++)
     	{
     		scanf("%d",&li.List[i]);
     		pOrderlist->listsize++;
     	}
	printf("\n");
	printf("1:置空表! \n");
  	printf("2:求长度! \n");
  	printf("3:读取元素! \n");
  	printf("4:定位查找! \n");
  	printf("5:插入! \n");
  	printf("6:删除! \n");
  	printf("7:排序! \n");

  	printf("请选择(1----7) \n");
  	scanf("%d",&select);
  	switch(select)
	{
		case 1:
			InList(&li);break;
		case 2:
			printf("chang du %d",OrderListLength(&li));
			break;
		case 3:
			printf("输入序号:");
			scanf("%d",&i);
			GetIValue(&li,i);
			break;
		case 4:
			printf("输入元素:");
			scanf("%d",&i);
			LocateValue (&li,i);
			break;
		case 5:
			printf("输入插入的位置:");
			scanf("%d",&i);
			printf("输入插入的元素:");
			scanf("%d",&j);
     			InsOrderList(&li,i,j);
     			break;
		case 6:
			printf("输入所要删除数据的位置:");
       			scanf("%d",&w);
       			DelOrderList(&li,w);    
       			break;
		case 7:
			NotIncSort(&li);
			break;
		default:
			break;
  	}
  	
  	return OK;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值