1. 程式人生 > >資料結構--順序表實現資料處理系統(C語言)

資料結構--順序表實現資料處理系統(C語言)

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

#define MAXSIZE 10 
#define OK 1
#define ERROR 0
#define true 1 



typedef int Status;
typedef int DataType; 

typedef struct {
	DataType *Element;
	int Length;
}List; 


//
Status InitList(List *L)  ;  //順序表初始化 

Status DestoryList(List *L);  //銷燬順序表 

Status InputList(List *L); //輸入順序表 

Status Find_Position(List *L); //查詢(2), 按位置查詢 
Status Find_Value(List *L) ;//查詢(1), 按值查詢 

Status TraverList(List *L); //遍歷順序表 

Status Delete_Value(List *L) ;//按值刪除  
Status Delete_Position(List *L);//按位置刪除 
Status Reverse_List(List *L); //順序表逆置  
Status Revise_Position(List *L); //按位置修改 
Status Revise_Value(List *L); //按值修改   
//




 
Status InitList(List *L)//順序表初始化 
{
	List *p=L;
	
	
		p->Element=(DataType*)malloc(sizeof(MAXSIZE));
	//	printf("\n1\n");
		//if(!p->Element)
		//exit(OVERFLOW);
	//	printf("\n2\n");
		p->Length=-1;
	//	printf("\n3\n");
	
		return OK;
	
} 



Status DestoryList(List *L)  //銷燬順序表 
{
	
	if(L->Element==NULL||L==NULL)
	{
		printf("\n順序表已經為空!\n");
		return ERROR;
	} 

	else
	{
		printf("\n\n");

		free(L->Element);
		//printf("\n釋放L->Element\n");

		L->Element=NULL;
		//printf("\nL->Element==NULL\n");
		L=NULL; 
		//printf("\nL==NULL\n");
		
		//printf("釋放成功!\n"); 
		return OK;
	}
		
}



Status InputList(List *L)//輸入順序表 
{
	printf("\n請元素個數\n");
	int n; 
	scanf("%d", &n);
	
	printf("\n輸入元素的值:\n");
	for(int i=0; i<n; i++)
	{
		scanf("%d", &L->Element[i]);
		L->Length++;
	} 
	
	printf("\n輸出此順序表!\n");
	
	int s= TraverList(L);
	 
	return OK;
}



Status TraverList(List *L) //遍歷順序表 
{
//	printf("\n輸出此順   序表!\n");
	//if(L!=NULL)
	if(L->Length==-1)
	{
		printf("\n當前順序為空表\n");
		return ERROR;
	}
	
//printf("\n\n輸出此順序表!\n");
	for(int i=0; i<=L->Length; i++)
		printf("%d ", L->Element[i]);
	
	
	return OK; 
} 


Status Find_Value(List *L) //查詢(1), 按值查詢 
{
	int e=0, flag=0, x=0;
	printf("\n當前順序表為:\n");
	int s= TraverList(L); 
	printf("\n請輸入要查的數值:\n");
	scanf("%d", &e);
	
	for(int i=0; i<=L->Length; i++)
		if(e==L->Element[i])
		{
			printf("L->Element[i]==%d:\n", L->Element[i]);
			printf("L->Length===%d:\n", L->Length);
			x=i;
			flag=1;
		} 
		
	if(flag==0)
	{
		printf("\n輸入的資料不再順序表中!\n");
		return ERROR;
	}
	else
	{
		printf("\n%d是順序表的第%d個元素\n", e, x+1);
		return OK;
	}
	
}



Status Find_Position(List *L) //查詢(2), 按位置查詢 
{
	int p=0, e=0, x=0, flag=0;
	
	printf("\n當前順序表為:\n"); 
	int s= TraverList(L); 
	
	if(L->Length==-1)
	printf("\n當前為空表,不執行查詢!]n");

	printf("\n\n請輸入要查詢的位置!\n");
	scanf("%d", &p);
	
	if(p<1||p>L->Length+2)
	{
		printf("\n位置輸入不合法!\n"); 
		return ERROR; 
	}
	
	for(int i=0; i<=L->Length; i++)
	{
		if(p==i+1)
		{
			x=i; 
			e=L->Element[i];
			flag=1;
		}
	}
	
	if(flag==1)
	{
		printf("第%d個元素是%d", x+1, e);
		return OK;
	}
	else	
		return ERROR; 
	 
}



