資料結構 雙向鍊錶

2021-08-29 23:47:45 字數 2788 閱讀 6516

doublelist.h

#ifndef __doublelist_h

#define __doublelist_h

#include#include#include#includetypedef int elemtype;

//定義每乙個結點的結構

typedef struct node

node;

//定義雙向鍊錶結構

typedef struct doublelist

doublelist, *pdoulist;

void initdoublelist(pdoulist list);

void insertdoublelist(pdoulist list, elemtype val , int pos);

void insertheaddoublelist (pdoulist list,elemtype val);

void inserttaildoublelist(pdoulist list,elemtype val);

void deletedoublelist(pdoulist list,int pos);

void deleteheaddoublelist(pdoulist list);

void deletetaildoublelist(pdoulist list);

void destroydoublelist(pdoulist list);//銷毀

void show1(pdoulist list); //列印輸出

void show2(pdoulist list);

void reverseshow(pdoulist list); //逆序輸出

#endif

doublelist.c

#include"doublelist.h"

//初始化雙向鍊錶

void initdoublelist(pdoulist list)

//在雙向鍊錶中插入乙個結點

/*1:先考慮普通情況下的結點插入

void insertdoublelist(pdoulist list, elemtype val, int pos)

node *p = &list->head;

node *s = ( node *)malloc(sizeof(node));

while( pos > 0)

s->data = val;

if( p->next != null)

s->next = p->next;

s->prev = p;

p->next = s;

list->count++;}*/

//2:考慮特殊情況的結點插入優化**(list->count == 0 和 pos == list->count )

static node *buynode(elemtype val, node *prev, node *next )//建立結點

void insertdoublelist(pdoulist list, elemtype val, int pos)

node *p = &list->head;

while( pos > 0)

node *s = buynode( val, p, p->next);//插入結點

if( p->next != null)//考慮尾插

p->next = s;

list->count++;

}void insertheaddoublelist (pdoulist list,elemtype val)

void inserttaildoublelist(pdoulist list,elemtype val)

void deletedoublelist(pdoulist list,int pos)

node * p = &list->head;

while( pos > 0)

p->prev->next = p->next;

if ( p->next != null)

free(p);

list->count--;

}void deleteheaddoublelist(pdoulist list)

void deletetaildoublelist(pdoulist list)

void show1(pdoulist list)

printf("\n");

}void show2(pdoulist list)

printf("\n");

}//逆序輸出雙向鍊錶中的資料

void reverseshow(pdoulist list)

while( p->prev != null)//指標開始往前跑,指標跑乙個輸出乙個

printf("\n");

}void destroydoublelist(pdoulist list)

}

main.c

#include"doublelist.h"

int main()

show1(&list);

inserttaildoublelist(&list,88);

insertheaddoublelist (&list,99);

show2(&list);

reverseshow(&list);//逆序輸出

for( int i = 4; i > 0; i--)

show2(&list);

return 0;

}

資料結構 鍊錶 雙向鍊錶

注意typedef的定義結構,以及dinklist的資料型別 typedef struct dnode dnode,dinklist 注意插入第乙個結點時,prior指標的空指向問題 if l next null 若l後繼結點為空 則省略該步驟 l next prior p 基本 頭插法建立雙向鍊錶...

資料結構 雙向鍊錶

前幾天寫了乙個單向鍊錶,今天參考自己單向鍊錶改寫了乙個雙向非迴圈鍊錶,下面只討論雙向非迴圈鍊錶。雙向非迴圈鍊錶有如下特點 一 雙向鍊錶每個結點都有乙個前驅指標和後驅指標 當然頭結點和尾結點除外 二 雙向鍊錶中的任意乙個結點開始,都可以很方便地訪問它的前驅結點和後繼結點。三 頭結點只有後驅指標沒有前驅...

資料結構 雙向鍊錶

單鏈表的單向性 只能從頭結點開始高效訪問鍊錶中的資料元素。單鏈表還存在另乙個缺陷 逆序訪問時候的效率極低。如下 linklistlist for int i 0 i 5 i for int i list.length 1 i 0 i 根據大o推算法可以得出乙個for迴圈的時間複雜度為o n get ...