14-鏈表用法_案例代碼

鏈表

代碼 1 :

#include <stdio.h>

typedef struct node{

    int data[10];

    int newdata[0];

}list_t;

int main(int argc, const char *argv[]){
    list_t list;

    printf("%d\n",sizeof(list_t));

    printf("%p\n",&list);

    printf("%p\n",list.data);

    printf("%p\n",list.newdata);

    int i;
    for(i=0;i<=9;i++)
    {
        list.data[i]=i+1;
    }

    printf("%d\n",list.newdata[-1]);

    return 0;
}

代碼 2 :

#include <stdio.h>
#include <stdlib.h>

//define   typedef
//預編譯的時候文字替換

typedef struct node{
    int *data;
    int last;
    int size;
}list_t;   // list_t --> struct node

//駝峯標記法   struct node -->  NODE ;   NODE
//不建議使用   編譯器可能過不去,容易混淆

//創建
list_t* create_list(int size)
{
    if(size<=0)
        return NULL;

    list_t* list=malloc(sizeof(list_t));
    //堆區創建一個連續空間,返回首地址給list

    //(list_t* )malloc(sizeof(list_t));
    //windows 要求類型匹配

    list->last=-1;
    list->size=size;

    list->data=malloc(sizeof(int)*size);

    //  ->    .區別
    //  結構體變量 訪問成員  用.
    //  指針   ->

    return list;
}

//判滿
int isfull(list_t* list)
{
    if(list==NULL)
        return 0;

    // NULL    -->   (void *)0   零地址   保護着的,用來做比較
    // 絕對不能用此地址訪問成員變量和賦值

    return list->last==list->size-1;
}

//判空
int isempty(list_t* list)
{
    if(list==NULL)
        return 0;

    return list->last==-1;
}


//增
int insert_head_list(list_t* list,int data)
{

    //判滿
    if(list==NULL||isfull(list))
        return -1;

    int i;
    for(i=list->last;i>=0;i--)
    {
        list->data[i+1]=list->data[i];
    }

    //賦值
    list->data[0]=data;

    list->last++;

    return 0;
}

//刪
int delete_head_list(list_t* list)
{
    if(list==NULL||isempty(list))
        return -1;

    int i;

    for(i=0;i<list->last;i++)
    {
        list->data[i]=list->data[i+1];
    }

    list->last--;

    return 0;
}

//查
int locate_list(list_t* list,int data)
{
    if(list==NULL||isempty(list))
        return -1;

    int i;

    for(i=0;i<=list->last;i++)
    {
        if(list->data[i]==data)
            return i;
    }

    return -1;
}

//改
int change_index_list(list_t* list,int index,int data)
{
    if(list==NULL||isempty(list)||index<0||index>list->last)
        return -1;

    list->data[index]=data;

    return 0;
}

//指定位置插入
int insert_index_list(list_t* list,int index,int data)
{
    //判滿
    if(list==NULL||isfull(list)||index<0||index>list->last+1)
        return -1;

    int i;
    for(i=list->last;i>=index;i--)
    {
        list->data[i+1]=list->data[i];
    }

    //賦值
    list->data[index]=data;

    list->last++;

    return 0;
}

//指定位置刪除
int delete_index_list(list_t* list,int index)
{
    if(list==NULL||isempty(list)||index<0||index>list->last)
        return -1;

    int i;

    for(i=index;i<list->last;i++)
    {
        list->data[i]=list->data[i+1];
    }

    list->last--;

    return 0;
}

//打印
int print_list(list_t* list)
{
    if(list==NULL||isempty(list))
        return -1;

    int i;

    for(i=0;i<=list->last;i++)
    {
        printf("%3d ",list->data[i]);
    }
    printf("\n");

    return 0;
}

//逆打印
int re_print_list(list_t* list)
{
    if(list==NULL||isempty(list))
        return -1;

    int i;

    for(i=list->last;i>=0;i--)
    {
        printf("%3d ",list->data[i]);
    }
    printf("\n");

    return 0;
}

//清空
int clear_list(list_t* list)
{
    if(list==NULL)
        return -1;

    list->last=-1;
    return 0;
}

int length_list(list_t* list)
{
    if(list==NULL||isempty(list))
        return 0;

    return list->last+1;
}

//銷燬
int destory_list(list_t* list)
{
    if(list==NULL)
        return -1;

    free(list);

    return 0;
}

int main(int argc, const char *argv[])
{
    list_t* list=create_list(30);

    int i;

    for(i=1;i<=15;i++)
    {
        if(insert_head_list(list,i)==0)
            print_list(list);
    }

    change_index_list(list,locate_list(list,15),250);

    insert_index_list(list,locate_list(list,13),230);

    print_list(list);

    delete_index_list(list,locate_list(list,230));

    print_list(list);

    printf("length_list:%d\n",length_list(list));

    clear_list(list);

    printf("length_list:%d\n",length_list(list));

    destory_list(list);

    list=NULL;
    //free以後,malloc的空間理論上不可再使用,可能會出現野指針,賦值NULL是好習慣

    return 0;
}
發佈了38 篇原創文章 · 獲贊 3 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章