參考:http://www.cnblogs.com/newwy/archive/2010/10/10/1847458.html
////////////////////////////////////////////
//雙鏈表的初始化,建立,插入,查找,刪除。//
//Author:Wang Yong //
//Date: 2010.8.19 //
////////////////////////////////////////////
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
////////////////////////////////////////////
// 定義雙鏈表結點類型
typedef struct Node
{
ElemType data;
struct Node *prior; //指向前驅結點
struct Node *next; //指向後繼結點
}Node, *DLinkList;
////////////////////////////////////////////
//雙鏈表的建立,採用尾插法建立雙鏈表
DLinkList DLinkListCreatT()
{
Node *L,*p,*r;
L = (Node *)malloc(sizeof(Node));//申請頭結點
L->next = NULL;
r = L;
r->next = NULL; //r 爲指向終端結點的指針
ElemType x;
while(scanf("%d",&x) != EOF) //輸入雙鏈表元素,建立雙鏈表
{
p = (Node *)malloc(sizeof(Node));
p->data = x;
p->next = r->next;
r->next = p;
r = p;
}
r->next = NULL;
return L;
}
/////////////////////////////////////////
//雙鏈表的查找,查找元素爲x的位置
int DLinkListFind(DLinkList L,ElemType x)
{
DLinkList p; //p爲檢索,
p = L->next;
int i = 1;
while(p != NULL && p->data != x )//尋找值爲x的元素**注意這裏循環的條件不能寫反
{ //原因,當p == NULL 時候 p->data 會出錯
++i; // for (i = 1, p = L->next; p; p = p->next, i++) {
// if (p->data == x) break;}
p = p->next;
}
if(p == NULL) //如果沒找到返回0
return 0;
else return i; //如果找到返回i
}
/////////////////////////////////////////
//雙鏈表的插入,在雙鏈表中的第i個位置插入值爲x的元素
DLinkList DLinkListInsert(DLinkList L,int i,ElemType x)
{
DLinkList p,s; //s爲要插入的結點
p = L->next; //從第一個結點位置開始查找
int tempi;
for(tempi = 1;tempi < i-1; tempi++)
p = p->next;
s = (Node *)malloc(sizeof(Node));
s->data = x; //將x賦值到s的數據域
s->next = p->next; //將結點插入
p->next->prior = s;
s->prior = p;
p->next = s;
return L;
}
//////////////////////////////////////////////
//雙鏈表的刪除,刪除雙鏈表中第i個結點
DLinkList DLinkListDelete(DLinkList L,int i)
{
int tempi = 1;
DLinkList p; //p爲查找結點。
p = L->next;
while((tempi++) != i && p != NULL)
{
p = p->next;
}
if(p == NULL) //檢查是不是在雙鏈表中的位置
printf("位置不合法。\n");
else if(p->next == NULL) //最後一個結點特殊處理,原因最後一個結點p->next沒有prior
{
p->prior->next = NULL;
free(p);
}
else //進行刪除操作
{
p->prior->next = p->next;
p->next->prior = p->prior;
free(p);
}
}
///////////////////////////////////////////
int main()
{
DLinkList list,start;
list = DLinkListCreatT();
for(start = list->next; start != NULL; start = start->next)
printf("%d ",start->data);
printf("\n");
int i;
ElemType x;
printf("請輸入要查找元素的值:");
scanf("%d",&x);
i = DLinkListFind(list,x);
if(i)
printf("在鏈表中的位置爲:%d\n",i);
else
printf("沒有這個元素。\n");
printf("請輸入插入位置:");
scanf("%d",&i);
printf("請輸入插入元素的值:");
scanf("%d",&x);
DLinkListInsert(list,i,x);
for(start = list->next; start != NULL; start = start->next)
printf("%d ",start->data);
printf("\n");
printf("請輸入要刪除的位置:");
scanf("%d",&i);
DLinkListDelete(list,i);
for(start = list->next; start != NULL; start = start->next)
printf("%d ",start->data);
printf("\n");
return 0;
}