双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。
/**
* 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");
}
void insertElement(DLNodePtr paraHeader,char paraChar,int paraPosition)
{
DLNodePtr p,q,r;
p = paraHeader;
int i;
for (i=0;i< paraPosition;i++)
{
p=p->next;
if(p==NULL)
{
printf("The position %d is beyond the scope of the list.",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;
}
}
void locateELement(DLNodePtr paraHeader,char paraChar)
{
DLNodePtr p,q,r;
int i=1;
p=paraHeader;
while((p->next !=NULL)&&(p->next->data !=paraChar))
{
p=p->next;
i++;
}
if(p->next == NULL)
{
printf("The char '%c' does not exist.\r\n",paraChar);
return;
}
printf("%d\n",i);
}
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.\r\n",paraChar);
return;
}
q=p->next;
r=q->next;
p->next=r;
if(r!=NULL)
{
r->previous = p;
}
free(q);
}
#include
#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 = '\0';
tempHeader->previous = NULL;
tempHeader->next=NULL;
return tempHeader;
}
void printList(DLNodePtr paraHeader)
{
DLNodePtr p= paraHeader->next;
while(p!=NULL)
{
printf("%c",p->data);
p = p->next;
}
printf("\r\n");
}
void insertElement(DLNodePtr paraHeader,char paraChar,int paraPosition)
{
DLNodePtr p,q,r;
p = paraHeader;
int i;
for (i=0;i< paraPosition;i++)
{
p=p->next;
if(p==NULL)
{
printf("The position %d is beyond the scope of the list.",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;
}
}
void locateELement(DLNodePtr paraHeader,char paraChar)
{
DLNodePtr p,q,r;
int i=1;
p=paraHeader;
while((p->next !=NULL)&&(p->next->data !=paraChar))
{
p=p->next;
i++;
}
if(p->next == NULL)
{
printf("The char '%c' does not exist.\r\n",paraChar);
return;
}
printf("%d\n",i);
}
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.\r\n",paraChar);
return;
}
q=p->next;
r=q->next;
p->next=r;
if(r!=NULL)
{
r->previous = p;
}
free(q);
}
void insertDeleteTest()
{
DLNodePtr tempList = initLinkList();
printList(tempList);
insertElement(tempList,'p',0);
insertElement(tempList,'o',1);
insertElement(tempList,'l',2);
insertElement(tempList,'l',3);
insertElement(tempList,'e',4);
insertElement(tempList,'n',5);
printList(tempList) ;
locateELement(tempList,'l');
deleteElement(tempList,'o');
deleteElement(tempList,'e');
printList(tempList);
}
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;
}
int main()
{
insertDeleteTest();
basicAddressTest();
}