Status InsertList_Position(List *L) //按位置插入順序表 
{
	int p=0,e=0;
	
	
	printf("\n\n請輸入要插入的位置\n\n");
	scanf("%d", &p);
	
	if(p<1||p>L->Length+2)
	{
		printf("\n輸入不合法!\n");
		return ERROR; 
	} 
	
	printf("\n\n請輸入要插入的數值\n\n");
	scanf("%d", &e);
	
	printf("\n插入後的數值為:\n");
	int s1= TraverList(L);
	for(int i=L->Length; i>=p-1;i--)
	{
		
		L->Element[i+1]=L->Element[i];		
	}	
	
	L->Element[p-1]=e;
	
	L->Length++; 
	
	printf("\n插入後的數值為:\n");
	int s2= TraverList(L);
	
	
	return OK; 
} 



Status Delete_Value(List *L) //按值刪除  
{
	
	int e=0, flag=0,x=0;
	printf("\n當前順序表為\n");
	int s1=TraverList(L);//遍歷順序表 

	printf("\n輸入要刪除的數值\n");
	scanf("%d", &e);		
	for(int i=0; i<=L->Length;i++)
	{
		if(L->Element[i]==e)
		{
			x=i;
			flag=1; 
		}
	}
	
	if(flag==1)
	{
		printf("刪除後的順序表為\n");
		for(int i=x; i<=L->Length;i++)
			L->Element[i]=L->Element[i+1];
		L->Length--; 
		int s2=TraverList(L);//遍歷順序表 

		return OK;
	}
	else
	return ERROR;  
} 


Status Delete_Position(List *L) //按位置刪除  
{
	int p=0;
	printf("\n當前順序表為\n");
	int s1=TraverList(L);//遍歷順序表 

	printf("\n輸入要刪除的元素的位置\n");
	
	scanf("%d", &p); 
	
	if(p<1||p>L->Length+2)
	{
		printf("\n輸入有誤!\n");
		return ERROR; 
	}	 
	else
	{
		printf("刪除後的順序表為\n");
		for(int i=p-1; i<=L->Length; i++)
			L->Element[i]=L->Element[i+1];
			L->Length--;
		int s2=TraverList(L);//遍歷順序表 
		return OK; 
	}
} 

Status Sort_List(List *L) //排序  
{
	if(L->Length==-1)
	{
		printf("\n當前表順序表為空無法排序\n");
		return ERROR;
	} 
	
	printf("\n請選擇排序方式\n");
	printf("1.從小到大排序"); 
	printf("\n2.從大到小排序\n");
	
	int n;
	printf("\n請輸入操作:\n");
	scanf("%d", &n);
	
	if(n==1)
	{
		int Tmp;
		printf("\n當前順序表\n");
		int s0=TraverList(L); 
		
		for(int i=0;i<=L->Length;i++)
			for(int j=0;j<=L->Length;j++) 
			if(L->Element[i] < L->Element[j]) 
			{
				Tmp=L->Element[i];
				L->Element[i]=L->Element[j];
				L->Element[j]=Tmp;
			}	
		printf("\n從小到大排序後的順序表\n");
		int s1=TraverList(L);
	}
	
	if(n==2)
	{
		int Tmp;
		printf("\n從大到小排序前的順序表\n");
		int s0=TraverList(L);
		
		for(int i=0;i<=L->Length;i++)
			for(int j=0;j<=L->Length;j++) 
		
			if(L->Element[i] > L->Element[j]) 
			{
				Tmp=L->Element[i];
				L->Element[i]=L->Element[j];
				L->Element[j]=Tmp;
			}
	
		printf("\n從大到小排序後的順序表\n");	
		int s1=TraverList(L);
	}
	
	return OK; 
}

