雙向鍊錶也叫雙鏈表,是鍊錶的一種,它的每個資料結點中都有兩個指標,分別指向直接後繼和直接前驅。所以,從雙向鍊錶中的任意乙個結點開始,都可以很方便地訪問它的前驅結點和後繼結點。
單鏈表的侷限
1,單鏈表的結點都只有乙個指向下乙個結點的指標
2,單鏈表的資料元素無法直接訪問其前驅元素
3,逆序訪問單鏈表中的元素是極其耗時的操作
雙向鍊錶的操作
雙向鍊錶的新操作
1,獲取當前游標指向的資料元素 2,
將游標重置指向鍊錶中的第乙個資料元素 3,
將游標移動指向到鍊錶中的下乙個資料元素 4,
將游標移動指向到鍊錶中的上乙個資料元素 5,
直接指定刪除鍊錶中的某個資料元素
dlinklistnode*dlinklist_deletenode(dlinklist* list, dlinklistnode* node);
dlinklistnode*dlinklist_reset(dlinklist* list);
dlinklistnode*dlinklist_current(dlinklist* list);
dlinklistnode*dlinklist_next(dlinklist* list);
dlinklistnode*dlinklist_pre(dlinklist* list);
標頭檔案:
#ifndef _ddlinklist_h_
#define _ddlinklist_h_
typedef void dlinklist;
typedef struct dlinklistnode //宣告指標域
dlinklistnode;
dlinklist * dlinklist_create();
void dlinklist_destroy(dlinklist * list);
void dlinklist_clear(dlinklist* list);
int dlinklist_length(dlinklist* list);
int dlinklist_insert(dlinklist* list, dlinklistnode* node, int pos);
dlinklistnode* dlinklist_get(dlinklist* list, int pos);
dlinklistnode* dlinklist_delete(dlinklist* list, int pos);
dlinklistnode* dlinklist_deletenode(dlinklist* list, dlinklistnode* node);
dlinklistnode* dlinklist_reset(dlinklist* list);
dlinklistnode* dlinklist_current(dlinklist* list);
dlinklistnode* dlinklist_next(dlinklist* list);
dlinklistnode* dlinklist_pre(dlinklist* list);
#endif
原始檔:
// 雙向鍊錶.cpp : 定義控制台應用程式的入口點。
//#include "stdafx.h"
#include "dlinklist.h"
#include #include typedef struct
tdlinklist;
struct value
;int _tmain(int argc, _tchar* argv)
printf("\n");
//刪除頭尾
dlinklist_delete(list, dlinklist_length(list)-1);
dlinklist_delete(list, 0);
printf("刪除頭尾結點後:\n");
for(i=0; iv);
}printf("\n");
dlinklist_reset(list);//游標指向第乙個結點 2
dlinklist_next(list);//游標指向第二個結點 3
pv = (struct value*)dlinklist_current(list);
printf("游標移到第二個結點後的值: %d\n", pv->v);
dlinklist_deletenode(list, (dlinklistnode*)pv);//刪除第二個結點
pv = (struct value*)dlinklist_current(list);
printf("游標刪除第二個結點後的值: %d\n", pv->v);
dlinklist_pre(list); //將游標向前移動一位
pv = (struct value*)dlinklist_current(list);
printf("游標向前移了一位後的值:%d\n", pv->v);
printf("length: %d\n", dlinklist_length(list));
dlinklist_destroy(list);
system("pause");
return 0;
}//建立
dlinklist * dlinklist_create()
return list;
}//銷毀
void dlinklist_destroy(dlinklist * list)
//清空
void dlinklist_clear(dlinklist* list)
}//獲得長度
int dlinklist_length(dlinklist* list)
return len;
}//插入
int dlinklist_insert(dlinklist* list, dlinklistnode* node, int pos)
next = current->next;
current->next = node;
node->next = next;
if(null != next)
node->pre = current;
if(slist->len == 0)
slist->len++;
ret = 1;
} return ret;
}//獲得結點
dlinklistnode* dlinklist_get(dlinklist* list, int pos)
resnode = current->next;
} return resnode;
}//刪除
dlinklistnode* dlinklist_delete(dlinklist* list, int pos)
ret = current->next;
next = ret->next;
current->next = next;
if(null != next)
}if(slist->slider == ret)
slist->len--;
} return ret;
}//通過指定結點刪除
dlinklistnode* dlinklist_deletenode(dlinklist* list, dlinklistnode* node)
current = current->next;
} if( ret != null )
} return ret; }
//重置游標,使其到第乙個結點處
dlinklistnode* dlinklist_reset(dlinklist* list)
return ret;
}//將游標移至當前結點處
dlinklistnode* dlinklist_current(dlinklist* list)
return ret;}//
dlinklistnode* dlinklist_next(dlinklist* list)
return ret;
}dlinklistnode* dlinklist_pre(dlinklist* list)
return ret;
}
執行結果:
插入了:1
插入了:2
插入了:3
插入了:4
插入了:5
刪除頭尾結點後:23
4游標移到第二個結點後的值: 3
游標刪除第二個結點後的值: 4
游標向前移了一位後的值:2
length: 2
請按任意鍵繼續. . .
如有錯誤,望不吝指出。
雙向鍊錶C語言實現
ifndef stdlist h define stdlist h typedef struct tagstdnode stdnode,lpstdnode typedef struct tagstdlist stdlist,lpstdlist 鍊錶資料結構 struct tagstdnode 鍊錶節...
c語言實現雙向鍊錶
單向鍊錶有一定的缺陷,其中乙個就是只能一條路走到黑,只能前進不能後退,但雙向鍊錶就解決了這一問題 include include typedef struct node node,linklist void create list tail linklist l 頭插法建立 void create ...
C語言實現雙向鍊錶
1.定義兩個結構體,乙個表示鍊錶的乙個單元,另乙個表示鍊錶的頭結點 2.鍊錶的初始化 必須讓頭結點的next和prev指向自己 清除 不刪除頭結點 銷毀 刪除頭結點 3.增操作 每次增加需要開闢乙個單元,所以直接建立乙個函式用來建立單元 頭插 尾插 pos結點之前插 4.刪操作 分為三種 刪除pos...