单链表C语言

seqlist.h
#ifndef _SEQLIST_H
#define _SEQLIST_H
#include"ututli.h"

#define ElemType int
#define DEFAULT_SIZE 8		//初始化时数组的长度
#define LIST_INCREMENT 2	//每次增加的长度


typedef struct SeqList
{
	ElemType *base;
	size_t	 len;
	size_t	 capacity;
}SeqList;

void InitSeqList(SeqList *list);				//初始化函数
int isfull(SeqList *list);						//判断是否为空
void move(SeqList *list,int m,int n);					//将制定位置移动函数
void push_back(SeqList *list,ElemType x );		//后插函数
void push_front(SeqList *list,ElemType x);		//头插函数
void pop_back(SeqList *list);					//尾删函数
void pop_front(SeqList *list);					//头删函数
void insert_pos(SeqList *list,int i,ElemType e);//按位置插入
void insert_val(SeqList *list,ElemType e);		//按值插入
void delete_pos(SeqList *list,int i);			//按位置删除
void delete_val(SeqList *list,ElemType e);		//按值删除
int  find_val(SeqList *list,ElemType e);		//按值查找
int  length(SeqList *list);						//求顺序表的长度
int  isempty(SeqList *list);					//判断是否为空,0为假,1为真.
void clear(SeqList *list);						//清空顺序表
void resver(SeqList *list);						//转置顺序表
void show_list(SeqList *list);					//显示函数
void sort(SeqList *list);						//排序函数
void DestroySeqlist(SeqList *list);				//摧毁函数
bool ListInsert(SeqList *list,int i,ElemType e);//动态插入函数
//
void InitSeqList(SeqList *list)
{
	list->base = ( ElemType*)malloc(sizeof(SeqList) * DEFAULT_SIZE);

	assert(list != NULL);
	list->len = 0;
	list->capacity = DEFAULT_SIZE;
}

void sort(SeqList *list)	//使用冒泡排序法
{
	if(list->len == 0 || list->len == 1)
		return;
	else
	{
		int i,j,t;
		for(i = 0; i <list->len-1; ++i )
			for(j = 0; j < list->len-1-i; ++j)
				if(list->base[j] > list->base[j+1])
				{
					t = list->base[j];
					list->base[j] = list->base[j+1];
					list->base[j+1] = t;
				}
	}
}

//判断是否满,如果为满的话,返回0,不满的话返回1.
int  isfull(SeqList *list)
{
	if(list->len == list->capacity)
		return 0;
	else
		return 1;
}

void move(SeqList *list,int m,int n)//m代表位置,n代表前移或者后移.
{									//为0代表前移,为1代表后移.
	int k;
	if(n == 1)
	{
		for(k = list->len-1; k >= m-1; --k)//将指定的位置向后移动
			list->base[k+1] = list->base[k];
	}
	else
	{
		for(k = m; k < list->len; ++k)
			list->base[k-1] = list->base[k];
	}
}

bool ListInsert(SeqList *list,int i,ElemType e)
{
	ElemType *newbase,*q,*p;
	if(i < 1 || i > list->len+1)	//插入的位置不合法
		return	false;
	if(list->len >= list->capacity)
	{
		if(!(newbase = (ElemType*)realloc(list->base,(list->capacity + LIST_INCREMENT) * sizeof(ElemType))))	
			exit(0);		//存储分配失败
		list->base = newbase;	//新地址
		list->capacity += LIST_INCREMENT;	//增加存储容量
	}
	q = list->base+i-1;			//q为插入位置
	move(list,i,1);				//插入位置的元素向后移动
	*q = e;			//插入
	++list->len;	//表长增加1
	return true;
}

void push_back(SeqList *list,ElemType x )
{
	if(isfull(list) == 0)
	{
		printf("顺序表已满,错误\n");
		return ;
	}
	else
		list->base[list->len++] = x;
}

void push_front(SeqList *list,ElemType x)
{
	if(isfull(list) == 0)
	{
		printf("顺序表已满,错误\n");
		return;
	}
	else
	{
		move(list,1,1);
		list->base[0] = x;
	}
	list->len++;
}

void pop_back(SeqList *list)
{
	if(list->len == 0)
		return;
	list->len--;
}

void pop_front(SeqList *list)
{
	if(list->len == 0)
		return;
	else if(list->len == 1)
		list->len--;
	else if(list->len <= list->capacity)
	{
		move(list,1,0);
		list->len--;
	}
}

void insert_pos(SeqList *list,int i,ElemType e)
{
	if(list->len == list->capacity)
		return;
	else if(i < 1 || i > list->len+1)
		return;
	else if(i <= list->len)
		move(list,i,1);
	list->base[i-1] = e;
	list->len++;
}

void insert_val(SeqList *list,ElemType e)
{
	if(isfull(list) == 0)
		return;
	else
		push_back(list,e);
}

