基于Visual C++2013拆解世界五百强面试题--题7-链表的各种操作
来源:互联网 发布:2016淘宝开店银行卡 编辑:程序博客网 时间:2024/05/11 15:41
请用C实现一个链表,实现链表的查找,逆置,替换,删除,添加,清空,创建。
查找、替换和删除、添加里面都会用到遍历链表的操作,所以重点在于遍历,
链表的逆置和清空考虑到效率,我们可以用递归实现,
至于创建节点,我们直接创建一个空节点作为头节点,不使用其数据域。
下面直接上代码:
#include <stdio.h>#include <stdlib.h>typedef struct stLIST{int data;stLIST *next;}LIST , *PLIST;//链表的查找PLIST ListFind(PLIST pHead, int data){PLIST node = pHead;while (node->next){if (node->next->data == data){return node->next;}node = node->next;}return NULL;}//链表的逆置void ListReverse(PLIST pHead, PLIST pNode){//用来存储新的尾部节点,在程序最后需要将尾部节点的next置为NULLstatic PLIST HeadNext = NULL;//如果链表没有节点,或者只有一个节点,则不予处理if (pHead->next == NULL && pHead->next->next == NULL)return ;//如果是最后一个节点,我们将pHead的next指向它//然后把最后节点的next指向他的前一个节点if (pNode->next->next == NULL){HeadNext = pHead->next;pHead->next = pNode->next;pNode->next->next = pNode;return ;}//递归处理下一个节点ListReverse(pHead, pNode->next);//如果相等,则说明递归出来了,//我们此时做收尾工作,将存储的静态新的尾部节点next置为NULLif (pHead == pNode){HeadNext->next = NULL;return ;}//如果不等我们将此节点的下一节点指向自己pNode->next->next = pNode;return ;}//链表内容替换void ListReplace(PLIST pHead, int data, int newData){PLIST node = pHead;while (node->next){if (node->next->data == data){node->next->data = newData;}node = node->next;}}//删除指定数据的节点void ListDel(PLIST pHead, int data){PLIST node = pHead;while (node->next){if (node->next->data == data){PLIST tempNode = node->next;node->next = node->next->next;free(tempNode);return;}node = node->next;}}//链表添加bool ListAdd(PLIST pHead, int data){//遍历到节点末尾PLIST node = pHead;while (node->next){node = node->next;}node->next = (PLIST)malloc(sizeof(LIST));if (NULL == node->next)return false;node->next->data = data;node->next->next = NULL;return true;}//链表清空void ListDelAll(PLIST pHead){if (pHead->next != NULL)ListDelAll(pHead->next);free(pHead->next);pHead->next = NULL;}//链表创建PLIST ListCreate(){PLIST pHead = (PLIST)malloc(sizeof(LIST));pHead->data = 0;pHead->next = NULL;return pHead;}//链表打印,用于调试观察void ListPrint(PLIST pHead){PLIST node = pHead;while (node->next){printf("List data: %d \n", node->next->data);node = node->next;}}int main(){//创建链表PLIST pHead = ListCreate();//给链表添加内容for (int i = 0; i < 10; i++){ListAdd(pHead, i);}//清空链表//ListDelAll(pHead);//删除链表内容ListDel(pHead, 6);//逆置链表ListReverse(pHead, pHead);ListPrint(pHead);return 0;}
大家可以使用VS调试一遍更好的理解 逆置这个函数。
将光标移至函数头,然后按下F9,打一个断点,如下图所示:
然后按F5启动调试:
点按钮“是”进入调试,可以看到程序停在断点所在的位置了
现在我们可以按F10单步调试,或者F11(可以跟进函数)。在调试窗口中看每一个变量的改变:
如果有什么问题和疑问可以在下面留言互相探讨。
原题我已经上传到这里了http://download.csdn.net/detail/yincheng01/6461073 ,
解压密码为 c.itcast.cn
- 基于Visual C++2013拆解世界五百强面试题--题7-链表的各种操作
- 基于Visual C++2013拆解世界五百强面试题--题1-定义各种类型指针
- 基于Visual C++2013拆解世界五百强面试题--题1-定义各种类型指针
- 基于Visual C++2013拆解世界五百强面试题--题3-打印螺旋数组
- 基于Visual C++2013拆解世界五百强面试题--题4-double转换成字符串
- 基于Visual C++2013拆解世界五百强面试题--题5-自己实现strstr
- 基于Visual C++2013拆解世界五百强面试题--题6-double类型逆序
- 基于Visual C++2013拆解世界五百强面试题--题11-查找数字出现次数
- 基于Visual C++2013拆解世界五百强面试题--题12-进制转换
- 基于Visual C++2013拆解世界五百强面试题--题14-循环删除
- 基于Visual C++2013拆解世界五百强面试题--题15-递归相加
- 基于Visual C++2013拆解世界五百强面试题--题16-进制分析
- 基于Visual C++2013拆解世界五百强面试题--题17-程序结果分析1
- 基于Visual C++2013拆解世界五百强面试题--题8-数组的排序和查找
- 基于Visual C++2013拆解世界五百强面试题--题9-找出所有的排列方式
- 基于Visual C++2013拆解世界五百强面试题--题10-找出N个数种最大的K个数
- 基于Visual C++2013拆解世界五百强面试题--题13-找最大公共子字符串
- 基于Visual C++2013拆解世界五百强面试题--题18-程序结果分析2-终结篇
- Android系统onKeyDown监控/拦截/监听/屏蔽返回键、菜单键和Home键
- 输入星期值,输出英文
- C++异常处理 例子2
- windows phone开发学习--加载时的旋转动画
- discuz 插件开发经验之如何运用 C::t 方法
- 基于Visual C++2013拆解世界五百强面试题--题7-链表的各种操作
- 另一种阶乘 函数法!
- c# POST And Get提交
- ios7屏幕适配
- sql server
- 在论坛中出现的比较难的sql问题:7(子查询 判断某个字段的值是否连续)
- ORACLE 12C EM Express
- NSTimer 怎么暂停继续
- css线性background样式