C语言顺序表

用C语言编写顺序表,需要实现以下几个功能:
1.PushBack插入数据,PushFront头插数据
2.PopBack删除数据,PopFront头删
3.Find查找数据,Remove/RemoveAll删除数据
4.Sort数据排序,Binsearch二分查找数据
5.exit退出程序,show打印
编写过程中遇到的问题:
1.Remove/RemoveAll的return 问题
2.sort排序与二分查找
源代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include"SeqList.h"
#include<assert.h>
void InitSeqList(pSeqList p)
{
	p->count = 0;
	memset(p->arr, 0, MAX*sizeof(DataType));
}
void PushBack(pSeqList p, DataType d)
{
	assert(p != NULL);
	if (p->count == MAX)
	{
		printf("数据已满:\n");
		return;
	}
	p->arr[p->count] = d;
	p->count++;
}
void PushFront(pSeqList p, DataType d)
{
	assert(p != NULL);
	int i = p->count;
	if (p->count == MAX)
	{
		printf("数据已满:\n");
		return;
	}
	while (i)
	{
		p->arr[i] = p->arr[i - 1];
		i--;
	}
	p->arr[0] = d;
	p->count++;
}
void PopBack(pSeqList p)
{
	assert(p!=NULL);
	if (p->count == 0)
	{
		printf("数据为空:\n");
		return;
	}
	p->count--;
}
void PopFront(pSeqList p)
{
	assert(p!=NULL);
	if (p->count == 0)
	{
		printf("数据为空:\n");
		return;
	}
	int i = 0;
	for (i = 0; i < p->count - 1; i++)

		p->arr[i] = p->arr[i + 1];
		p->count--;
}
int Find(pSeqList p,DataType d)
{
	assert(p!=NULL);
	int i = 0;
	for (i = 0; i < p->count; i++)
	{
		if (p->arr[i] == d)
			return i + 1;
	}
	return -1;
}
void Remove(pSeqList p, DataType d)
{
	assert(p!=NULL);
	if (p->count == 0)
	{
		printf("数据为空无法删除:\n");
		return;
	}
	int i = 0;
	int j = 0;
	for (i = 0; i < p->count; i++)
	{
		if (p->arr[i] == d)
		{

			for (j = i; j < p->count-1 ; j++)
			{
				p->arr[j] == p->arr[j + 1];
			}
			p->count--;
			return;
		}
	}

}
void RemoveAll(pSeqList p, DataType d)
{
	assert("p!=NULL");
	if (p->count == 0)
	{
		printf("数据为空无法删除:\n");
		return;
	}
	int i = 0;
	int j = 0;
	for (i = 0; i < p->count; i++)
	{
		if (p->arr[i] == d)
		{

			for (j = i; j < p->count-1; j++)
			{
				p->arr[j] == p->arr[j + 1];
			}
			p->count--;
			
		}
	}
}

void sort(pSeqList p)
{
	assert(p!=NULL);
	if (p->count == 0)
	{
		printf("数据为空无法排序");
		return;
	}
	int i = 0;
	int j = 0;
	for (i = 0; i < p->count - 1; i++)
	{
		for (j = 0; j < p->count - i; j++)
		{
			if (p->arr[j]<p->arr[j + 1])
			{
				
				int  tmp = p->arr[j ];
				p->arr[j] = p->arr[j + 1];
				p->arr[j+1] = tmp;
				

			}
		}
	}
}
int Binsearch(pSeqList p, DataType d)
{
	assert("p!=NULL");
	if (p->count == 0)
	{
		printf("数据为空:\n");
		return;
	}
	int left = 0;
	int right = p->count - 1;
	while (left <= right)
	{
		int mid = (left + right) / 2;
		if (p->arr[mid] == d)
		{
			return mid + 1;
		}
		else if(p->arr[mid]< d)
		{
			 left=mid+1;
		}
		else
		{
			right= mid-1;
		}
	}
	return -1;
}
void show(pSeqList p)
{
	assert(p!=NULL);	
	int i = 0;
	for (i = 0; i < p->count; i++)
		printf("%d ",p->arr[i]);
	printf("\n");
}

#define _CRT_SECURE_NO_WARNINGS 1
#include"SeqList.h"
void menu()
{
	printf("***************************************\n");
	printf("****   1.PushBack      2.PushFront ****\n");
	printf("****   3.PopBack       4.PopFront  ****\n");
	printf("****   5.Find          6.Remove    ****\n");
	printf("****   7.RemoveAll     8.Sort      ****\n");
	printf("****          9.BinarySearch       ****\n");
	printf("****   0.exit          10.show     ****\n");
	printf("***************************************\n");
}
int main()
{
	int input = 0;
	SeqList L;
	InitSeqList(&L);
	do
	{
		menu();
		printf("请选择:\n");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
		{
				  DataType ret = 0;
				  printf("请输入要插的数:\n");
				  scanf("%d",&ret);
				  PushBack(&L, ret);
		}
			break;
		case 2:
		{
				  DataType ret = 0;
				  printf("请输入要插入的数:\n");
				  scanf("%d",&ret);
				  PushFront(&L, ret);
		}
			break;
		case 3:
			PopBack(&L);
			break;
		case 4:
			PopFront(&L);
			break;
		case 5:
		{
				  DataType ret = 0;
				  printf("请输入要查找的数:\n");
				  scanf("%d", &ret);
				DataType d = Find(&L, ret);
				if (d == -1)
				{
					printf("没有找到这个数!\n");
				}
				else
					printf("找到了这个数是%d个数\n",d);
		}
			break;
		case 6:
		{
				  DataType ret = 0;
				  printf("请输入要删除的数:\n");
				  scanf("%d", &ret);
				  Remove(&L, ret);
		}
			break;
		case 7:
		{
				  DataType ret = 0;
				  printf("请输入要删除的数:\n");
				  scanf("%d", &ret);
				  RemoveAll(&L, ret);
		}
			break;
		case 8:
			sort(&L);
			break;
		case 9:
		{
				  DataType ret = 0;
				  printf("请输入要查找的数:\n");
				  scanf("%d", &ret);
				  DataType wet = Binsearch(&L, ret);
				  if (-1 == wet)
					  printf("没找到\n");
				  else
					  printf("找到了这个数是第%d个数\n", wet);
		}
			break;
		case 10:
				   show(&L);
				   break;
		case 0:
			break;
		default:
			printf("输入有误重新选择:\n");
			break;
		}
	} while (input);
	return 0;
}

头文件代码:
#define _CRT_SECURE_NO_WARNINGS 1
#ifndef __SEqList_H__
#define __SEqList_H__

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

#define MAX 100
typedef int DataType;
typedef struct SeqList
{
	DataType arr[MAX];
	int count;
}SeqList, *pSeqList;
void InitSeqlist(pSeqList p);
void PushBack(pSeqList p, DataType d);
void PushFront(pSeqList p, DataType d);
void PopBack(pSeqList p);
void PopFront(pSeqList p);
int Find(pSeqList p, DataType d);
void Remove(pSeqList p, DataType d);
void RemoveAll(pSeqList p, DataType d);
void sort(pSeqList p);
int Binsearch(pSeqList p, DataType d);
void show(pSeqList p);


#endif
运行界面:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值