//线性顺序表
#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;
}