1 #include<stdio.h> //增+刪+改+初始化+輸出 2 #include<stdlib.h> 3 #define MaxSize 10 此數決定了后面插入數據的多少,超過該數字輸出順序表的時候不是正確的數 4 typedef int ElementType; 5 struct SqList { 6 ElementType elem[MaxSize]; 7 int Length; 8 }; 9 10 typedef struct SqList *PtrNode; 11 typedef PtrNode List; 12 13 List InitList(); 14 int InSert(List L, int i, ElementType x) ; 15 int Delete(List L, int i); 16 int GetElem(List L, int i); 17 int Print(List L); 18 19 int main() { 20 int a; 21 ElementType x; 22 List list; 23 list=InitList(); 24 InSert(list, 1, 1); 25 InSert(list, 2, 2); 26 InSert(list, 3, 3); 27 Print(list); 28 printf("第一處的元素為:%d\n",GetElem(list,1)); 29 printf("要刪除第幾處的數據"); 30 scanf("%d", &a); 31 Delete(list, a); 32 Print(list); 33 } 34 List InitList() { //初始化 35 List L; 36 L = (List)malloc(sizeof(struct SqList)); 37 L->Length = 0; 38 printf("初始化成功\n"); 39 return L; 40 } 41 //插入 42 int InSert(List L, int i, ElementType x) { 43 int j; 44 if (i<1 || i>L->Length + 1) { 45 printf("越界"); return 0; 46 } 47 for (j = L->Length; j >= i; j--) { 48 L->elem[j] = L->elem[j-1]; L—>elem[j+1]=L->elem[j];是錯誤的,j是數組長度,用作數組索引時要小心,所以上面的條件不應該是j>i
49 } 50 L->elem[i - 1] = x; //第i處,因為是數組所以減一 51 L->Length++; 52 return 1; 53 } 54 //刪除 55 int Delete(List L, int i) { 56 int j; 57 if (i<1 || i>L->Length) { 58 printf("越界"); return 0; 59 } 60 for (j = i - 1; j < L->Length-1; j++) 61 L->elem[j] = L->elem[j+1]; 62 L->Length--; 63 return 1; 64 65 } 66 //查找第i處的數據 67 int GetElem(List L, int i) { 68 if (i<1 || i>L->Length) { 69 printf("越界"); return 0; 70 } 71 return L->elem[i - 1]; 72 } 73 //遍歷輸出 74 int Print(List L) { 75 int i = 0; 76 for (i; i < L->Length; i++) 77 printf("%d\n", L->elem[i]); 78 }
1. 初始化:
1 List InitList() { //初始化 2 List L; 3 L = (List)malloc(sizeof(struct SqList)); 4 L->Length = 0; 5 printf("初始化成功\n"); 6 return L; 7 }
(1)malloc開辟空間,L指向該空間
(2)空間的Length屬性賦值為零;
2.插入:
int InSert(List L, int i, ElementType x) { 43 int j; 44 if (i<1 || i>L->Length + 1) { 45 printf("越界"); return 0; 46 } 47 for (j = L->Length; j > i; j--) { 48 L->elem[j + 1] = L->elem[j]; 49 }此處錯誤,修改見上面完整代碼 50 L->elem[i - 1] = x; //第i處,因為是數組所以減一 51 L->Length++; 52 return 1; 53 }
(1)判斷輸入的待插入位置是否合理------要插入的位置是否小於1,或者大於順序表的長度Length+1【與其他的不同:可以在Length+1位置插入】
(2)如果不滿足(1),則循環賦值------從順序表最后一個位置開始,從后向前依次將前一個位置的值賦給后一個位置
(3)插入待插入數x-------將x賦值給待插入位置
(4)順序表長度加一
3.刪除:
int Delete(List L, int i) { 56 int j; 57 if (i<1 || i>L->Length) { 58 printf("越界"); return 0; 59 } 60 for (j = i - 1; j < L->Length-1; j++) 61 L->elem[j] = L->elem[j+1]; 62 L->Length--; 63 return 1; 64 65 }
(1)判斷輸入的待插入位置是否合理------要插入的位置是否小於1,或者超出順序表的長度Length
(2)如果不滿足(1),則循環賦值-------從待刪除位置開始,從前向后依次將后一個位置的值賦值給前一個位置
(3)順序表長度減一
4.查找:
67 int GetElem(List L, int i) { 68 if (i<1 || i>L->Length) { 69 printf("越界"); return 0; 70 } 71 return L->elem[i - 1]; 72 }
(1)判斷輸入的待插入位置是否合理------要插入的位置是否小於1,或者超出順序表的長度Length
(2)直接根據數組下標返回該值
5.輸出:
74 int Print(List L) { 75 int i = 0; 76 for (i; i < L->Length; i++) 77 printf("%d\n", L->elem[i]); 78 }
根據數組下標直接循環輸出
**********************************************
Tips:初始化和查找必須有返回值(初始化要將創建的順序表名返回;查找要將找到的值返回),其他函數可以不設返回值或者返回1