上次写的从链表中删除倒数的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的话可以很好的使用命令行参数。
希望多多指点。
转载于:https://blog.51cto.com/zhaoxiaohu/1749881