1.代码.
#include<stdio.h>
#include<malloc.h>
/**
*Double linked list of integers. The key is char.
*/
typedef struct DoubleLinkedNode
{
char data;
struct DoubleLinkedNode *previous;
struct DoubleLinkedNode *next;
}DLNode,*DLNodePtr;
/**
*Initialize the list with a header.
*@return The pointer to the header.
*/
DLNodePtr initLinkList()
{
DLNodePtr tempHeader=(DLNodePtr)malloc(sizeof(struct DoubleLinkedNode));
tempHeader->data='\0';
tempHeader->previous=NULL;
tempHeader->next=NULL;
return tempHeader;
}
/**
*Print the list.
*@param paraHeader.The header of the list.
*/
void printList(DLNodePtr paraHeader)
{
DLNodePtr p=paraHeader->next;
while(p!=NULL)
{
printf("%c",p->data);
p=p->next;
}
printf("\r\n");
}
/**
*Insert an element te the given position.
*@param paraHeader.The header of the list.
*@param paraChar The given char.
*@param paraPosition The given position.
*/
void insertElement(DLNodePtr paraHeader,char paraChar,int paraPosition)
{
DLNodePtr p,q,r;
//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 od the list.",paraPosition);
return ;
}
}
//Construct a new Node;
q=(DLNodePtr)malloc(sizeof(struct DoubleLinkedNode));
q->data=paraChar;
//Now link.
r=p->next;
q->next=p->next;
q->previous=p;
p->next=q;
if(r!=NULL)
{
r->previous=q;
}
}
/**
*Delete an element from the list.
*@param paraHeader.The header of the list.
*@param paraChar The given char.
*/
void deleteElement(DLNodePtr paraHeader,char paraChar)
{
DLNodePtr p,q,r;
p=paraHeader;
//Locate.
while((p->next!=NULL)&&(p->next->data!=paraChar))
{
p=p->next;
}
//Error check.
if(p->next==NULL)
{
printf("The char '%c'doesnot not exist.\r\n",paraChar);
return ;
}
//change links.
q=p->next;
r=q->next;
p->next=r;
if(r!=NULL)
{
r->previous=p;
}
//Free the space.
free(q);
}
/**
*Unit test.
*/
void insertDeleteTest()
{
//Initialize an empty list.
DLNodePtr tempList=initLinkList();
printList(tempList);
//Add some characters.
insertElement(tempList,'T',0);
insertElement(tempList,'a',1);
insertElement(tempList,'c',2);
insertElement(tempList,'i',3);
insertElement(tempList,'t',4);
insertElement(tempList,'!',5);
printList(tempList);
//Delete some characters.
deleteElement(tempList,'a');
deleteElement(tempList,'b');
deleteElement(tempList,'i');
printList(tempList);
//Insert to a given position.
insertElement(tempList,'c',1);
printList(tempList);
}
DLNodePtr locateElement(DLNodePtr paraHeader,char paraChar)
{
DLNodePtr p=paraHeader;
while(p->next!=NULL)
{
if(p->data==paraChar)
{
return p;
}
p=p->next;
}
return NULL;
}
/**
*Address test:beyond the book.
*/
void basicAddressTest()
{
DLNode tempNode1,tempNode2;
tempNode1.data=4;
tempNode1.next=NULL;
tempNode2.data=6;
tempNode2.next=NULL;
printf("The first node: %d,%d,%d\r\n",&tempNode1,&tempNode1.data,&tempNode1.next);
printf("The second node: %d,%d,%d\r\n",&tempNode2,&tempNode2.data,&tempNode2.next);
tempNode1.next=&tempNode2;
}
/**
*The entrance.
*/
int main()
{
insertDeleteTest();
basicAddressTest();
return 0;
}
2.运行结果.
Tacit!
The char 'b'doesnot not exist.
Tct!
Tcct!
The first node: 6487504,6487504,6487520
The second node: 6487472,6487472,6487488
3.说明.
1.typedef struct DoubleLinkedNode.双向链表的存储结构.
2.initLinkList. 双向链表初始化.
3. printList.打印该链表.
4. insertElement.插入到指定位置.
5. deleteElement.删除元素.
6.insertDeleteTest.对初始化,打印,插入,删除等函数的测试.