在学习完大量的计算机原理知识之后,个人发现需要在二方面都得具备:一方面是宏观知识,主要是对整个计算机系统的理解和软件设计相关的基础知识。另一方面则是微观知识,具体表现为某个或某一类算法的原理及实现思想。如果只是谈及第一部分而没有具体做过的话(实现的话),感觉也只是纸上谈兵,而且计算机理论基础,包括操作系统内核代码实现则需要有扎实的算法基础和数据结构知识。缺少这个的话,无法向着高级程序员迈进。这两年自己确实学习了不少东西,看过的包括国内外原版图书有几十本之多,对计算机基础理论至少算是有了个初步的理解和认识。现在总结来看的话,理论与实践一个都不能少!如果程序员只是利用写好的第三方库(比如glibc,QT,boost等),或者调用别人写好的接口,顶多算是个code monkey,不会有什么核心竞争力。这种工作新人一年半载的就可以利用得很熟了。个人觉得,算法不一定全部都得实现也没必要,但是主流算法的大致思想起码要很明晰。因此,最近自己又在重新回顾之前上学时间学的的《数据结构》相关知识。 本次只是把严蔚敏最新版的《数据结构》一书重新学习了下,并按照书中给出的算法步骤,实现了简单的线性表顺序表示,后面再把链式表示也敲一遍吧。目前自己只是看着伪代码就能把握其思想及实现细节,比之前的功底又加深了不少啊!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LIST_INIT_SIZE 128
#define LISTINCREMENT 10
/****************************************************
线性表的顺序表示(增加,删除,合并,删除等操作)
*****************************************************/
typedef struct
{
int *elem;
int length;
int listsize;
} SqList;
bool InitList_Sq(SqList *pList)
{
if (NULL == pList)
{
return false;
}
pList->elem = (int*)malloc(LIST_INIT_SIZE * sizeof(int));
if (!pList->elem)
{
return false;
}
pList->length = 0;
pList->listsize = LIST_INIT_SIZE;
return true;
}
bool ListDestroy_Sq(SqList *pList)
{
if (pList)
{
free(pList->elem);
return true;
}
return false;
}
bool ListInsert_Sq(SqList *pList, int i, int e)
{
if (i < 1 || i > pList->length + 1)
{
return false;
}
if (pList->length >= pList->listsize)
{
int *newbase = (int*)realloc(pList->elem,
(pList->listsize + LISTINCREMENT)*sizeof(int));
if (!newbase)
{
return false;
}
pList->elem = newbase;
pList->listsize += LISTINCREMENT;
}
int *q = &(pList->elem[i-1]);
for(int *p = &(pList->elem[pList->length - 1]); p >= q; --p)
{
*(p + 1) = *p;
}
*q = e;
++pList->length;
return true;
}
bool ListDelete_Sq(SqList *pList, int i, int *e)
{
if (NULL == pList)
{
return false;
}
if (i < 1 || i > pList->length)
{
return false;
}
int *q = &(pList->elem[i-1]);
*e = *q;
for (int *p = q; p < pList->elem + pList->length - 1; p++)
{
*p = *(p + 1);
}
pList->length--;
return true;
}
void reverse_print(SqList *pList, bool isReverse)
{
if (pList == NULL)
{
return;
}
if (isReverse)
{
for (int i = pList->length - 1; i >=0; i--)
{
printf("%d\n", pList->elem[i]);
}
}
else
{
for (int i = 0; i < pList->length; i++)
{
printf("%d\n", pList->elem[i]);
}
}
printf("==================\n");
}
bool ListMerge_Sq(const SqList *paList, const SqList *pbList, SqList *pcList)
{
if (pcList == NULL)
{
return false;
}
int *pa = paList->elem; //初始化列表开头
int *pb = pbList->elem;
pcList->listsize = pcList->length = paList->length + pbList->length;
int *pc = pcList->elem = (int*)malloc(pcList->listsize*sizeof(int));
if (pc == NULL)
{
return -1;
}
while(pa <= paList->elem + paList->length - 1
&& pb <= pbList->elem + pbList->length - 1)
{
if (*pa <= *pb)
{
*pc++ = *pa++;
}
else
{
*pc++ = *pb++;
}
}
while (pa <= paList->elem + paList->length - 1)
{
*pc++ = *pa++;
}
while (pb <= pbList->elem + pbList->length - 1)
{
*pc++ = *pb++;
}
return true;
}
int main()
{
SqList L1,L2;
InitList_Sq(&L1);
InitList_Sq(&L2);
ListInsert_Sq(&L1, 1, 5);
ListInsert_Sq(&L1, 2, 6);
ListInsert_Sq(&L1, 3, 7);
ListInsert_Sq(&L1, 4, 8);
ListInsert_Sq(&L1, 5, 9);
ListInsert_Sq(&L1, 6, 10);
ListInsert_Sq(&L1, 7, 11);
reverse_print(&L1, true);
ListInsert_Sq(&L2, 1, 4);
ListInsert_Sq(&L2, 2, 5);
ListInsert_Sq(&L2, 3, 7);
ListInsert_Sq(&L2, 4, 9);
ListInsert_Sq(&L2, 5, 10);
ListInsert_Sq(&L2, 7, 11);
reverse_print(&L2, true);
SqList L3;
ListMerge_Sq(&L1, &L2, &L3);
reverse_print(&L3, true);
ListDestroy_Sq(&L1);
ListDestroy_Sq(&L2);
ListDestroy_Sq(&L3);
return 0;
}