顺序表

原创 2018年04月16日 16:42:32

这是老师布置的课本上的作业,欢迎大家一起来交流,很欢迎指点,大一第一次做这种事。我用的课本是浙大的数据结构,陈越和何钦铭出的书,第一篇是顺序表的代码:


#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define MAXSIZE 100
#define ERROR -1
#define NotFound 0
 
typedef int Position;
struct LNode
{
	int *date;
	Position Last;
	int MaxSize;
};
typedef struct LNode *PtrToLNode;
typedef PtrToLNode List;

void show();
List MakeEmpty(int MaxSize);
Position Find(List L, int X);
bool Insert( List L, int X, int i);
bool Delete(List L, int i);
Position BinarySearch(List L, int X);
void print(List L);

int main()
{
	int n=-1, k, X, i, c=0, j=0;
	List L = (List)malloc(sizeof(struct LNode));
	while(1)
	{
		if(c==1||j==0)
		{
		show();
		j = 1;
		}
		scanf("%d", &n);
		//system("pause");
		if(n>6||n<-1)
		{
		printf("请输入合法数字!请选择菜单序号:");
		continue;
		}
		switch(n)
		{
			case 1:
			{
				L = MakeEmpty(MAXSIZE);
				if(L)
				c=1;
			} 
			break;
			
			case 2:
			{
			    if(1==c)
			    {
			     printf("请输入你要查找的数字:");
			     scanf("%d", &X);
				 k = Find(L, X);
				 if(k==ERROR)
				 printf("查找无效!重新查询\n");
				 else
				 printf("你查找的数字在第%d个位置上\n", k+1);
			    }
			    else
			    {
			    printf("失败!您还未创建表。重新选择:"); 
			    }
			}break;
			
			case 3:
			{
				if(1==c)
				{
				printf("请输入你要插入的位置:");
				scanf("%d", &i);
				printf("请输入你要插入的数字:");
				scanf("%d", &X); 
				k = Insert( L, X, i);
				if(k)
				printf("插入成功\n");
				else
				printf("插入失败\n");
				}
				else
			    {
			    printf("失败!您还未创建表。重新选择:"); 
			    } 
			}break;
			
			case 4:
			{
				if(1==c)
				{
				printf("输入你要删除的位序号:");
				scanf("%d", &i);
				k = Delete(L, i);
				if(k)
				printf("删除成功!\n");
				else
				printf("删除失败,请输入合法序号或检查表容量");
				}
				else
				{
				printf("失败!您还未创建表。重新选择:"); 
				}
			}break;
			
			case 5:
			{
			if(1==c)
			{
			printf("请输入需要查找的数字:");
			scanf("%d", &X);
			k = BinarySearch(L, X);
			if(k)
			printf("查找的数字在第%d位置上\n", k+1);
			else
			printf("查找失败!\n");
			}
			else
			{
			printf("失败!您还未创建表。重新选择:"); 	
			}
			}break;
			
			case 6:
			if(1==c)
			{
			print(L);	
			}
			else
			{
			printf("失败!您还未创建表。重新选择:"); 	
			}
			break;	
		} 
		if( n==0 )
		break;
	}
}

List MakeEmpty(int MaxSize)//创建顺序表 
{
	List L;
	L = (List)malloc(sizeof(struct LNode));
	L->date = (int*)malloc(MaxSize*sizeof(int));
	L->Last = -1;


	int i=0 , n, k=0;
	printf("输入一连串数字,中间用空格分开, 输入0退出:");
	while(1)
	{
		scanf("%d", &n);
		if( n==0 )
		break;
		L->date[i] = n;
		L->Last++;//让指向最后的那个指针指向最后的一个数据的位置 
		i++; 
		k = 1;
	}
	if(k==1)
	printf("创建成功\n\n");
	else
	printf("创建失败\n\n");
	
	return L;
}

Position Find(List L, int X)//查找函数 
{
	Position i=0;
	while( i<L->Last&&L->date[i]!=X)
	i++;
	if( i>L->Last)
	return ERROR;
	else
	return i;
}

bool Insert( List L, int X, int i)//插入函数 
{
	Position j;
	
	if(L->Last == MAXSIZE-1 )
	{
		printf("表满\n");
		return false; 
	}
	if(i<1||i>L->Last+2)
	{
		printf("位序不合法\n");
		return false;
	}
	for( j=L->Last; j>=i-1; j-- )
	L->date[j+1] = L->date[j];
	
	L->date[i-1] = X;
	L->Last++;
	
	return true;
}

bool Delete(List L, int i)//删除函数 
{
	Position j;
	
	if( i<1||i>L->Last+2 )
	{
	printf("位序%d不存在元素\n", i);
	return false;
	}
	
	for( j=i; j<=L->Last; j++ )
	L->date[j-1] = L->date[j];
	
	L->Last--;
	return true;
}

Position BinarySearch(List L, int X)//这里是二分查找法 
{
	Position left, right, mid;
	
	left = 0;
	right = L->Last;
	while(left<=right)
	{
		mid=(left+right)/2;
		if( X<L->date[mid])
		right = mid-1;
		else if( X>L->date[mid])
		left = mid+1;
		else 
		return mid;
	}
	return NotFound;
}
void print(List L)
{
	int i;
	printf("该序列为:");
	if( L->Last == -1 )
	printf("序列空\n");
	else
    for( i=0; i<=L->Last; i++)
	printf("%d ", L->date[i]);
	printf("\n"); 
}

void show()
{
	printf("\n");
	printf("         *************顺序表*************\n");
	printf("         *         1.输 入 数 字        *\n");
	printf("         *         2.查 找 数 字        *\n");
	printf("         *         3.插 入 数 字        *\n");
	printf("         *         4.删 除 数 字        *\n");
	printf("         *         5.二分法 查找        *\n");
	printf("         *         6.查 询 显 示        *\n");
	printf("         *         0.退 出 系 统        *\n");
	printf("         ********************************\n");
	printf("请选择菜单序号:"); 

}



收藏助手
不良信息举报
您举报文章:顺序表
举报原因:
原因补充:

(最多只允许输入30个字)