Status Reverse_List(List *L) //順序表逆置  
{
	printf("\n當前順序表\n");	
	int s1=TraverList(L);
	//順序表實現逆置 
	int Tmp=0, p=L->Length;
	
	for(int i=0;i<=p/2;i++, p--)
	{
		Tmp=L->Element[i];
		L->Element[i]=L->Element[p];
		L->Element[p]= Tmp;	
	}
	
	printf("\n逆置後的順序表\n");
	int s=TraverList(L);
	
	
	
	return OK; 
}


Status Revise_Position(List *L) //按位置修改  
{
	printf("\n修改前順序表為:\n");
	int s=TraverList(L);
	printf("請輸入要替換元素位置");
	int p; 
	scanf("%d", &p);
	if(p<1||p>L->Length+2)
	{
		printf("\n位置輸入有誤!\n");
		return ERROR;
	}
	else{
		printf("\n請輸入新值:\n");
		int e=0;
		scanf("%d", &e);
		for(int i=0; i<=L->Length;i++){
			if(i==p-1)
			{
				L->Element[i]=e; 
			} 
		}
		
		printf("\n修改後順序表為:\n"); 
		int s1=TraverList(L);
		return OK;
	}
} 

Status Revise_Value(List *L) //按值修改  
{
	int x=0, e=0, flag=0,q=0;
	printf("當前順序表為:\n");
	int s1= TraverList(L) ;
	printf("\n請輸入要修改的數值:\n");
	scanf("%d", &x);
	
	for(int i=0; i<=L->Length;i++)
	{
		if(L->Element[i]==x)
		{
			//L->Element[i]=e;
			flag=1;
			q=i;
		}
		
	} 
	
	if(flag==0)
	{
		printf("\n查詢不到要修改的值,輸入有誤!\n");
		return ERROR;
	}
	else{
		printf("\n請輸入新值:\n");
		scanf("%d", &e);
	
		for(int i=q; i<=L->Length;i++)
		{
			if(L->Element[i]==x)
			{
				L->Element[i]=e;
				flag=1;
			}
			
		} 	
		
		int ss=TraverList(L);
		return OK;
	}
	
}



