c语言实现顺序表

//线性顺序表
#ifndef  _SEQLIST_H__
#define  _SEQLIST_H__
#define  _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#define LIST_INIT_SIZE 1000 //线性表存储空间的初始分配量
#define LISTINCRESEMENT 100 //线性表存储空间的分配增量
#define	OK 1
#define ERROR 0
#define OVERFLOW -1
#define  LIST_SIZE 3
typedef int elemType;//元素类型
typedef struct
{
	elemType *List;//线性表首地址
	int length;//当前的长度
	int listsize;//当前分配的存储容量,以elemType为单位
} SqList;
void menu();
void Malloc(SqList *L);
int InitList(SqList *L);
int ListLength(SqList *L);
void TraverseList(SqList *L);
void InsertFirst(SqList *L,elemType e);
int InsertList_1st(SqList *L,elemType e);
int Insert_Seq(SqList *L,elemType e,int pos);
void Search(SqList *L,elemType e);
elemType DeleteElem(SqList *L,int pos);
int isEmpty(SqList *L);
void Inverse(SqList *L);
void MergeList(SqList *List_1,SqList * List_2,SqList * List_3);
#endif;


#include "seqlist.h"
void menu()
{
   printf(" *************************************************************\n");
   printf(" **************   1.ADD    2.MERGE_LIST    *******************\n ");
   printf("**************  3.PUSHFRONT  4.PUSHBACK    ******************\n ");
   printf("************** 5.PUSH_POS   6.SEARCH       ******************\n ");
   printf("************** 7.DELETE_POS  8.REVERSE     ******************\n ");
   printf("************** 9.SHOW           0.EXIT     ******************\n ");
}
void Malloc(SqList *L)//空间不够时重新分配空间的函数
{
	elemType *newbase;//分配一个临时基址
	newbase=(elemType *)realloc(L->List,(L->listsize+LISTINCRESEMENT)*sizeof(elemType));
	if(!newbase) exit(OVERFLOW);
	L->List=newbase;
	L->listsize+=LISTINCRESEMENT;
}

//初始化一个空的线性表
int InitList(SqList *L)
{
	L->List=(elemType *)malloc(LIST_INIT_SIZE*sizeof(elemType));
	if(!L->List)exit(OVERFLOW);//overflow
	L->length=0;//初始表为空表
	L->listsize=LIST_INIT_SIZE;//初始表的存储容量,为LIST_INIT_SIZE个elemType单位
	return OK;
}
//求表中元素的个数
int ListLength(SqList *L)
{
	return L->length;
}

//遍历顺序表
void TraverseList(SqList *L)
{
	int i;
	for(i=0; i<L->length; i++)
	{
		printf("%d ",L->List[i]);
	}
	printf("\n");
	return;
}
//向表头插入元素
void InsertFirst(SqList *L,elemType e)
{
	int i;
	if(L->length>=L->listsize)
		Malloc(L);
	for(i=L->length-1; i>=0; i--)
		L->List[i+1]=L->List[i];
	L->List[0]=e;
	L->length++;
	return;
}

//向表尾插入元素
int InsertList_1st(SqList *L,elemType e)
{

	if(L->length>=L->listsize)
		Malloc(L);
	L->List[L->length]=e;
	L->length++;
	return  OK;
}
//在表中第pos个位置之前插入新元素e
int Insert_Seq(SqList *L,elemType e,int pos)
{
	int i;
	if(pos<1||pos>L->length+1) return ERROR;
	if(L->length>=L->listsize)//存储空间不够,要分配新的空间
		Malloc(L);
	for(i=L->length-1; i>=pos-1; i--)
		L->List[i+1]=L->List[i];
	L->List[pos-1]=e;
	L->length++;
	return OK;
}
void Search(SqList *L,elemType e)  
{  
	    int i;  
	    for(i=0; i<L->length; i++)  
		    {  
			        if(L->List[i]==e)  
				        {  
					            printf("找到,%d在第%d个位置\n",e,i+1);  
					            return;  
					        }  
			    }  
	    printf("没找到\n");  
	    return;  
	}  

//删除第pos个元素,并返回其值
elemType DeleteElem(SqList *L,int pos)
{
	int i;
	elemType temp;
	if(pos<1||pos>L->length)
	{
		printf("pos值越界\n");
		exit(1);
	}
	temp=L->List[pos-1];
	for(i=pos; i<L->length; i++)
		L->List[i-1]=L->List[i];
	L->length--;
	return temp;
}
//判断线性表是否为空,为空返回1,不为空返回0
int isEmpty(SqList *L)
{
	if(L->length==0)
		return 1;
	else
		return 0;
}

//顺序表的逆置
void Inverse(SqList *L)
{
	int low=0,high=L->length-1;
	elemType temp;
	int i;
	for(i=0; i<L->length/2; i++)
	{
		temp=L->List[low];
		L->List[low++]=L->List[high];
		L->List[high--]=temp;
	}
}

void MergeList(SqList *List_1,SqList * List_2,SqList * List_3)
{
	//elemType *pa=List_1->List;elemType *pb= List_2->List;
	int i=0,j=0,k=0;
	 List_3->listsize= List_3->length=List_1->length+ List_2->length;
	 List_3->List=(elemType *)malloc(sizeof(elemType));
	if(! List_3->List) 
		exit(OVERFLOW);
	//int i=0,j=0,k=0;
	while(i<List_1->length&&j< List_2->length)
	{
		if(List_1->List[i]<= List_2->List[j])
		{
			 List_3->List[k++]=List_1->List[i++];
		}
		else
		{
			 List_3->List[k++]= List_2->List[j++];
		}
	}
	while(i<List_1->length)
	{
		 List_3->List[k++]=List_1->List[i++];
	}
	while(j< List_2->length)
	{
		 List_3->List[k++]= List_2->List[j++];
	}
}

 	 


#include "seqlist.h"
int main()
{
	SqList list1;
	SqList list2;
	SqList list3;
	elemType temp;
	int length=0;
       int i=0;
	   int pos=0;
	   int input=0;
	  int num=0;
	   menu();
	   
	   while (1)
	   {
		   printf("please enter number:> ");
		   scanf("%d",&input);
		   switch (input)
		   {
		   case  1:
			   { 
				   InitList(&list1);
				   printf("输入顺序表的长度:>\n");
				   scanf("%d",&length);
				   printf("输入顺序表的数据:>\n");
				   for(i=0; i<length; i++)
				   {
					   scanf("%d",&temp);
					   InsertList_1st(&list1,temp);
				   }break;
			   
		   case 2:
			   {    
				   InitList(&list2);
				   printf("输入list2数据个数:>");
				   scanf("%d",&length);
				   printf("list2顺序表数据为:>");
				   for(i=0; i<length; i++)
				   {
				   	scanf("%d",&temp);
				   	InsertList_1st(&list2,temp);		 
				   }
				   MergeList(&list1,&list2,&list3);
				   printf("合并List_1和 List_2后的线性表=");
				   TraverseList(&list3);
			   }break;
		   case 3:
			   {   
			   printf("输入头插元素:>");
			     scanf("%d",&num);
				   InsertFirst(&list1,num);
				    printf("创建好的线性表List_1=");
				   TraverseList(&list1);

			   }break;
		   case 4:
			   {      
			   printf("输入尾插元素:>");
			   scanf("%d",&num); 
				    InsertList_1st(&list1, num);
					printf("尾插后的线性表List_1=");
					TraverseList(&list1);
			   }break;
		   case 5:
			   {     
					 printf("输入插入数据和插入位置:>");
					 scanf("%d%d",&num,&pos);
				   Insert_Seq(&list1,num, pos);
				   printf("指定位置插入后的线性表List_1=");
				   TraverseList(&list1);
			   }break;
		   case 6:
			   {     
			   printf("输入查找的元素:>");
			   scanf("%d",&num);
				 Search(&list1,num);
			   }break;
		   case 7:
			   {
				      printf("输入删除数据的位置:>");
					  scanf("%d",&pos);
                                        DeleteElem(&list1, pos);
					 printf("删除后好的线性表List_1=");
					 TraverseList(&list1);
			   }break;
		   case 8:

			   {
				   Inverse(&list1);
				   printf("逆置后好的线性表List_1=");
				   TraverseList(&list1);
			   }break;
		   case 9:
			   {
				   printf("创建好的线性表List_1=");
				   TraverseList(&list1); 
			   }break;
		   case 0:
			   {
				   exit(ERROR);
			   }
			   break;
		   }
	   }
	   }
  
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值