1.代码如下
#include <stdio.h>
#include <malloc.h>
/**
* define the structure and the pointers to the structure
*/
typedef struct DoubleLinkedNode DLNode;
typedef struct DoubleLinkedNode *DLNodePtr;
struct DoubleLinkedNode
{
char data;
DLNodePtr previous;
DLNodePtr next;
};
/**
* initialize the double links, return the pointer tempHeader
*/
DLNodePtr initLinkList()
{
DLNodePtr tempHeader=(DLNodePtr)malloc(sizeof(struct DoubleLinkedNode));
tempHeader->data='\0';
tempHeader->previous=NULL;
tempHeader->next=NULL;
return tempHeader;
}
/**
* print 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 to the list.
*/
void insertElement(DLNodePtr paraHeader, char paraChar, int paraPosition)
{
DLNodePtr p,q,r;
//step 1. find the position.
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 ;
}
}
//step 2. create a new node.
q=(DLNodePtr)malloc(sizeof(struct DoubleLinkedNode));
q->data=paraChar;
//step 3. link the new node.
r=p->next;
q->next=p->next;
q->previous=p;
p->next=q;
if(r!=NULL)
{
r->previous=q;
}
}
/**
* delete an element from the double lists
*/
void deleteElement(DLNodePtr paraHeader, char paraChar)
{
DLNodePtr p,q,r;
p=paraHeader;
//step 1. find the element
while((p->next!=NULL)&&(p->next->data!=paraChar))
{
p=p->next;
}
//step 2. if we can not find the element from the list.
if(p->next==NULL)
{
printf("the char '%c' does not exist.\r\n",paraChar);
return ;
}
//step 3.change links.
q=p->next;
r=q->next;
p->next=r;
if(r!=NULL)
{
r->previous=p;
}
//step 4. free the memory.
free(q);
}
/**
* test the functions.
*/
void insertDeleteTest()
{
//step 1. initialize an empty list.
DLNodePtr tempList=initLinkList();
printList(tempList);
//step 2. add some elements.
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 elements.
deleteElement(tempList,'e');
deleteElement(tempList,'a');
deleteElement(tempList,'o');
printList(tempList);
//step 4.insert to a spectific position.
insertElement(tempList,'o',1);
printList(tempList);
}
/**
* check the address.
*/
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);
}
void main()
{
insertDeleteTest();
basicAddressTest();
}
2.图示
3.代码说明
1)在打印带头节点链表时从head->next开始,而进行插入和删除操作时从head开始。
2)在插入时需要判断插入位置是否超出链表范围,并且需要判断指针r是否为NULL
3)在删除时需要判断是否到达链表的末尾
4)运行结果
Hello!
the char 'a' does not exist.
Hll!
Holl!
the first node: 6487504, 6487504, 6487520
the second node: 6487472, 6487472, 6487488
--------------------------------
Process exited after 0.04917 seconds with return value 44
请按任意键继续. . .