单链表插入和删除结点c语言的实现

插入节点的方法比较简单,只需声明一个索引的指针p和声明一个记录p下一个指针的next。实现过程就是,申请内存的指针pNew.让p->next = pNew, pNew->next = next.

如此一来就实现了往p后面插入一个数据。

/*
	===================
	插入结点(某结点后)
	===================
*/
Node* Insert(Node* List, int score)
{
	Node *p,*next;
	for (p=List; p; p=p->next)
	{
		next = p->next;
		if (p->score == score)
		{
			Node* pNew = (Node*)malloc(sizeof(Node));
			printf("输入插入的数据:\n");
			scanf("%d",&pNew->score);
			p->next = pNew;
			pNew->next = next;
		}
	}
	return List;
}


删除结点:

1.先建立一个索引的指针和一个记录的指针,分别用于向后遍历索引链表和记录需要删除结点的上一个结点。

2.若是第一个结点就是需要删除的结点,head=elem->next.即头指针指向第二个结点,接着释放索引指针。

3.若是结点在链表的中间,temp->next = elem->next.即删除结点的上一个指针指向下一个指针。然后释放索引指针。

实现代码

/*
	=============
	删除结点
	=============
*/
Node* delete_node(Node* head, int score)
{
   Node *elem = head;//用于索引的指针
   Node *temp = NULL;//用于记录删除结点的上一个结点

   if (elem->score == score)//删除的正好是第一个结点
   {
		head = elem->next;
		free(elem);
   }
	else
	{
		while (elem != NULL)//没有到尽头
		{
			temp = elem;//记录保存好
			elem = elem->next;//往后索引

			if (elem == NULL)//遍历完也没找到
			{
				printf("没有找到要删除的结点\n");
			}
			else if(elem->score == score)//找到
			{
				temp->next = elem->next;//删除结点的前一个结点指向删除结点的后一个结点
				free(elem);//释放删除结点的内存
				break;
			}
			else
			{
			printf("没有找到要删除的结点\n");
			}
		
		}
	}

	return head;
	
}

完整代码
// linklisttest.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "stdlib.h"  
#include "stdio.h"  
  
typedef struct stu//创建结构体
{
	int score;
	struct stu *next;
}Node;

Node* create_f();//头插法创建链表
Node* create_e();//尾插法创建链表
Node* delete_node(Node* head, int score);//删除结点
void display(Node *link);//链表的输出
/*主函数*/
int main()
{

	Node *link = create_e();
	display(link);
	display(delete_node(link,99));
	return 0;
}

/*
	===================
	插入结点(某结点后)
	===================
*/
Node* Insert(Node* List, int score)
{
	Node *p,*next;
	for (p=List; p; p=p->next)
	{
		next = p->next;
		if (p->score == score)
		{
			Node* pNew = (Node*)malloc(sizeof(Node));
			printf("输入插入的数据:\n");
			scanf("%d",&pNew->score);
			p->next = pNew;
			pNew->next = next;
		}
	}
	return List;
}
/*
	====================
	功能:尾插法创建链表
	返回:头部结点指针
	====================
*/
Node* create_e()
{
	Node* head;//头部
	Node* pnew;//创建新的结点
	Node* tail;//尾部
	int score = 0;

	printf("请输入学生成绩,成绩为负数时退出输入。\n");
	head = (Node*)malloc(sizeof(Node));//先创建一个空链表

	tail = head;//tail指向头部
	scanf("%d",&score);
	while (score >= 0)
	{
		pnew = (Node*)malloc(sizeof(Node));//创建新节点
		pnew->score = score;
		//***向后延伸生成链表****
		tail->next = pnew;//第一个tail就是head,说明head中的数据并没初始化,所以返回next
		tail = pnew;
		scanf("%d",&score);
	}
	tail->next = NULL;//尾部结束时指向空
	return head->next;//head中的数据并没初始化,所以返回next
}

/*
	=============
	删除结点
	=============
*/
Node* delete_node(Node* head, int score)
{
   Node *elem = head;//用于索引的指针
   Node *temp = NULL;//用于记录删除结点的上一个结点

   if (elem->score == score)//删除的正好是第一个结点
   {
		head = elem->next;
		free(elem);
   }
	else
	{
		while (elem != NULL)//没有到尽头
		{
			temp = elem;//记录保存好
			elem = elem->next;//往后索引

			if (elem == NULL)//遍历完也没找到
			{
				printf("没有找到要删除的结点\n");
			}
			else if(elem->score == score)//找到
			{
				temp->next = elem->next;//删除结点的前一个结点指向删除结点的后一个结点
				free(elem);//释放删除结点的内存
				break;
			}
			else
			{
			printf("没有找到要删除的结点\n");
			}
		
		}
	}

	return head;
	
}

/*
   =================
   功能:输出链表
   =================
*/
void display(Node *link)
{
	Node *p = link;
	while (p != NULL)
	{
		printf("%d\t",p->score);
		p = p->next;
	}
	puts("\n");
}

/*
	====================
	功能:头插法创建链表
	返回:链表头指针
	====================
*/
Node* create_f()
{
	Node *head;//链表头
	Node *pnew;//用创建新的结点
	int score = 0;

	head = NULL;//头部置NULL
	printf("请输入学生成绩,成绩为负时退出输入\n");
	while (score >= 0 )
	{
		pnew = (Node*)malloc(sizeof(Node));//创建新的结点
		scanf("%d",&score);
		pnew->score = score;
		//*******头插法的实现******
		pnew->next = head;
		head = pnew;

	}
	return head;
}

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mango_haoming/article/details/61194349
个人分类: c/c++
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