数据结构第一天、线性表的顺序表示与实现

  今天心血来潮,突然想重新复习一遍数据结构并将其中的所有内容用C实现一遍。也算是为考研做点准备吧。今天是第一天,先将线性表的顺序表示实现了。

  在对算法的复习过程中没有产生太大的问题,插入、删除和查找的操作时间复杂度都是O(n)。因为假设两个线性表是已经排好序的,所以将两个线性表合成一个线性表的操作也是O(n)量级的。

  在写代码时却碰见了几个问题,首先是结构体变量赋值的问题。一起来看下面的代码:

#include <stdio.h>

typedef struct Test {
    int test1[10];
    int test2;
} Demo;

int main()
{
    Demo demo;
    demo.test2 = 5;
    for (int i = 0; i < 5; i++) {
        demo.test1[i] = i + 1;
    }
    
    for (int i =0; i < 5; i++) {
        printf("%d ", demo.test1[i]);
    }

    printf("\n");

    Demo demo2 = {
        {1,2,3,4,7},
        4
    };    
    

    for (int i =0; i < 5; i++) {
        printf("%d ", demo2.test1[i]);
    }

    printf("\n");
}

可以看出比较普遍的有两种方式来给结构体变量赋值,一种是较为简单的一次赋值,另一种是先声明后再逐个结构项进行赋值。

解决了这个问题后,就顺利多了,下面贴代码:

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #define MAXSIZE 100
  4 
  5 typedef struct {
  6     int Data[MAXSIZE];
  7     int Last;
  8 } List;
  9 
 10 //List L, *PtrL;
 11 
 12 //初始化,建立空的顺序表
 13 List *MakeEmpty()
 14 {
 15     List *PtrL;
 16     PtrL = (List *)malloc(sizeof(List));
 17     PtrL->Last = -1;
 18     return PtrL;
 19 }
 20 
 21 //查找
 22 int Find(int X, List *PtrL)
 23 {
 24     int i = 0;
 25     while (i <= PtrL->Last && PtrL->Data[i] != X) {
 26         i++;
 27     }
 28     if (i > PtrL->Last)
 29     {
 30         return -1;
 31     } else {
 32         return i;
 33     }
 34 }
 35 
 36 //插入
 37 void Insert(int X, int i, List *PtrL)
 38 {
 39     int j;
 40     if (PtrL->Last == MAXSIZE - 1)
 41     {
 42         printf("表满\n");
 43         return;
 44     }
 45     if (i < 1 || i > PtrL->Last + 2)
 46     {
 47         printf("位置不合法\n");
 48         return;
 49     }
 50     for (j = PtrL->Last; j >= i-1; j--)
 51     {
 52         PtrL->Data[j+1] = PtrL->Data[j];
 53     }
 54     PtrL->Data[i-1] = X;
 55     PtrL->Last++;
 56     return;
 57 }
 58 
 59 
 60 //删除
 61 void Delete(int i, List *PtrL)
 62 {
 63     int j;
 64     if (i < 1 || i > PtrL->Last + 1)
 65     {
 66         printf("没有此元素\n");
 67         return;
 68     }
 69     for (j = i; j <= PtrL->Last; j++)
 70     {
 71         PtrL->Data[j-1] = PtrL->Data[j];
 72     }
 73     PtrL->Last--;
 74     return;
 75 }
 76 
 77 
 78 //遍历
 79 void Traverse(List *PtrL)
 80 {
 81     for (int i = 0; i < PtrL->Last; ++i)
 82     {
 83         printf("%d ", PtrL->Data[i]);
 84     }
 85     printf("\n");
 86 }
 87 
 88 
 89 //将已知顺序表La和Lb的元素按值非递减排列
 90 void MergeList(List La, List Lb, List Lc)
 91 {
 92     //int length = (La.Last >= Lb.Last) ? Lb.Last : La.Last;
 93     int pa = 0;
 94     int pb = 0;
 95     int pc = 0;
 96     while (pa < La.Last && pb < Lb.Last) {
 97         if (La.Data[pa] <= Lb.Data[pb])
 98         {
 99             Lc.Data[pc++] = La.Data[pa++];
100         } else {
101             Lc.Data[pc++] = Lb.Data[pb++];
102         }
103     }
104     while (pa < La.Last)
105         Lc.Data[pc++] = La.Data[pa++];
106     while (pb < Lb.Last)
107         Lc.Data[pc++] = Lb.Data[pb++];
108 }
109 
110 List MergeList1(List La, List Lb)
111 {
112     //int length = (La.Last >= Lb.Last) ? Lb.Last : La.Last;
113     int length = La.Last + Lb.Last;
114     List Lc;
115     Lc.Last = length;
116     int pa = 0;
117     int pb = 0;
118     int pc = 0;
119     while (pa < La.Last && pb < Lb.Last) {
120         if (La.Data[pa] <= Lb.Data[pb])
121         {
122             Lc.Data[pc++] = La.Data[pa++];
123         } else {
124             Lc.Data[pc++] = Lb.Data[pb++];
125         }
126     }
127     while (pa < La.Last)
128         Lc.Data[pc++] = La.Data[pa++];
129     while (pb < Lb.Last)
130         Lc.Data[pc++] = Lb.Data[pb++];
131     return Lc;
132 }
133 
134 
135 
136 int main(int argc, char const *argv[])
137 {
138     /*
139     List L = {
140         {11, 2, 4, 5, 6},
141         5
142     };
143     */
144 
145     List *PtrL = MakeEmpty();
146     for (int i = 1; i < 20; ++i)
147     {
148         int e = i + 1;
149         Insert(e, i, PtrL);
150     }
151     //scanf("%d\n", &PtrL->Last);
152 
153     /*
154     for (int i = 0; i < PtrL->Last; ++i)
155     {
156         scanf("%d", &PtrL->Data[i]);
157     }
158     */
159 
160     //PtrL->Last = 5;
161     //PtrL->Data{1, 2, 4, 5, 6};
162 
163     int findNum = Find(0, PtrL);
164     printf("%d\n", findNum);
165 
166     Insert(30, 2, PtrL);
167     Traverse(PtrL);
168     Delete(2,PtrL);
169     Traverse(PtrL);
170 
171     //测试MergeList函数
172     List la = {
173         {2, 3, 4, 7, 8},
174         5
175     };
176     List lb = {
177         {1, 2, 4, },
178         4
179     };
180 
181     /*
182     List lc = {
183         {0, 0, 0, 0, 0, 0, 0, 0, 0},
184         9
185     };
186     */
187 
188     //MergeList(la, lb, lc);
189     List lc = MergeList1(la, lb);
190     Traverse(&la);
191     Traverse(&lb);
192     Traverse(&lc);
193     return 0;
194 }

 

posted @ 2015-07-09 08:48  wgqtmac  阅读(351)  评论(0)    收藏  举报