首页 > 学院 > 开发设计 > 正文

c语言实现顺序表

2019-11-06 08:07:59
字体:
来源:转载
供稿:网友
//线性顺序表#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 3typedef 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个位置之前插入新元素eint 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,不为空返回0int 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;}


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表