順序表(數據結構)

這是老師佈置的課本上的作業,歡迎大家一起來交流,很歡迎指點,大一第一次做這種事。我用的課本是浙大的數據結構,陳越和何欽銘出的書,第一篇是順序表的代碼:


#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("請選擇菜單序號:"); 

}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章