初探雙向鏈表

      還是先來嘮嘮最近發生的事把。

    ok,拿到獎學金,被選爲優秀團員,我一點感覺都沒有。最近讓我比較激動的是我參加了學校的盛特杯,這件事本來我是不想參與的,我覺得我還太弱,沒有能力去做一個項目。但是導師給我電郵讓我參加,我想幹脆就抱個大腿吧,讓大腿教教我怎麼做項目,於是就找了個大二的學長。額,目前這件事還沒有任何進展,可能是大腿要考研比較忙吧。由於劉同到高中母校演講,最近又有電影上映,於是我就去買了《誰的青春不迷茫》來看。我靠,真的是一本爛的不能再爛的書啊,以後這種書堅決不自己買了,還是去圖書館看。

   今早上去圖書館對數據結構進行攻關,把雙向鏈表的代碼寫出來了,雙向鏈表就是在單向鏈表的基礎上再加一個前驅,其他的大致都與單向鏈表差不多,主要包含初始化,插入刪除查找的功能。

#include<stdio.h>
#include<stdlib.h>
typedef int Elemtype;
typedef struct DulNode
{
    Elemtype data;
    struct DulNode *prior;
    struct DulNode *next;
}DulNode,*Dulinklist;
void InitDulNode(DulNode *head)// 創建一個雙向鏈表的表頭,前驅和後繼都指向自己
{
    head->prior=head;
    head->next=NULL;
}

DulNode *GetElemp_dul(DulNode *head,int i)
{
    int j=1;
    DulNode *p=head->next;
    while(p!=NULL&&j<i)
    {
        p=p->next;
        j++;
    }
    if(j==i)
    {
        return p;
    }
    else
        return 0;
}

int Listinsert_Dul(DulNode *head,int pos,int e)//pos爲要插入的位置,e爲插入節點的值
{
    DulNode *p;
    p=GetElemp_dul(head,pos);
    if(!p)
    {
        printf("pos error!\n");
        return 0;
    }
    DulNode *s;
    if(!(s=(Dulinklist)malloc(sizeof(DulNode))))
        return 0;
    s->data=e;
    s->prior=p->prior;
    p->prior->next=s;
    s->next=p;
    p->prior=s;
    return 1;
}
void Print(DulNode *head)
{
    DulNode *p;
    p=head->next;
    while(p!=NULL)
    {
        printf("%d\t",p->data);
        p=p->next;
    }
}
void CreatDulNode(DulNode *head,int e)
{
    DulNode *p;
    p=(DulNode *)malloc(sizeof(DulNode));
    p->data=e;
    p->next=NULL;
    if(head->next==NULL)
    {
        p->prior=head;
        head->next=p;
    }
    else
    {
        head->next->prior=p;
        p->next=head->next;
        p->prior=head;
        head->next=p;
    }
}
int Listdelete_Dul(DulNode *head,int i)
{
    DulNode *p;
    p=GetElemp_dul(head,i);
    if(!p)
    {
        printf("delete pos error!\n");
        return 0;
    }
    p->prior->next=p->next;
    p->next->prior=p->prior;
    free(p);
    return 1;
}
int main()
{
    DulNode *head;
    head=(DulNode *)malloc(sizeof(DulNode));
    int i;
    InitDulNode(head);
    for(i=0;i<10;i++)
    {
        CreatDulNode(head,i);
    }
    Listinsert_Dul(head,4,100);
    Listdelete_Dul(head,4);
    Print(head);
    return 0;
}
    這代碼還是花了我1個多小時才寫出來的,哎,太花時間了。

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