双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。
二、双链表的构建 1.构建结构体
typedef struct DoubleLinkedNode{
char data;
struct DoubleLinkedNode *previous;
struct DoubleLinkedNode *next;
}DLNode,*DLNodePtr;
2.初始化结点
DLNodePtr initLinkList(){
DLNodePtr tempHeader=(DLNodePtr)malloc(sizeof(struct DoubleLinkedNode));
tempHeader->data=' ';
tempHeader->previous=NULL;
tempHeader->next=NULL;
return tempHeader;
}
3.打印链表
void printList(DLNodePtr paraHeader){
DLNodePtr p=paraHeader->next;
while(p!=NULL){
printf("%c",p->data);
p=p->next;
}
printf("rn");
}
4.插入元素
void insertElement(DLNodePtr paraHeader,char paraChar,int paraPosition){
DLNodePtr p,q,r;
p=paraHeader;
for(int i=0;inext;
if(p==NULL){
printf("The position %d is beyond the scope of the list.rn",paraPosition);
return;
}
}
q=(DLNodePtr)malloc(sizeof(struct DoubleLinkedNode));
q->data=paraChar;
r=p->next;
q->next=p->next;
q->previous=p;
p->next=q;
if(r!=NULL){
r->previous=q;
}
}
5.删除元素
void deleteElement(DLNodePtr paraHeader,char paraChar){
DLNodePtr p,q,r;
p=paraHeader;
while((p->next!=NULL)&&(p->next->data!=paraChar)){
p=p->next;
}
if(p->next==NULL){
printf("The char '%c' does not exist.rn",paraChar);
return;
}
q=p->next;
r=q->next;
p->next=r;
if(r!=NULL){
r->previous=p;
}
free(q);
}
6.打印结点地址
void basicAddressTest(){
DLNode tempNode1,tempNode2;
tempNode1.data=4;
tempNode1.next=NULL;
tempNode2.data=6;
tempNode2.next=NULL;
printf("The first node :%d,%d,%drn",&tempNode1,&tempNode1.data,&tempNode1.next);
printf("The second node :%d,%d,%drn",&tempNode2,&tempNode2.data,&tempNode2.next);
tempNode1.next=&tempNode2;
}
7.测试输出
void insertDeleteTest(){
DLNodePtr tempList=initLinkList();
printList(tempList);
insertElement(tempList,'H',0);
insertElement(tempList,'e',1);
insertElement(tempList,'l',2);
insertElement(tempList,'l',3);
insertElement(tempList,'o',4);
insertElement(tempList,'!',5);
printList(tempList);
deleteElement(tempList,'e');
deleteElement(tempList,'a');
deleteElement(tempList,'o');
//printf("YESn");
printList(tempList);
insertElement(tempList,'o',1);
printList(tempList);
}
运行结果:
8.完整代码#include#include typedef struct DoubleLinkedNode{ char data; struct DoubleLinkedNode *previous; struct DoubleLinkedNode *next; } DLNode, *DLNodePtr; DLNodePtr initLinkList(){ DLNodePtr tempHeader = (DLNodePtr)malloc(sizeof(struct DoubleLinkedNode)); tempHeader->data = ' '; tempHeader->previous = NULL; tempHeader->next = NULL; return tempHeader; }// Of initLinkList void printList(DLNodePtr paraHeader){ DLNodePtr p = paraHeader->next; while (p != NULL) { printf("%c", p->data); p = p->next; }// Of while printf("rn"); }// Of printList void insertElement(DLNodePtr paraHeader, char paraChar, int paraPosition){ DLNodePtr p, q, r; // Step 1. Search to the position. p = paraHeader; for (int i = 0; i < paraPosition; i ++) { p = p->next; if (p == NULL) { printf("The position %d is beyond the scope of the list.", paraPosition); return; }// Of if } // Of for i // Step 2. Construct a new node. q = (DLNodePtr)malloc(sizeof(struct DoubleLinkedNode)); q->data = paraChar; // Step 3. Now link. r = p->next; q->next = p->next; q->previous = p; p->next = q; if (r != NULL) { r->previous = q; }// Of if }// Of insertElement void deleteElement(DLNodePtr paraHeader, char paraChar){ DLNodePtr p, q, r; p = paraHeader; // Step 1. Locate. while ((p->next != NULL) && (p->next->data != paraChar)){ p = p->next; }// Of while // Step 2. Error check. if (p->next == NULL) { printf("The char '%c' does not exist.rn", paraChar); return; }// Of if // Step 3. Change links. q = p->next; r = q->next; p->next = r; if (r != NULL) { r->previous = p; }// Of if // Step 4. Free the space. free(q); }// Of deleteElement void insertDeleteTest(){ // Step 1. Initialize an empty list. DLNodePtr tempList = initLinkList(); printList(tempList); // Step 2. Add some characters. insertElement(tempList, 'H', 0); insertElement(tempList, 'e', 1); insertElement(tempList, 'l', 2); insertElement(tempList, 'l', 3); insertElement(tempList, 'o', 4); insertElement(tempList, '!', 5); printList(tempList); // Step 3. Delete some characters (the first occurrence). deleteElement(tempList, 'e'); deleteElement(tempList, 'a'); deleteElement(tempList, 'o'); printList(tempList); // Step 4. Insert to a given position. insertElement(tempList, 'o', 1); printList(tempList); }// Of appendInsertDeleteTest void basicAddressTest(){ DLNode tempNode1, tempNode2; tempNode1.data = 4; tempNode1.next = NULL; tempNode2.data = 6; tempNode2.next = NULL; printf("The first node: %d, %d, %drn", &tempNode1, &tempNode1.data, &tempNode1.next); printf("The second node: %d, %d, %drn", &tempNode2, &tempNode2.data, &tempNode2.next); tempNode1.next = &tempNode2; }// Of basicAddressTest void main(){ insertDeleteTest(); basicAddressTest(); }// Of main



