菜鳥之路--線性表__順序存儲

</pre><pre name="code" class="cpp"> #include <stdio.h>
 #include <stdlib.h>
 //鏈表的定義以及基本操作
 typedef void List;
 typedef void ListNode;
 //創建一個空鏈表,並返回
 List * List_Create(int capacity);
 //將鏈表清空
 void  List_Clear(List * list);
 //銷燬鏈表
 void  List_Destroy(List *list);
 //刪除指定位置的數據
 ListNode * List_Delete(List *list,int pos);
 //往鏈表內插入數據
 int List_Insert(List * list,ListNode * node);
 //得到鏈表中位置爲pos的數據
 ListNode * List_Get(List * list,int pos);
 //返回鏈表的長度
 int List_Length(List *list);


//順序鏈表的相關定義
 typedef struct _tag_linklist  TgList;
 typedef int TgListNode;
 struct _tag_linklist{
            int length;
            int capacity;
            TgListNode * node;
  };

  //線性順序存儲鏈表具體操作的相關實現
 List * List_Create(int capacity)
 {
     TgList * ret = NULL;
     if(capacity>0){
        //注意此處的內存分配大小計算
        ret = (TgList *)malloc(sizeof(TgList)+sizeof(TgListNode) * capacity);
     }
     if(ret != NULL){
        ret->capacity = capacity;
        ret->length = 0;
     //注意此處加1操作
        ret->node = (TgListNode *)(ret+1);
     }
     return ret;
 }
 void  List_Clear(List * list)
 {
     TgList * tlist = (TgList *)list;
     if(tlist != NULL){
        tlist->length = 0;
     }
 }
void  List_Destroy(List *list)
{
    free(list);
}
int List_Insert(List * list,ListNode * node)
{
    TgList * tlist = (TgList *)list;
    if(tlist->length<tlist->capacity){
       tlist->node[tlist->length++] = (TgListNode) node;
       return 1;
    }
    return 0;


}
ListNode * List_Delete(List *list,int pos)
{
    TgList * tlist = (TgList *)list;
    ListNode * tnode = List_Get(list,pos);
    int i;
    if(tlist !=NULL && pos<tlist->length){
       for(i=pos;i<tlist->length-1;i++)
       {
            tlist->node[i] = tlist->node[i+1];
       }
       tlist->length--;
    }
    return tnode;
}
 ListNode * List_Get(List * list,int pos)
 {
     TgList * tlist = (TgList *)list;
     if(tlist != NULL && pos<tlist->length)
     {
         return (ListNode *)tlist->node[pos];
     }
     return NULL;
 }
 int List_Length(List *list)
 {
     TgList * tlist = (TgList *)list;
     if(tlist !=NULL) {
            return tlist->length;
     }
 }
 //返回鏈表最大容量
 int List_Capacity(List * list)
 {
     TgList * tlist = (TgList *)list;
     if(tlist != NULL){
        return tlist->capacity;
     }
     return -1;
 }
 //添加輸出函數用於具體測試
 void List_Print(List *list)
 {
    TgList * tlist = (TgList *)list;
    int i;
    if(tlist != NULL){
       for(int i=0;i<tlist->length;i++) {
            printf("the %d element %d\n",i+1,tlist->node[i]);
       }
    }
 }
 int main()
 {
     int a[5] ={1,2,3,4,5};
     int i;
     List * list = List_Create(5);
     for(i=0;i<5;i++){
        //注意這裏要將int強制轉換爲void *
        List_Insert(list,(void *)a[i]);
     }
     List_Print(list);
     printf("%d\n",List_Length(list));
     printf("%d\n",List_Capacity(list));
     printf("%d\n",List_Delete(list,3));
     List_Print(list);
     printf("%d\n",List_Length(list));
     printf("%d\n",List_Capacity(list));
     printf("%d\n",List_Get(list,3));
     return 0;
 }


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章