大一下學期學習了數據結構,開始學的時候很懵逼,由於結構體等有些知識在大一上學期草草帶過,知識積累不足,導致有些看不懂,上機課即使照着打程式碼依舊不能順利執行程式。雖然《數據結構–用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;
}
能力有限只能寫這些了,這裏排版太難了,在程式上覆制的程式碼無法自動換行,一行一行的換。要哭了。如果對你有所幫助,麻煩給個贊!
如果有什麼問題歡迎指出,不嫌棄我們也可以相互討論問題哦。