双链表与单链表的区别:
单链表:
由两部分组成:数据域和指针域,每个结点都有一个指针,每个节点指针的指向都是指向自身结点的下一个结点,最后一个结点的head指向为null,对的操作只能从一端开始,如果需要查找链表中的某一个结点,则需要从头开始进行遍历。
双链表:
对于双向链表来说,它的每个节点要指向“直接前驱”和“直接后继”,所以节点类需要含有两个指针域。指向直接前驱的指针使用pre表示,指向后继的指针使用next表示。双向链表是在单向链表基础上的一个改进,每个节点指向其直接前驱和直接后继节点。因此,从双向链表的任意位置开始,都能访问所有的节点。
双向链表从节点的结构上可以看出,双向链表的所需的存储空间大于单向链表。同时,对于插入和删除等操作来说,双向链表的节点操作更加复杂,涉及到节点的前后两个节点。
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 = '\0';
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("\r\n");
}
4 插入
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 DoubleLink8]edNode));
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.\r\n", paraChar);
return;
}
q = p->next;
r = q->next;
p->next = r;
if (r != NULL) {
r->previous = p;
}
free(q);
}
6 查找位置
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);
}
7 测试
void insertDeleteTest()
{
DLNodePtr tempList = initLinkList();
printList(tempList);
insertElement(tempList,'a',0);
insertElement(tempList,'p',1);
insertElement(tempList,'p',2);
insertElement(tempList,'l',3);
insertElement(tempList,'e',4);
printList(tempList) ;
locateELement(tempList,'p');
deleteElement(tempList,'a');
deleteElement(tempList,'b');
printList(tempList);
}