线性结构之顺序表

//mian.c

#include "MySeqList.h"
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
	int s = 0, i = 0, r = 0;
	SeqList list;
	ElementType e;

	init(&list);

	while(1)
	{
		printf("/********************请选择操作***********************/\n");
		printf("/*1头插		2尾插	 3显示		4头删		5尾删   */\n");
		printf("/*6按位置插入		 7查找		8长度		9排序   */\n");
		printf("/*10按位置删除		 11按值删除  12逆序		13清除  */\n");
		printf("/*14摧毁	    15初始化	 16退出							*/\n");
		printf("/****************************************************/\n");
	
		scanf_s("%d", &s);

		switch(s)
		{
			case 1:
				printf("清输入数据,-1退出:\n");
				while (scanf_s(" %d", &e), e != -1)
				{
					push_fornt(&list, e);
				}
				break;
			case 2:
				printf("清输入数据,-1退出:\n");
				while (scanf_s(" %d", &e), e != -1)
				{
					push_back(&list, e);
				}
				break;
			case 3:
				show(list);
				break;
			case 4:
				pop_fornt(&list, &e);
				printf("删除的数据是%d\n", e);
				break;
			case 5:
				pop_back(&list, &e);
				printf("删除的数据是%d\n", e);
				break;
			case 6:
				printf("请输入插入位置\n");
				scanf_s("%d", &i);
				printf("清输入带插入的数据, -1退出\n");
				while (scanf_s(" %d", &e), e != -1)
				{
					insert_pos(&list, i, e);
				}
				break;
			case 7:
				printf("清输入要查找的值\n");
				scanf_s("%d", &e);
				r = find(list, e);
				if( -1 != r )
					printf("值的位置在%d\n", r);
				break;
			case 8:
				printf("顺序的长度为%d\n", length(list));
				break;
			case 9:
				sort(&list);
				break;
			case 10:
				printf("请输入带删除位置\n");
				scanf_s("%d", &i);
				if( delete_pos(&list, i, &e) )
					printf("被删除的数据时%d\n", e);
				break;
			case 11:
				printf("清输入待删除的值\n");
				scanf_s("%d", &e);
				delete_val(&list, e);
				break;
			case 12:
				reverse(&list);
				break;
			case 13:
				clear(&list);
				break;
			case 14:
				destroy(&list);
				break;
			case 15:
				init(&list);
				break;
			case 16:
				goto Exit;
				break;
			default:
				goto Exit;
				break;
		}	
	}
Exit:
	return 1;
}


//MySeqList.h

/****************************************/
/*初始化		头插		尾插		显示		头删*/
/*尾删		按位置插入		查找		长度	*/
/*按位删除	按值删除			排序		逆序*/
/*清除		摧毁				合并			*/	
/***************************************/

//代码可以进一步优化

#ifndef MYSEQLIST_H_
#define MYSEQLIST_H_	 

#define MAXSIZE	10
#define INCREASE 10

typedef int ElementType;

typedef enum
{
	false_,
	true_
}bool_;

typedef struct SeqList
{
	ElementType *Base;
	int capatity;
	int size;
}SeqList;

bool_ init(SeqList *mylist);
bool_ increase(SeqList *mylist);
bool_ push_fornt(SeqList *mylist, ElementType e);
bool_ push_back(SeqList *mylist, ElementType e);
void show(SeqList mylist);
bool_ pop_fornt(SeqList *mylist, ElementType *e);
bool_ pop_back(SeqList *mylist, ElementType *e);
bool_ insert_pos(SeqList *mylist,int i, ElementType e);
int  find(SeqList mylist, ElementType e);
int  length(SeqList mylist);
bool_ delete_pos(SeqList *mylist, int i, ElementType *e);
bool_ delete_val(SeqList *mylist, ElementType e);
void sort(SeqList *mylist);
void reverse(SeqList *mylist);
void clear(SeqList *mylist);
void destroy(SeqList *mylist);
bool_ merge(SeqList *list, SeqList* lista, SeqList *listb);

#endif //MYSEQLIST_H_



//MySeqList.c

#include "MySeqList.h"
#include "stdlib.h"
#include "stdio.h"

bool_ init(SeqList *mylist)
{
	mylist->Base = (ElementType *)malloc(MAXSIZE * sizeof(ElementType));
	if( NULL == mylist->Base )
		return false_;
	mylist->capatity = MAXSIZE;
	mylist->size = 0;
	return true_;
}

bool_ increase(SeqList *mylist)
{
	ElementType *newspace = (ElementType *)realloc(mylist->Base, sizeof(ElementType) * ( MAXSIZE + INCREASE));
	if( NULL == newspace )
	{
		printf("内存空间已满,增加空间失败\n");
		return false_;
	}

	mylist->Base = newspace;
	mylist->capatity += INCREASE;
	return true_;
}


bool_ push_fornt(SeqList *mylist, ElementType e)
{
	int i = 0;
	if( mylist->size >= mylist->capatity && !increase(mylist) )
	{
		printf("顺序表已满\n");
		return false_;
	}
	for(i = mylist->size; i > 0; i--)
	{
		mylist->Base[i] = mylist->Base[i - 1]; 
	}
	mylist->Base[0] = e;
	mylist->size++;
	return true_;
}

