c语言实现顺序表

来源:互联网 发布:最好笑知乎 编辑:程序博客网 时间:2024/06/05 18:34
//线性顺序表#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 //线性表存储空间的分配增量#defineOK 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);//overflowL->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;elsereturn 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;}


1 0
原创粉丝点击