資料結構(c語言)--雙向連結串列的基本操作
阿新 • • 發佈:2018-12-15
定義一個雙向連結串列結構:
typedef struct DulNode{
// *prior:前一個元素的地址
// *next:後一個元素的地址
struct DulNode *prior;
Element data;
struct DulNode *next;
}DulNode,*DuLinkList;
初始化一個雙向連結串列 :
DuLinkList doubleLinkedListInit(){ DuLinkList L; L = (DuLinkList)malloc(sizeof(DulNode)); L->next = NULL; L->prior = NULL; }
建立一個雙向連結串列:
//尾插法 void duLinkListCreateT(DuLinkList l,int size){ DuLinkList t; t = l; for(int i = 1; i <= size; i++){ DuLinkList p; p = (DuLinkList)malloc(sizeof(DulNode)); p->data = i; t->next = p; p->prior = t; t = p; } t->next = NULL; } // 頭插法 void duLinkListCreateH(DuLinkList l,int size){ for(int i = 1; i <= size; i++){ DuLinkList p; p = (DuLinkList)malloc(sizeof(DulNode)); p->data = i; p->prior = l; p->next = l->next; if(l->next){ l->next->prior = p; } l->next = p; } }
列印輸出:
void printDuLinkList(DuLinkList l){ DuLinkList t; t = l; printf("正向遍歷結果:["); while(t->next){ t = t->next; printf("%d",t->data); if(t->next){ printf(","); } } printf("]\n"); printf("反向遍歷結果:["); while(t->prior&&t!=l){ printf("%d",t->data); t = t->prior; if(t!=l){ printf(","); } } printf("]\n"); }
指定位置插入
Status duLinkListInsert(DuLinkList l,int index,Element v){
DuLinkList p,e;
p = l->next;
int i = 1;
// 移到p指標到要插入位置的前一個位置
while(p&&i<index){
p = p->next;
++i;
}
if(!p||i>index){
// 第index個節點不存在
return ERROR;
}
e = (DuLinkList) malloc(sizeof(DulNode));
// 設定插入節點的資料為傳遞過來的引數值
e->data = v;
// 將要插入節點後繼為p指標的next,前驅就是p指標
e->next = p->next;
e->prior = p;
// 將原本是index位置節點的前驅指向要插入的元素
p->next->prior = e;
// 將p的next指向要插入的元素。
p->next = e;
return OK;
}
測試結果: