一、单链表
图片来源:点击打开链接
#include<stdio.h>
#include<stdlib.h>
typedef struct Node
{
int elem;
struct Node *next;
}node;
node *write()
{
int temp;
node *head,*p,*q;
head=(node *)malloc(sizeof(node));
p=head;//这里给头结点起了别名,保存头结点的同时,将头结点与后面链表相连
scanf("%d",&temp);
while(temp!=-1)//以-1作为结束符号
{
p->next=(node *)malloc(sizeof(node));//需要一个节点,再开辟一个空间
p=p->next;
p->elem=temp;
scanf("%d",&temp);
}
p->next=NULL;//头文件已将NULL定义为0
return head;
}
void delaynode(node *head,int a)//删除第一个a
{
node *p,*q;
p=head;
q=p->next;
while(q)
{
if(q->elem==a)
{p->next=q->next;free(q);break;}
else
{p=q;q=q->next;}
}
if(!q)
printf("没有此数\n");
}
/*void delaynode(node *head,int a)//但只用一个变量
{
node *p;
p=head->next;
while(p&&p->elem!=a)
p=p->next;
if(p)
{
p->elem=p->next->elem;//赋值后一个元素,覆盖本元素
p->next=p->next->next;//由于出现两个next,所以不能删除只有一个节点的链表的节点,或最后一个节点
}
else
printf("无此数");
} */
void pri(node *head)
{
node *p;
p=head->next;
while(p)
{
printf("%d ",p->elem);
p=p->next;
}
printf("\n");
}
void main()
{
int a;
node *write();
void delaynode(node *head,int a);
void pri(node *head);
node *head;
printf("输入一串数据,以-1作为结束标志:");
head=write();
//pri(head);
printf("输入一个删除数字:");
scanf("%d",&a);
printf("\n");
delaynode(head,a);
pri(head);
}
注意下,上面代码中的另一种删除节点的方法。(思路来源:
点击打开链接)
思路:
但由于出现两个next,所以不能删除只有一个节点的链表的节点,或最后一个节点
/*void delaynode(node *head,int a)//但只用一个变量
{
node *p;
p=head->next;
while(p&&p->elem!=a)
p=p->next;
if(p)
{
p->elem=p->next->elem;//赋值后一个元素,覆盖本元素
p->next=p->next->next;//由于出现两个next,所以不能删除只有一个节点的链表的节点,或最后一个节点
}
else
printf("无此数");
} */
二、双向链表节点的删除
图片来源:点击打开链接
#include<stdio.h>
#include<stdlib.h>
typedef struct Node
{
int elem;
struct Node *prior;
struct Node *next;
}node;
node *write()
{
int temp;
node *head,*p;
head=(node *)malloc(sizeof(node));
head->elem=-1;//用来作为结束标志
p=head;
scanf("%d",&temp);
while(temp!=-1)//以-1作为结束标志
{
p->next=(node *)malloc(sizeof(node));
p->next->prior=p;
p=p->next;
p->elem=temp;
scanf("%d",&temp);
}
p->next=head;
head->prior=p;
return head;
}
void delay(node *head,int a)
{
node *p;
p=head->next;
while(p->elem!=-1&&p->elem!=a)
p=p->next;
if(p->elem!=-1)
{
p->prior->next=p->next;
p->next->prior=p->prior;
free(p);
}
else
printf("没有此数\n");
}
void pri(node *head)
{
node *p;
p=head->next;
while(p->elem!=-1)
{
printf("%d ",p->elem);
p=p->next;
}
}
void main()
{
int a;
node *head;
node *write();
void delay(node *head,int a);
void pri(node *head);
printf("输入链表元素,以-1作为结束标志");
head=write();
//pri(head);
printf("输入删除元素");
scanf("%d",&a);
printf("\n");
delay(head,a);
pri(head);
}