int  main()
{
	List L;
	
	int s1=0,s2=0;
	printf("\t\t***************************************************************"); 
	printf("\n賬號登陸:"); 
	printf("\n"); 
	
	printf("\n請輸入管理員賬號:\n");
	printf("\n"); 
	scanf("%d", &s1);
	printf("\n請輸入管理員密碼\t\tn");
	printf("\n");
	scanf("%d", &s2);
	
	
if(s1==123&&s2==123)
{
	printf("密碼正確正在載入系統");
	int i;
	while(i<1000000)
	{
		if(i%100==0)
		{
				//printf("i==%d", i);
			printf(">");	
		}
	i++;
	}
	system("cls");
 
	while(true) 
	{		
			printf("\n\n"); 
			//printf("0.test\n");
			
			printf("\n\t\t\t+++++++++++++++++++++++++++++歡迎進入資料管理系統++++++++++++++++++++++++\n"); 
			printf("");
			
			printf("\n\t\t\t*************************************************************************\n"); 
			printf("\t\t\t|1.順序表的初始化\t\t\t5.順序表的刪除(按值和按位置)    |\n"); 
			printf("\t\t\t|2.輸入一個順序表的值\t\t\t6.修改元素(按值和按位置)\t|\n");
			printf("\t\t\t|3.查詢元素(按值和按位置)\t\t7.遍歷順序表          \t\t|\n");
			printf("\t\t\t|4.順序表的插入(按值和按位置)\t\t8.排序            \t\t|\n");  
			printf("\t\t\t|9.逆置\t\t\t\t\t10.銷燬順序表                  \t|\n");
			printf("\t\t\t|11.清屏\t\t\t\t12.退出系統           \t\t|\n");
			printf("\t\t\t*************************************************************************\n"); 

			printf("\n\n");
			
			int c;
			scanf("%d", &c);
		
			switch(c)
			{
				case 1:
				if(InitList(&L)==OK)
				printf("\n初始化成功!\n");
				else
				printf("\n初始化失敗!\n");
				break;//順序表初始化  
				
				case 2:
				if(InputList(&L)==OK)
				printf("\n輸入順序表成功!\n"); 
				else
				printf("\n輸入順序表失敗!\n");
				break;
				
				case 3:
					{
						printf("\n請輸入要選擇的操作\n");
						printf("\n1.按值查詢\n");
						printf("\n2.按位置查詢\n");
						printf("\n其它鍵.返回上一層\n");
						int n;
						scanf("%d", &n); 
					
						if(n==1)
						{
							if(Find_Value(&L)==OK)
							printf("\n按值查詢成功!\n"); 
							else
							printf("\n按值查詢失敗!\n"); 
							
						}
						if(n==2) 
						{
							if(Find_Position(&L)==OK)
							printf("\n按位置查詢成功!\n"); 
							else
							printf("\n按位置查詢失敗!\n");
						}
					}
				
				;break;
				
				case 4:
				{	
					printf("\n請輸入要選擇的操作\n");
					printf("\n1.按位置插入\n");
					printf("\n其它鍵.返回上一層\n");
					int n;
					scanf("%d", &n); 
				
					
					if(n==1) 
					{
						if(InsertList_Position(&L)==OK)
						printf("\n按位置插入成功!\n"); 
						else
						printf("\n按位置插入失敗!\n");
					}
				}
				;break;
				
				case 5:
				{
						printf("\n請輸入要選擇的操作\n");
						printf("\n1.按值刪除\n");
						printf("\n2.按位置刪除\n");
						printf("\n其它鍵.返回上一層\n");
						int n;
						scanf("%d", &n); 
					
						if(n==1)
						{
							if(Delete_Value(&L)==OK) //按值刪除  
							printf("\n按值刪除成功!\n"); 
							else
							printf("\n按值刪除失敗!\n"); 
							
						}
						if(n==2) 
						{
							if(Delete_Position(&L)==OK) //查詢(2), 按位置查詢(&L)==OK)
							printf("\n按位置查詢成功!\n"); 
							else
							printf("\n按位置查詢失敗!\n");
						}
				};
				break;
				case 6:
				{
					printf("\n請輸入要選擇的操作\n");
						printf("\n1.按值修改\n");
						printf("\n2.按位置修改\n");
						printf("\n其它鍵.返回上一層\n");
						int n;
						scanf("%d", &n); 
					
						if(n==1)
						{
							if(Revise_Value(&L)==OK) //按值修改  
							printf("\n按值修改成功!\n"); 
							else
							printf("\n按值修改失敗!\n"); 
							
						} 
						if(n==2) 
						{
							if(Revise_Position(&L)==OK)
							printf("\n按位置修改成功!\n"); 
							else
							printf("\n按位置修改失敗!\n");
						}
					
				};
				break;
				case 7:
				{
					if(TraverList(&L)==OK)
					printf("\n遍歷成功!\n");
					else
					printf("\n遍歷失敗!\n");
				};
				
				break;
				case 8:
				{
					if(Sort_List(&L)==OK)
						printf("\n排序成功!\n"); 
						else
						printf("\n排序失敗!\n");
				};
				break;
				case 9:
				{
					if(Reverse_List(&L) ==OK)
					printf("\n順序表逆置成功!\n");
					else
					printf("\n順逆置失敗!\n");
				};
				break;
				case 10:
				{
					if(DestoryList(&L) ==OK)
					printf("\n順序表銷燬成功!\n");
					else
					printf("\n順序表銷燬失敗!\n");
				}; 
				break;//清屏
				case 11:
				{
					system("cls");	
				}
				break;
				case 12:
				{
					printf("\n退出系統!\n"); 
					return ERROR;
				}; break;
				
	 			default:printf("\n輸入有誤!\n");break;
			} 			
	}

}
else 
{
	printf("\n密碼或賬號輸入有誤!\n");
}	
	return 0;
}