#include <stdio.h>
#include <malloc.h>
typedef struct linknode//定义双向链表
{
int data;
linknode *prior,*next;
} Node,*Linklist;
Linklist Createlist(int n);//建立双向链表
void Addnode(Linklist L,int i,int x);//向链表中的第i个位置插入数据x
void Delete(Linklist L,int i);//删除链表中的第i个节点
void Showlist(Linklist L);//输出双向链表
int main(void)
{
int n;
scanf("%d",&n);
Linklist L1=Createlist(n);
Addnode(L1,5,100);
Delete(L1,3);
Showlist(L1);
return 0;
}
Linklist Createlist(int n)//建立双向链表
{
Linklist head=(Linklist)malloc(sizeof(Node));//申请头结点
Node *p,*e;
int x;
p=head;//让p指向头结点
for(int i=0; i<n; i++)
{
e=(Linklist)malloc(sizeof(Node));//申请新的节点
scanf("%d",&x);
e->data=x;
p->next=e;//前一个节点的后继指向新的节点
e->prior=p;//新节点的前驱指向上一个节点
p=e;//始终让p指向当前节点
}
p->next=NULL;//最后一个节点的后继为空
head=head->next;//头结点为空节点,所以向后移动一个
head->prior=NULL;//头结点的前驱为空
return head;//返回头结点
}
void Addnode(Linklist L,int i,int x)//向链表中的第i个位置插入数据x
{
Node *p;
int k=1;
if(i<=1)//如果在第一个位置之前插入,则出错
{
printf("error\n");
return;
}
while(L!=NULL&&k<i-1)//找到第i-1个节点
{
L=L->next;
k++;
}
if(L==NULL)//如果找到了链表最后仍未找到,则出错
{
printf("位置不合理\n");
return;
}
p=(Linklist)malloc(sizeof(Node));
p->data=x;
p->next=L->next;
L->next->prior=p;
p->prior=L;
L->next=p;
}
void Delete(Linklist L,int i)//删除链表中的第i个节点
{
Node *p;
int k=1;
while(L!=NULL&&k<=i-1)//寻找被删除的节点i的前驱节点i-1,使L指向他
{
L=L->next;
k++;
}
if(L==NULL)//因为L为空,没有找到合法的前驱位置,说明删除位置i不合法
{
printf("删除位置不合理\n");
return;
}
else if(L->next == NULL) //最后一个结点特殊处理
{
L->prior->next = NULL;
free(L);
return;
}
else //进行删除操作
{
L->prior->next = L->next;
L->next->prior = L->prior;
free(L);
return;
}
}
void Showlist(Linklist L)//输出双向链表
{
while(L)
{
printf("%d ",L->data);
L=L->next;
}
printf("\n");
}
双向链表的插入与删除节点
最新推荐文章于 2022-11-05 20:28:05 发布
1497

被折叠的 条评论
为什么被折叠?



