close

 

[Llink|data| Rlink]  

【優點】
1. 雙向鏈結串列有兩個指標節點,在處理加入或刪除節點動作時,速度比較快。
2.若雙向鏈結串列有任一端的指標連結錯誤或脫落,它可以快速進行修補錯誤或脫落的連結節點。
【缺點】
1.由於雙向鏈結串列有兩個指標節點,所以比較浪費記憶體空間。
2.雙向鏈結串列的加入或刪除時,必須要有較多的連結節點。

 

由於懶得寫插入的就直接插入最後一筆,以後有時間再寫拉

目前只有 加入資料到最後一筆 跟 刪除最後一筆資料

以下是程式

 

struct list1

{
    struct list1 *Llink;
    int no;
    char name[255];
    struct list1 *Rlink;
};


struct list1 *head = NULL;//第一個位置

void free(void)//釋放
{
    struct list1 *now = NULL;
    struct list1 *buf = NULL;
    now = head;
    while(now != NULL)
    {
        buf = now;
        now = now->Rlink;
        free(buf);
    }
}

void display(void)//顯示
{
    struct list1 *now = NULL;
    printf("*******************************\n");
    now = head;

    while(now != NULL)
    {
        printf("No. = %d, Name = %s\n", now->no, now->name);
        now = now->Rlink;
    }
    printf("*******************************\n");
}

void AddData(void)
{
    static struct list1 *Llink = NULL;
    struct list1 *now = NULL;
    char input[255];
    int no;

    printf("no. = ");
    scanf("%d",&no);
    printf("name = ");
    scanf("%s",&input);


    now = (struct list1 *)malloc(sizeof(struct list1)); //給新的位置
    if (now == NULL) exit(EXIT_FAILURE);

    now->no = no;//儲存nomber
    strncpy(now->name, input, 254);//儲存name
    now->name[255] = '\0';

    now->Rlink = NULL;//下一個位置null

    if (head == NULL) //第一筆資料
    {
        head = now;
        head->Llink = NULL;
    }
    else
    {
        now->Llink = Llink;// now->Llink儲存上一筆的位置
        Llink->Rlink = now;//上一筆資料的下一個位置 就是現在這個位置
    }
    Llink = now;//儲存目前的位置
}

void del(void)
{
    struct list1 *now = NULL;
    now = head;
    if(now == NULL) return;
    while(now->Rlink != NULL)
    {
        now = now->Rlink;
    }
    if(now->Llink == NULL)
    {
        head = NULL;
        return;
    }
    now = now->Llink;
    now->Rlink = NULL;//直接把最後第二個位置的Rlink拔掉 就等於把串列的資料給刪除掉
}

 


int main(void)
{
    int select;

    while(1)
    {
        printf("0.退出 1.增加資料到最後一筆 2.刪除最後一筆資料\n");
        scanf("%d",&select);
        if(select == 0)
        {
            break;
        }
        if(select == 1)
        {
            AddData();
        }
        if(select == 2)
        {
            del();
        }
        // display linked list
        display();
        printf("\n\n\n\n\n");
    }

    // display linked list
    display();
    // free linked list
    free();
    system("pause");
    return 0;
}

測試數據
/*
1
1
qwe
1
2
asd
1
3
zxc


*/

 

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 阿東 的頭像
    阿東

    ~阿東~的部落格

    阿東 發表在 痞客邦 留言(0) 人氣()