bool_ push_back(SeqList *mylist, ElementType e)
{
	int i = 0;
	if( mylist->size >= mylist->capatity && !increase(mylist) )
	{
		printf("顺序表已满\n");
		return false_;
	}
	mylist->Base[mylist->size] = e;
	mylist->size++;
	return true_;
}

void show(SeqList mylist)
{
	int i = 0;

	if( 0 == mylist.size || NULL == mylist.Base ) 
	{
		printf("顺序表中不存在任何元素\n");
			return ;
	}
	printf("顺序表中的元素有:");
	for(i = 0; i < mylist.size; i++)
		printf("%d ", mylist.Base[i]);
	printf("\n");
}

bool_ pop_fornt(SeqList *mylist, ElementType *e)
{
	int i = 0;
	if( 0 == mylist->size )
	{
		printf("顺序表中没有元素\n");
		return false_;
	}
	*e = mylist->Base[0];
	for(i = 0; i < mylist->size - 1; i++)
	{
		mylist->Base[i] = mylist->Base[i + 1];
	}
	mylist->size--;
	return true_;
}

bool_ pop_back(SeqList *mylist, ElementType *e)
{
	if( 0 == mylist->size )
	{
		printf("线性表中没有任何元素\n");
		return false_;
	}
	*e = mylist->Base[mylist->size-1];
	mylist->size--;
	return true_;
}

bool_ insert_pos(SeqList *mylist, int i, ElementType e)
{
	int j = 0;
	if( mylist->size >= mylist->capatity && !increase(mylist) )
	{
		printf("顺序表已满,不能插入数据\n");
		return false_;
	}
	if( i > mylist->size || i < 0 )
	{
		printf("插入位置不合法\n");
		return false_;
	}

	for(j = mylist->size; i < j; j--)
	{
		mylist->Base[j] = mylist->Base[j - 1];
	}
	mylist->Base[j] = e;
	mylist->size++;
	return true_;
}

int find(SeqList mylist, ElementType e)
{
	int i = 0;
	for(i = mylist.size; i > 0; i--)
	{
		if( mylist.Base[i - 1] == e )
			return i - 1;		
	}
	printf("元素%d不存在\n", e);
	return -1;
}

int length(SeqList mylist)
{
	return mylist.size;
}

bool_ delete_pos(SeqList *mylist, int i, ElementType *e)
{
	int j = 0;
	if( 0 == mylist->size )
	{
		printf("顺序表中不存在任何元素\n");
		return false_;
	}
	if( i < 0 || i > mylist->size )
	{
		printf("删除位置不合法:");
		return false_;
	}
	*e = mylist->Base[i];
	for(j = i; j < mylist->size - 1; j++)
	{
		mylist->Base[j] = mylist->Base[j + 1];
	}
	mylist->size--;
	return true_;
}

bool_ delete_val(SeqList *mylist, ElementType e)
{
	int i = 0, j = 0;
	if( -1 == ( i = find(*mylist, e)) )
	{
		printf("元素%d不存在\n", e);
		return false_;
	}
	for(j = i; j < mylist->size - 1 ; j++)
	{
		mylist->Base[j] = mylist->Base[j + 1];
	}
	mylist->size--;

	return true_;
}

void sort(SeqList*mylist)
{
	int i = 0, j = 0;
	ElementType tem;
	if( mylist->size < 2 )
		return ;
	//冒泡排序
	for(i = 0; i < mylist->size - 1; i++)	
	{
		for(j = 0; j < mylist->size - 1 - i; j++)
		{
			if( mylist->Base[j] > mylist->Base[j + 1] )
			{
				tem = mylist->Base[j];
				mylist->Base[j] = mylist->Base[j + 1];
				mylist->Base[j + 1] = tem;
			}
		}
	}
}

void reverse(SeqList *mylist)
{
	ElementType *low, *high;
	ElementType tem;
	if( mylist->size < 2 )
		return ;
	for(low = mylist->Base, high = &(mylist->Base[mylist->size - 1]); \
		low < high; low++, high--)
	{
		tem = *low;
		*low = *high;
		*high = tem;
	}
}

void clear(SeqList *mylist)
{
	mylist->size = 0;
}

void destroy(SeqList *mylist)
{
	free(mylist->Base);
	mylist->size = 0;
	mylist->capatity = 0;
}

//按序合并两个有序的顺序表
bool_ merge(SeqList *list, SeqList* lista, SeqList *listb)
{
	int i = 0;
	int ia = 0;
	int ib = 0;
	list->Base = (ElementType *)malloc((sizeof(ElementType)) * (lista->size + listb->size));
	if( NULL == list->Base )
		return false_;
	list->capatity = lista->size + listb->size;

	//谁小谁被放入
	while(i < lista->size && i < listb->size)
	{
		if(lista->Base[ia] > listb->Base[ib])
			list->Base[i++] = listb->Base[ib++];
		else
			list->Base[i++] = lista->Base[ia++];
	}
	//将剩下的直接放入
	while(i < lista->size)
	{
		list->Base[i++] = lista->Base[ia++];
	}

	while(i < listb->size)
	{
		list->Base[i++] = listb->Base[ib++];
	}
	list->size = lista->size + listb->size;
	return true_;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值