順序表的基本操作-完整代碼和拆開分析


 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM