/*
*資料結構:線性表的鏈式表示
*雙鏈表
*線性表元素序號從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...