#include<stdio.h>
#include<malloc.h>
//定义一个双链表
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;
for(int i=0;i < paraPosition; i++)
{
p=p->next;
if(p == NULL)//如果位置不合法
{
printf("The position %d is beyong 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 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, '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, '0');
printList(tempList);
//插入一个元素在指定位置
insertElement(tempList , '0' , 1);
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();
}
运行结果