void delete_pos(SeqList *list,int i)
{
	if(isfull(list) == 0)
		return;
	if(i < 1 || i > list->len)
		return;
	if(i < list->len)	//如果删除不是最后位置
		move(list,i,0);
	list->len--;
}

void delete_val(SeqList *list,ElemType e)
{
	int i;
	for(i = 0; i < list->len; ++i)
	{
		if(list->base[i] == e)
			break;
	}
	i++;
	if(i <= list->len)
		delete_pos(list,i);
	else
		printf("未找到要删除的值!");
}

int find_val(SeqList *list,ElemType e)	//返回0代表失败
{
	int i;
	if(list->len == 0)
		return 0;
	else
	{
		for(i = 0; i < list->len; ++i)
			if(list->base[i] == e)
				break;
	}
	i++;
	if(i <= list->len)
		return i;
	else
		return 0;
}

int length(SeqList *list)
{
	return list->len;
}

int isempty(SeqList *list)
{
	if(list->len == 0)
		return 1;
	else
		return 0;
}

void clear(SeqList *list)
{	//将List置为空表
	if(isempty(list) == 1)
		return ;
	else
		list->len = 0;
}

void resver(SeqList *list)
{
	int i,t;
	if(list->len == 0 || list->len == 1)
		return;
	else
		for(i = 0; i < list->len/2; ++i)
		{
			t = list->base[i];
			list->base[i] = list->base[list->len-1-i];
			list->base[list->len-1-i] = t;
		}
}

void show_list(SeqList *list)
{
	int i = 0;
	while(list->len > i )
	{
		printf("%d->",list->base[i]);
		i++;
	}
	printf("Over\n");
}
void DestroySeqlist(SeqList *list)
{	//初识条件:顺序线性表已经存在。操作结果,销毁顺序线性表.
	free(list->base);
	list->base = NULL;
	list->len = 0;
	list->capacity = 0;
}

#endif
utili.h
#ifndef _UTILI_H
#define _UTILI_H

#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>

#endif

main.c
#include<stdio.h>
#include"seqlist.h"

int main()
{
	SeqList mylist;
	InitSeqList(&mylist);
	ElemType Item,p,v;
	int select = 1;
	while(select)
	{
		printf("***************************************\n");
		printf("[1]push_back      [2]push_front       *\n");
		printf("[3]show_list      [0]quit_system      *\n");
		printf("[4]pop_back       [5]pop_front        *\n");
		printf("[6]insert_pos     [7]insert_val       *\n");
		printf("[8]delete_pos     [9]delete_val       *\n");
		printf("[10]find_val      [11]length	      *\n");
		printf("[12]isfull        [13]isempty         *\n");
		printf("[14]clear         [15]resever	      *\n");
		printf("[16]sort          [17]ListInsert      *\n");
		printf("***************************************\n");
		printf("please input select:>");
		scanf("%d",&select);
		switch(select)
		{
			case 1:
				   printf("请输入要插入的值(以-1结束):");
				   while(scanf("%d",&Item),Item != -1)
						push_back(&mylist,Item);
					break;
			case 2:
				  printf("请输入要插入的值(以-1结束):");
				  while(scanf("%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("请输入要插入的位置和值(用空格隔开):");
					scanf("%d%d",&p,&v);
					insert_pos(&mylist,p,v);
					break;
			case 7:
					printf("请输入要插入的值:");
					scanf("%d",&v);
					insert_val(&mylist,v);
					break;
			case 8:
					printf("请输入要删除的位置:");
					scanf("%d",&v);
					delete_pos(&mylist,v);
					break;
			case 9:
					printf("请输入要删除的值:");
					scanf("%d",&v);
					delete_val(&mylist,v);
					break;
			case 10:
					printf("请输入要查找的值:");
					scanf("%d",&v);
					if(0 == find_val(&mylist,v))
						printf("要查找的值不存在\n");
					else
						printf("第%d个元素是要查找的值\n",find_val(&mylist,v));
					break;
			case 11:
					printf("此顺序表的长度是:%d\n",length(&mylist));
					break;
			case 12:
					if(0 == isfull(&mylist))
						printf("此顺序表满\n");
					else
						printf("此顺序表未满\n");
					break;
			case 13:
					if(0 == isempty(&mylist))
						printf("此顺序表不空\n");
					else
						printf("此顺序表空\n");
					break;
			case 14:
					clear(&mylist);
					break;
			case 15:
					resver(&mylist);
					break;
			case 16:
					sort(&mylist);
					break;
			case 17:
					printf("请输入要插入的位置和值:");
					scanf("%d%d",&p,&v);
					ListInsert(&mylist,p,v);
			default:
					break;
		}

	}
	DestroySeqlist(&mylist);
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值