数据结构 - 线性表之顺序表 (c 语言)

SeqList.h
#ifndef _SEQLIST_H_
#define  _SEQLIST_H_

#include "stdio.h"
#include "malloc.h"
#include "assert.h"

#define SEQLIST_INIT_SIZE 8
typedef int ElemType;

typedef struct SeqList
{
	ElemType *base;
	int		 capacity;  //容量  
	int      size;  //大小 

}SeqList;

void InitSeqList(SeqList *list);
void push_back(SeqList *List, ElemType);
void push_front(SeqList *List, ElemType);
void show_list(SeqList*List);
void pop_back(SeqList * List);
void pop_front(SeqList *List);
void insert_pos(SeqList* List, int, ElemType);
int find(SeqList *List, ElemType);
int length(SeqList *List);
void delete_pos(SeqList*List, int pos);
void delete_val(SeqList*List, ElemType x);
void sort(SeqList*List);
void resver(SeqList *List);
void clear(SeqList *List);
void destroy(SeqList* List);
#endif // !_SEQLIST_H_

SeqList.c

#include "SeqList.h"

void InitSeqList(SeqList *list)
{
	list->base = (ElemType *)malloc(sizeof(ElemType)*SEQLIST_INIT_SIZE);
	assert(list->base != NULL);
	list->capacity = SEQLIST_INIT_SIZE;
	list->size = 0;

}

void push_back(SeqList *List, ElemType x)
{
	if (List->size>=List->capacity)
	{
		printf_s("顺序表空间已满,不能插入数据\n");
		return;
	}
	List->base[List->size] = x;
	List->size++;
}

void push_front(SeqList *List, ElemType x)
{
	if (List->size>=List->capacity)
	{
		printf_s("顺序表空间已满,不能插入数据\n");
		return;
	}
	for (int i = List->size; i >=0;i--)
	{
		List->base[i] = List->base[i-1];
	}
	List->base[0] = x;
	List->size++;
}

void show_list(SeqList*List )
{
	for (int i = 0; i < List->size;i++)
	{
		printf_s("%d  ", List->base[i]);
	}
	printf_s("\n");
}

void pop_back(SeqList * List)
{
	if (List->size ==0)
	{
		printf_s("顺序表为空,不能删除数据\n");
		return;
	}
	List->size--;
}

void pop_front(SeqList *List)
{
	if (List->size == 0)
	{
		printf_s("顺序表为空,不能删除数据\n");
		return;
	}
	for (int i = 0; i < List->size-1;i++)
	{
		List->base[i] = List->base[i + 1];
	}
	List->size--;

}

void insert_pos(SeqList* List, int pos, ElemType x)
{
	if (pos<0||pos>List->size)
	{
		printf_s("插入数据的位置非法,不能插入数据\n");
		return;
	}
	for (int i = List->size; i > pos;i--)
	{
	  List->base[i] = List->base[i - 1];
	}
	List->base[pos] = x;
	List->size++;
	
}

int find(SeqList *List, ElemType key)
{
	for (int i= 0; i < List->size;i++)
	{
		if (List->base[i]==key)
		{
			return i;
		}
	}
	return -1;
}

int length(SeqList *List)
{
	return List->size;
}

void delete_pos(SeqList*List, int pos)
{
	if (pos<0||pos>=List->size)
	{
		printf_s("删除数据的位置非法,不能删除");

	}

	for (int i = pos; i < List->size - 1;i++)
	{
		List->base[i] = List->base[i + 1];
	}
	List->size--;
}

void delete_val(SeqList*List, ElemType x)
{
	int pos = find(List, x);
	if (pos=-1)
	{
		printf_s("表中没有该数据");
	}
	delete_pos(List, pos);
}

void sort(SeqList*List)
{
	for (int i= 0; i<List->size - 1;i++)
	{
		for (int j = 0; j < List->size - 1 - i; j++)
		{
			if (List->base[j]>List->base[j+1])
			{
				ElemType tmp = List->base[j];
				List->base[j] = List->base[j + 1];
				List->base[j + 1] = tmp;
			}
		}
	}
}

void resver(SeqList *List)
{
	if (List->size == 0 || List->size == 1)
	{
		return;
	}
	int low = 0;
	int high = List->size - 1;
	ElemType tmp;
	while (low<high)
	{
		tmp = List->base[high];
		List->base[high] = List->base[low];
		List->base[low] = tmp;
		high--;
		low++;
	}
}

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

void destroy(SeqList* List)
{
	free(List->base);
	List->base = NULL;
	List->capacity = 0;
	List->size = 0;
}


main.c
#include "SeqList.h"
#include <iostream>

int main()
{
	SeqList mylist;
	InitSeqList(&mylist);

	ElemType Item;
	int pos;
	int select = 1;
	while (select)
	{
		printf_s("**************************************\n");
		printf_s("* [1] push_back       [2] push_fornt *\n");
		printf_s("* [3] show_list       [4] pop_back   *\n");
		printf_s("* [5] pop_fornt       [6] insert_pos *\n");
		printf_s("* [7] find            [8] lenght     *\n");
		printf_s("* [9] delete_pos      [10]pop_back   *\n");
		printf_s("* [11] sort           [12] resver    *\n");
		printf_s("* [13] clear          [14]destroy    *\n");
		printf_s("* [14] quit_system                   *\n");
		printf_s("**************************************\n");
		printf_s("请选择:>");
		scanf_s("%d", &select);
		if (select==0)
		{
			break;
		}
		switch (select)
		{
		case 1:
			printf_s("请输入要插入的数据(-1结束):>");

			while (scanf_s("%d", &Item),Item!=-1)
			{
				push_back(&mylist, Item);
			}
			
			break;
		case 2:
			printf_s("请输入要插入的数据(-1结束):>");

			while (scanf_s("%d", &Item), Item != -1)
			{
				push_front(&mylist, Item);
			}
			break;
		case 3:
			show_list(&mylist);
			break;
		case 4:
			pop_back(&mylist);
			break;
		case 5:
			pop_front(&mylist);
			break;
		case 6:
			printf_s("请输入要插入的数据:>");
			scanf_s("%d", &Item);
			printf_s("请输入要插入的位置:>");
			scanf_s("%d", &pos);
			insert_pos(&mylist, pos, Item);
			break;
		case 7:
			printf_s("请输入要查找的数据:>");
			scanf_s("%d", &Item);
			pos = find(&mylist, Item);
			if (pos==-1)
			{
				printf_s("未查到该数据:%d\n",Item);
			}
			else
			{
				printf_s("查找的数据在表中下标为 %d\n", pos);
			}
			break;
		default:
			printf_s("输入的选择错误,请重新输入\n");
			break;
		case 8:
			printf_s("顺序表的长度为:>%d\n", length(&mylist));
			break;
		case 9:
			printf_s("请输入要删除数据的位置:>");
			scanf_s("%d", &pos);
			delete_pos(&mylist,pos);
			break;
		case 10:
			printf_s("请输入要删除的数据:>");
			scanf_s("%d", &Item);
			delete_val(&mylist, Item);
			break;
		case 11:
			sort(&mylist);
			break;
		case 12:
			resver(&mylist);
			break;
		case 13:
			clear(&mylist);
			break;
		case 14:
			destroy(&mylist);
			break;
		}
	}
	system("pause");
	return 0;
}


                                      VS  2013 编译  

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值