數據結構線性表之順序儲存

2020-08-11 18:51:53

大一下學期學習了數據結構,開始學的時候很懵逼,由於結構體等有些知識在大一上學期草草帶過,知識積累不足,導致有些看不懂,上機課即使照着打程式碼依舊不能順利執行程式。雖然《數據結構–用C語言描述》–耿國華,這本書給出了大部分程式碼,但是沒有給出主函數呼叫,問題在於同一個結構裡的不同函數給出的程式碼呼叫形式不統一,導致初學者不懂得怎麼呼叫。

問題就是圖上內容,這一段話理解倒是不難,但是實際操作起來會有很大的差別。而當書本上同時出現的時候,我完全傻了,怎麼試都是錯誤的。
演算法2.1中將L定義爲SeqList 型別的變數,如果後面都用此方法問題不大。但是,問題來了,到了什麼不懂的小白身上如果風格不統一,那麼這對他來說是個無法發現的大問題在这里插入图片描述
在这里插入图片描述
就像《數據結構–用C語言描述》–耿國華這本書中一樣,前面是將L定義爲SeqList 型別的變數,後面就變成了指針變數。所以我還有很多同學都很懵逼。

哎!自己菜是原罪。
在这里插入图片描述
在这里插入图片描述
明白問題所在之後我就統一了型別,全都使用第一種方式。(第二種試過無數次都沒成功,希望有大佬看到能教一下)

#include<stdio.h>
#include<stdlib.h>
 #include<malloc.h>
 #include<conio.h>
 #define FALSE 0
 #define TRUE 1
 #define  MAXSIZE 100
 typedef int ElementType;
 typedef struct
 {	
 	ElementType elem[MAXSIZE];		/*線性表佔用的陣列空間*/	
 	int last;				/*記錄線性表最後一個元素在陣列elem[ ]的位置(下標值)*/
 	}SeqList;	

SeqList InitList(SeqList L){			/*初始化表*/	
	L.last=-1;				/*空表爲-1*/
	return L;
	}

SeqList EnterList(SeqList L){			/*在空表中插入n個元素*/
	int i,n,j;	
	i=L.last;	
	printf("你將輸入多少個數:\n");	scanf("%d",&n);	
	printf("請輸入:\n");
	for(j=0;j<n;j++){		
		scanf("%d",&L.elem[i+j]);		
		L.last++;	
		};
	return (L);}

SeqList InsList(SeqList L,int i,ElementType e){	/*在位置爲i的地方插入e元素*/	
	int k;
	if((i<1)||(i>L.last+2)){		/*判斷插入位置是否合法*/		
		printf("插入位置不合法!\n");		
		return (L); 	
		}	
	if((L.last>=MAXSIZE-1)){		
		printf("表已滿!\n");
		return (L); 
		}	
	for(k=L.last;k>=i-1;k--){		/*爲插入元素移動位置*/		
	L.elem[k+1]=L.elem[k];	
		}	
	L.elem[i-1]=e;				/*陣列中,第i個元素的下標爲i-1*/	
	L.last++;	
	return (L);
	}

int Locate(SeqList L,ElementType e){		/*查詢元素爲e的元素*/	
int i=0;	
while((i<=L.last)&&(L.elem[i]==e))
	i++;	
if(i<=L.last)		
	return (i+1);	
else return (-1);}

SeqList DellList(SeqList L,ElementType e){	/*刪除元素爲e的函數*/	
	int k,i,j=0;	
	while((L.elem[j]!=e)&&(j<=L.last)){	/*查詢e元素的位置*/		
		j++;	
		}	
	if(j>L.last){		
		printf("無該e值\n"); 		/*判斷所查元素是否存在,不存在輸出‘無該e值’*/ 
		}					
	else {	 	 			
		printf("e的位置在i=%d\n",j+1);
	for(k=j;k<=L.last;k++)		
		L.elem[k]=L.elem[k+1];	
		L.last--;
		}	
		return (L);
	}

void PrintList(SeqList L){			/*輸出函數,輸出順序表各個元素*/
	int i;	
	if((L.last)<0)		
		printf("表爲空!");		/*表爲空時輸出*/	
	for(i=0;i<L.last;i++){		
	printf("%d ",L.elem[i]);	
		}
	}

int main(){	
	SeqList L;
	ElementType e;	
	int i,k;	
	do{	 	
		printf("輸入你的選擇:\n"); 	
		printf("1.建立線性表\n");	
		printf("2.新增n個數\n");	
		printf("3.在位置i插入元素e\n");
		printf("4.刪除值爲e元素,返回i值");	
		printf("5.查詢位置爲i的元素\n");	
		printf("6.結束程式\n");	
		scanf("%d",&k);	
	switch(k){		
		case 1:{			
			L=InitList(L);			
			PrintList(L);			
			break; 	
			}			
		case 2:{			
			L=EnterList(L);			
			PrintList(L);			
			break;	
			}		
		case 3:{			
			printf("i=?,e=?\n");			
			scanf("%d %d",&i,&e);			
			L=InsList(L,i,e);			
			PrintList(L);						
			break;	
			}		
		case 4:{			
			printf("你要刪除元素e爲:\n");				
			scanf("%d",&e); 			
			L=DellList(L,e);			
			PrintList(L);	 				
			break;		
			} 	
		}
		}while(k>=1&&k<5);
	return 0;
}

能力有限只能寫這些了,這裏排版太難了,在程式上覆制的程式碼無法自動換行,一行一行的換。要哭了。如果對你有所幫助,麻煩給個贊!
如果有什麼問題歡迎指出,不嫌棄我們也可以相互討論問題哦。