資料結構 線性表 雙鏈表

2021-07-30 13:47:19 字數 2872 閱讀 2731

/*

*資料結構:線性表的鏈式表示

*雙鏈表

*線性表元素序號從1算起

*date:2017/4/13

*/#include #include #define initsize 100

#define elemtype char

typedef struct lnodelnode,*linklist;

linklist createlist1(linklist &l); //頭插法建立雙鏈表

linklist createlist2(linklist &l); //尾插法建立雙鏈表

lnode *getelem(linklist l,int i); //按序號查詢表結點值

lnode *locateelem(linklist l,elemtype e); //按值按序號順序查詢表結點在鍊錶l中第一次出現的位置

void listinsert(linklist l,int i,elemtype e); //在第i個結點位置插入新結點,元素值為e

void listdelete(linklist l,int i,elemtype *e); //刪除第i個結點,用e返回刪除元素的值

void printlist(linklist l); //按先後序號列印鍊錶

bool emptylist(linklist l); //判斷鍊錶是否為空,為空就返回true,否則返回false

int lengthlist(linklist l); //返回鍊錶長度

void destorylist(linklist &l); //銷毀鍊錶

linklist createlist1(linklist &l)

s->next = l->next;

l->next = s;

s->prior = l; //讓s的前驅指標指向l頭結點

l->length++;

//scanf("%c",&ch);

} return l;

}linklist createlist2(linklist &l)

r->next = null; //讓尾指標指向null

return l;

}lnode *getelem(linklist l,int i)

while(s && j < i)

return s;

}lnode *locateelem(linklist l,elemtype e)

return s;

}void listinsert(linklist l,int i,elemtype e)

p->next = s->next;

s->next = p;

p->prior = s;

l->length++;

}void listdelete(linklist l,int i,elemtype *e)

free(p);

l->length--;

}void printlist(linklist l)

printf("\n");

}bool emptylist(linklist l)else

}void destroylist(linklist &l)

printf("\n%p\n",l);

printf("已銷毀鍊錶");

}int lengthlist(linklist l)

int main()else*/

createlist1(l1);

createlist2(l2);

printlist(l1);

printlist(l2);

printf("l1長度:%d\nl2長度:%d\n",lengthlist(l1),lengthlist(l2));

lnode *s1 = getelem(l1,3);

printf("l1第3個位置:%c\n",s1->data);

lnode *s2 = getelem(l2,4);

printf("l2第4個位置:%c\n",s2->data);

printf("s2->prior->data:%c\n",s2->prior->data);

printf("s2->prior->prior->prior->data:%c\n",s2->prior->prior->prior->data);

s1 = locateelem(l1,'e');

s2 = locateelem(l2,'p');

printf("s1 = locateelem(l1,'e'):%c\n",s1->data);

printf("s2 = locateelem(l2,'p'):%c\n",s2->data);

listinsert(l1,2,'z');

printf("listinsert(&l1,2,'z') :");

printlist(l1);

char e;

listdelete(l2,3,&e);

printf("listdelete(&l2,3,&e) : %c\n",e);

printlist(l2);

if(emptylist(l1))else

if(emptylist(l2))else

printf("l1長度:%d\nl2長度:%d\n",lengthlist(l1),lengthlist(l2));

destroylist(l2);

printf("l2\n");

printf("\n%p\n",l2);

printf("l2 length :%d\n",l2->length);

printf("%p\n",l2->next);

return 0;

}

in.txt:

資料結構 2 3 2 線性表的雙鏈表實現

單鏈表實現線性表時,在增刪節點時的確很方便,但是在訪問某個節點的前驅節點時,由於其內部只有從前驅指向後繼的指標,所以在這種情況下只能從頭遍歷。為了解決這個問題,引入了雙鏈表,即在每個節點中,加入乙個指向前驅節點的指標,從而方便雙向移動指標位置。本質與單鏈表沒有太大的區別,只是多定義乙個指標而已。st...

線性表 雙鏈表

雙鏈表也是線性表的一種,它的全稱是 線性雙向鏈結表,它有以下特點 在每個節點中除包含有數值域外,設定有兩個指標域,分別用以指向其前驅節點和後繼節點。既可以依次向後訪問每乙個節點,也可以依次向前訪問每乙個節點。dlinklist.h如下 include include typedef int elem...

線性表 雙鏈表

雙鏈表的結點結構 空的雙向鍊錶 處理原則 先在正向鍊錶上插入,再在逆向鍊錶上插入 q rlink p rlink p rlink q q llink p q rlink llink q 在表尾進行插入時 q rlink p rlink p rlink q q llink p if q rlink q...