菜鳥之路--線性表__鏈式存儲

</pre><pre name="code" class="cpp">#include <stdio.h>
 #include <stdlib.h>
 //鏈表的定義
 typedef void List;
 typedef void ListNode;

//鏈式鏈表的相關定義
 typedef struct _tag_linklist  SqList;
 typedef struct _tag_linkNode SqListNode;
 typedef int Sqdata;
 //創建一個空鏈表,並返回
 List * List_Create();
 //將鏈表清空
 void  List_Clear(List * list);
 //銷燬鏈表
 void  List_Destroy(List *list);
 //刪除節點的數據爲data的數據並返回刪除的數據
 Sqdata  List_Delete(List *list,Sqdata data);
 //往鏈表內插入節點
 int List_Insert(List * list,ListNode * node);
 //得到鏈表中節點數據爲data的節點指針
 ListNode * List_Get(List * list,Sqdata data);
 //返回鏈表的長度
 int List_Length(List *list);
//定義鏈式鏈表的結構
struct _tag_linklist{
            SqListNode * HNode;
            SqListNode * ENode;
  };
  struct _tag_linkNode{
        Sqdata data;
        SqListNode * nNode;
  };

  //線性順序存儲鏈表具體操作的相關實現
 List * List_Create()
 {
     SqList * ret = (SqList *)malloc(sizeof(SqList));
     if(ret != NULL){
        ret->HNode=ret->ENode = NULL;
     }
     return ret;
 }
 void  List_Clear(List * list)
 {
     SqList * tlist = (SqList *)list;
     if(tlist != NULL){
        tlist->HNode=tlist->ENode = NULL;
     }
 }
void  List_Destroy(List *list)
{
    free(list);
}
int List_Insert(List * list,ListNode * node)
{
    SqList * tlist = (SqList *)list;
    if(tlist !=NULL){
        if(tlist->HNode == NULL){
            tlist->HNode = tlist->ENode = (SqListNode *) node ;
        }else{
            tlist->ENode->nNode = (SqListNode *) node ;
            tlist->ENode = (SqListNode *) node ;
        }
        return 1;
    }

    return 0;


}
Sqdata  List_Delete(List *list,Sqdata data)
{
    SqList * tlist = (SqList *)list;
    SqListNode * dnode = (SqListNode *)List_Get(list,data);
    SqListNode rnode = *dnode;
    SqListNode * tnode = tlist->HNode;
    int i;
    if(tlist !=NULL && tnode != NULL && dnode != NULL){
        while(tnode->nNode != dnode){
            tnode = tnode->nNode;
        }
        tnode->nNode = tnode->nNode->nNode;
        free(tnode->nNode);
    }else{
        printf("ERROR:不存在該節點或鏈表不存在\n");
    }
    return rnode.data;
}
 ListNode * List_Get(List * list,Sqdata data)
 {
     SqList * tlist = (SqList *)list;
     SqListNode * tnode = tlist->HNode;
     if(tlist != NULL && tnode !=NULL)
     {
        while(tnode != tlist->ENode->nNode){
            if(tnode->data==data){
                return tnode;
            }
            tnode = tnode->nNode;
        }
     }
     return NULL;
 }
 int List_Length(List *list)
 {
     int count=-1;
     SqList * tlist = (SqList *)list;
     SqListNode * tnode = tlist->HNode;
     if(tlist !=NULL) {
            count++;
            while(tnode != tlist->ENode->nNode){
                count++;
                tnode = tnode->nNode;
            }

     }
     return count;
 }

 //添加輸出函數用於具體測試
 void List_Print(List *list)
 {
    int count =0;
    SqList * tlist = (SqList *)list;
    SqListNode * tnode = tlist->HNode;
    if(tlist != NULL){
        while(tnode != tlist->ENode->nNode){
            printf("第%d個元素:%d\n",count,tnode->data);
            count++;
            tnode = tnode->nNode;
        }
    }
 }
 int main()
 {
     SqListNode a[5];
     int i;
     List * list = List_Create();
     for(i=0;i<5;i++){
        
        a[i].data = i+1;
        a[i].nNode = NULL;
     }
      for(i=0;i<5;i++){
        List_Insert(list,&a[i]);
     }
     List_Print(list);
     printf("鏈表的長度:%d\n",List_Length(list));
     printf("被刪除的數據是:%d\n",List_Delete(list,3));
     List_Print(list);
     printf("鏈表的長度:%d\n",List_Length(list));
     printf("%d\n",((SqListNode *)List_Get(list,2))->data);
     return 0;
 }


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