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