雙向鍊錶的實現與操作 C語言實現

2021-06-22 09:21:06 字數 4424 閱讀 1585

雙向鍊錶也叫雙鏈表,是鍊錶的一種,它的每個資料結點中都有兩個指標,分別指向直接後繼和直接前驅。所以,從雙向鍊錶中的任意乙個結點開始,都可以很方便地訪問它的前驅結點和後繼結點。

單鏈表的侷限

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...