单链表,双向链表节点的删除

一、单链表

图片来源:点击打开链接

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



猜你喜欢

转载自blog.csdn.net/sinat_38816924/article/details/79196802