//线性顺序表#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;}
新闻热点
疑难解答