---双向链表

双向链表定义:

双向链表也叫双链表,是链表的一种,它的每个数据节点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。

1、初始化链表

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");
} 

2、插入元素

void insertelement(dlnodeptr paraheader,char parachar,int paraposition){dlnodeptr p,q,r;//第一步,查找位置p=paraheader;for(int i=0;inext;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;} 
}

 3、删除元素

 

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
#includetypedef 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;inext;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 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(){// Step 1. Initialize an empty list.dlnodeptr templist = initlinklist();printlist(templist);// Step 2. Add some characters.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 characters (the first occurrence).deleteelement(templist, 'e');deleteelement(templist, 'a');deleteelement(templist, 'o');printlist(templist);// Step 4. Insert to a given position.insertelement(templist, 'o', 1);printlist(templist);
}
int main(){insertdeletetest();
} 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部