上次写的从链表中删除倒数的K个,代码实在是太挫了,那是刚写手有点生。下面是牛客网上的题,也是公司给我发的每日一题。

输入一个单向链表和一个节点的值,从单向链表中删除等于该值的节点,删除后如果链表中无节点则返回空指针。

链表结点定义如下:

struct ListNode

{

      int       m_nKey;

      ListNode* m_pNext;

};

详细描述:

本题为考察链表的插入和删除知识。

链表的值不能重复

构造过程,例如

1 -> 2

3 -> 2

5 -> 1

4 -> 5

7 -> 2

最后的链表的顺序为 2 7 3 1 5 4 

删除 结点 2 

则结果为 7 3 1 5 4 

解释:其实就是规则就是:将1查在2的后面得到:2 1,然后将3插在2的后面得到:2 3 1,再讲5插在1的后面得到:2 3 1 5,再将4插在5的后面得到:2 3 1 5 4,最后将7插在2的后面得到:2 7 3 1 5 4然后删除2得到结果。

代码实现:

#ifndef _LINKLIST_
#define _LINKLIST_

/***************************添加头文件*************************/
#include<stdio.h>
#include<stdlib.h>

typedef int ElemType;//从新定义数据类型

#define MAXARR  100   //最大能接收的数

//定义结构体
typedef struct Node{
	ElemType NewDate;
	struct Node *Pnext;
}Node,*Pnode;



/***************************函数声明*************************/
Pnode InitLinkList(Pnode head);
bool LinkListCreate(Pnode head);
bool DisplayLinkList(Pnode head);//打印
bool LinkListDelete(Pnode head);
bool LinkListFree(Pnode head);


#endif  //_LINKLIST_



#include"LinkList.h"
/********************************************************/
/************函数名:InitLinkList***********************/
/************函数功能:初始化链表************************/
/************函数返回值:结构体**************************/
/************入口参数:链表头结点************************/
Pnode InitLinkList(Pnode head)
{
	head = (Pnode)malloc(sizeof(Node));
	if(NULL == head)
	{
		return NULL;//申请失败
	}
	head->NewDate = 0;
	head->Pnext = NULL;
	return head;
}
/********************************************************/
/************函数名:LinkListCreate**********************/
/************函数功能:按要求创建链表********************/
/************函数返回值:bool类型************************/
/************入口参数:链表头结点***********************/
bool LinkListCreate(Pnode head)
{
	if(NULL == head)
	{
		return false;//链表为空
	}
	int HeadNode = 0;
	int Number = 0;
	int ArrBuf[MAXARR] = {0};
	printf("输入个数和头结点:");
	scanf("%d%d",&Number,&HeadNode);
	printf("请输入要按规则插入的数:");
	for(int i = 0;i<(Number-1)*2;i++)
	{
		scanf("%d",&ArrBuf[i]);
	}
	Pnode NewNode = (Pnode)malloc(sizeof(Node));
	if(NULL == NewNode)
	{
		return false;//申请空间失败
	}
	NewNode->NewDate = HeadNode;
	NewNode->Pnext = head->Pnext;
	head->Pnext = NewNode;
	int IndexNode = 0;
	for(int j = 0;j<Number;j++)
	{
		Pnode NewNode = (Pnode)malloc(sizeof(Node));
		
		if(NULL == NewNode)
		{
			return false;//申请空间失败
		}
	    Pnode TempNode = head->Pnext;
		while((ArrBuf[IndexNode+1] != TempNode->NewDate))
		{
			if(NULL == TempNode->Pnext)
			{
				return false;
			}
			TempNode = TempNode->Pnext;
		}
		if(NULL == TempNode->Pnext)
		{
			NewNode->NewDate = ArrBuf[IndexNode];
			NewNode->Pnext = NULL;
			TempNode->Pnext = NewNode;
		}
		else
		{
			NewNode->NewDate = ArrBuf[IndexNode];
			NewNode->Pnext = TempNode->Pnext;
			TempNode->Pnext = NewNode;
		}
		IndexNode+=2;
	}
	return true;
}

/********************************************************/
/************函数名:LinkListDelete**********************/
/************函数功能:删除链表中的数通过scanf传入*******/
/************函数返回值:bool类型************************/
/************入口参数:链表头结点********8***************/
bool LinkListDelete(Pnode head)
{
	if(NULL == head)
	{
		return false;//链表为空
	}
	ElemType DeleteDate = 0;
	printf("请输入要删除的数:");
	scanf("%d",&DeleteDate);
	Pnode TempNodeB = head->Pnext;
	Pnode TempNodeA = head;	
	while(DeleteDate != TempNodeB->NewDate)
	{
		TempNodeB = TempNodeB->Pnext;
		TempNodeA = TempNodeA->Pnext;
	}
	TempNodeA->Pnext = TempNodeB->Pnext;
	if(NULL == head)
	{
		return false;//如果删出完为空链表则返回false
	}
	return true;
}
/********************************************************/
/************函数名:LinkListFree***********************/
/************函数功能:free链表**************************/
/************函数返回值:bool类型************************/
/************入口参数:链表头结点************************/
bool LinkListFree(Pnode head)
{
	if(NULL == head)
	{
		return false;
	}
	Pnode TmpeNode = head->Pnext;
	while(NULL != TmpeNode)
	{
		head->Pnext = TmpeNode->Pnext;
		free(TmpeNode);
		TmpeNode = head->Pnext;
	}
	return true;
}
/********************************************************/
/************函数名:DisplayLinkList***********************/
/************函数功能:打印显示链表**************************/
/************函数返回值:bool类型***************************/
/************入口参数:链表头结点***************************/
bool DisplayLinkList(Pnode head)
{
	if(NULL == head)
	{
		return false;//空链表
	}
	Pnode TempNode = NULL;
	TempNode = head->Pnext;
	while(NULL != TempNode)
	{
		printf("%d  ",TempNode->NewDate);
		TempNode = TempNode->Pnext;
	}
	printf("\n");
	return true;
}
/********************************************************/
/************函数名:main********************************/
/************函数功能:程序的入口*************************/
/************函数返回值:int*****************************/
/************入口参数:空********************************/
int main()
{
	Pnode NewHead = NULL;
	NewHead = InitLinkList(NewHead);//初始化链表
	LinkListCreate(NewHead);//按要求创建链表
	DisplayLinkList(NewHead);//打印显示链表
	LinkListDelete(NewHead);//删除要删除的节点
	DisplayLinkList(NewHead);//打印显示删除后的链表
	system("pause");
	LinkListFree(NewHead);//free链表
	return 0;
}

还有一些小问题:就是输入大小只能到通过宏来实现数组的大小。用命令行参数的话vs2010还不是很熟,Linux的话可以很好的使用命令行参数。

希望多多指点。