//双向链表的初始化,插入和删除
#include<stdio.h>
//双向循环链表
#include<stdlib.h>
#define ERROR 0
typedef int ElemType;
typedef int Status;
typedef struct DulNode{
ElemType data;
struct DulNode* prior; //前驱指针
struct DulNode* next; //后继指针
}DulNode,*DuLinkList;
Status InitLink(DuLinkList* L){ //实参是一个二级指针
*L=(DuLinkList)malloc(sizeof(DulNode));
if(!(*L)) return ERROR;
(*L)->prior=NULL;
(*L)->next=NULL;
}
DuLinkList CreateLinkListT(DuLinkList L){
ElemType n;
DuLinkList p=L; //p为头节点
printf("请输入要输入多少个元素:");
scanf("%d",&n);
for(int i=1;i<=n;i++){
DuLinkList q=(DuLinkList)malloc(sizeof(DulNode));
p->next=q; //p的后继节点指向下一个节点
printf("请输入第%d个元素的值:",i);
scanf("%d",&q->data);
q->prior=p; //q的前继指针指向头节点
q->next=NULL; //最后一个节点的后继指针置空
p=q;
}
return L;
}
void OutputLinkList(DuLinkList L){
DuLinkList p=L->next;
int i=1;
while(p!=NULL){
printf("第%d个元素的值是:%d,前驱是:%d\n",i,p->data,p->prior->data);
p=p->next;
i++;
}
}
//在第i结点之前插入新的节点
DuLinkList insertLinkList(DuLinkList L,int i,ElemType e){
DuLinkList p,q;
int j;
p=L;
//找到第i个节点前的一个节点
for(j=1;j<i;j++){
p=p->next;
}
q=(DuLinkList)malloc(sizeof(DulNode));
if(q){
q->data = e;
p->next->prior = q;
q->next = p->next;
p->next = q;
q->prior = p;
//双向链表插入的四步操作 q->prior-p; q->next-p->next; p->next->prior-q; p->next=q;
}
return L;
}
//删除第i个节点
DuLinkList DeleteLinkList(DuLinkList L,int i){
DuLinkList p,q;
p = L->next;
q = L;
int j;
//找到第i个节点p,和第i-1个节点q
for(j=1;j<i;j++){
p = p->next;
q = q->next;
}
p->next->prior = q;
q->next = p->next;
free(p);
//双向链表删除的三步操作:p->prior->next=p->next; p->next->prior=p->prior; free(p);
return L;
}
int main(){
DuLinkList L;
InitLink(&L); //一级指针
CreateLinkListT(L);
OutputLinkList(L);
int i;
ElemType e;
printf("请输入要在第几个元素之前插入新节点:");
scanf("%d",&i);
printf("请输入要插入的数值:");
scanf("%d",&e);
insertLinkList(L,i,e);
OutputLinkList(L);
printf("要输入要删除第几个节点:");
scanf("%d",&i);
DeleteLinkList(L,i);
OutputLinkList(L);
return 0;
}
双向链表的操作
最新推荐文章于 2024-09-14 15:53:27 发布