C语言实现数据结构和双向链表操作
数据结构 双向链表的实现
双向链表中的每一个结点都含有两个指针域,一个指针域存放其后继结点的存储地址,另一个指针域则存放其前驱结点的存储地址。
双向链表结点的类型描述:
//双向链表的类型描述
typedefintElemType;
typedefstructnode{
ElemTypedata;
structnode*prior,*next;
}DuLNode,*DuLinkList;
其中,prior域存放的是其前驱结点的存储地址,next域存放的是其后继结点的存储地址。
双向链表有两个特点:
一是可以从两个方向搜索某个结点,这使得链表的某些操作(如插入和删除)变得比较简单;二是无论利用前链还是后链都可以遍历整个双向链表。
双向链表的操作基本和单链表的操作相同;
1.头插法创建带头结点的双向链表Create_DLinkListF(intn)
//头插法创建带头结点的双向链表
DuLinkListCreate_DLinkListF(intn){
DuLinkListL,p;
inti=n-1;
ElemTypex;
//新建头结点
L=(DuLinkList)malloc(sizeof(DuLNode));
L->prior=NULL;
L->next=NULL;
//添加第一个结点
scanf("%d",&x);
p=(DuLinkList)malloc(sizeof(DuLNode));
p->data=x;
L->next=p;
p->prior=L;
p->next=NULL;
//加入其他结点
while(i>0){
scanf("%d",&x);
p=(DuLinkList)malloc(sizeof(DuLNode));
p->data=x;
p->next=L->next;
L->next->prior=p;
p->prior=L;
L->next=p;
i--;
}
returnL;
}
2.尾插法创建带头结点的双向链表Create_DLinkListR(intn)
//尾插法创建带头结点的双向链表
DuLinkListCreate_DLinkListR(intn){
DuLinkListL,p,lastNode;
inti=n-1;
ElemTypex;
//新建头结点
L=(DuLinkList)malloc(sizeof(DuLNode));
L->prior=NULL;
L->next=NULL;
//添加第一个结点
scanf("%d",&x);
p=(DuLinkList)malloc(sizeof(DuLNode));
p->data=x;
L->next=p;
p->prior=L;
p->next=NULL;
lastNode=p;
//加入其他结点
while(i>0){
scanf("%d",&x);
p=(DuLinkList)malloc(sizeof(DuLNode));
p->data=x;
lastNode->next=p;
p->prior=lastNode;
p->next=NULL;
lastNode=p;
i--;
}
returnL;
}
3.在指定结点之前插入新结点Insert_DLinkListBefore(DuLinkListp,ElemTypex)
//在指定结点之前插入新结点
voidInsert_DLinkListBefore(DuLinkListp,ElemTypex){
DuLinkListnewNode;
//判断结点p之前的结点的合法性:
if(p->prior==NULL)
printf("结点不合法,不能在该结点之前插入结点\n");
else{
newNode=(DuLinkList)malloc(sizeof(DuLNode));
newNode->data=x;
newNode->next=p;
p->prior->next=newNode;
newNode->prior=p->prior;
p->prior=newNode;
}
}
4.在指定结点之后插入新结点Insert_DLinkListAfter(DuLinkListp,ElemTypex)
//在指定结点之后插入新结点
voidInsert_DLinkListAfter(DuLinkListp,ElemTypex){
DuLinkListnewNode;
newNode=(DuLinkList)malloc(sizeof(DuLNode));
newNode->data=x;
//当插入位置是最后一个结点之后时
if(p->next==NULL){
p->next=newNode;
newNode->prior=p;
newNode->next=NULL;
}
else{
newNode->next=p->next;
p->next->prior=newNode;
p->next=newNode;
newNode->prior=p;
}
}
5.删除指定结点Delete_DLinkList(DuLinkListp)
//删除指定结点
voidDelete_DLinkList(DuLinkListp){
//如果删除的是最后一个元素
if(p->next==NULL)
p->prior->next=NULL;
else{
p->prior->next=p->next;
p->next->prior=p->prior;
}
free(p);
}
6.后链输出双向链表Print_DLinkListN(DuLinkListL)
//后链输出双向链表
voidPrint_DLinkListN(DuLinkListp){
while(p!=NULL){
printf("%d\t",p->data);
p=p->next;
}
printf("\n");
}
7.前链输出双向链表Print_DLinkListP(DuLinkListp)
//前链输出双向链表
voidPrint_DLinkListP(DuLinkListp){
while(p!=NULL){
printf("%d\t",p->data);
p=p-prior;
}
printf("\n");
}
至于双向链表的其他操作,如定位,和单链表的操作类同,不再赘述。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!