链表需要用到指针 阶乘需要用到递归 链表中的注意事项: 1.链表L是否等于NULL ----------是循环结束的条件 2.链表L->Data ---------取链表L中各个结点的值 3.L=L->next  --------相当于++i  i++  是循环的条件 使得结点指向下一个结点 递归很简单的思想: 1.当n=0 或n=1时    返回1 2.否则    返回n*fun(n-1); 代码如下: int fun (int n){ if(n==0 ||n==1){ return 1;…
本题要求实现一个函数,求单链表L结点的阶乘和.这里默认所有结点的值非负,且题目保证结果在int范围内. 时间限制: 400ms 内存限制: 64MB 代码长度限制: 16KB 函数接口定义: int FactorialSum( List L ); 其中单链表List的定义如下: typedef struct Node *PtrToNode; struct Node { int Data; /* 存储结点数据 */ PtrToNode Next; /* 指向下一个结点的指针 */ }; typed…
本题要求实现一个函数,求单链表L结点的阶乘和.这里默认所有结点的值非负,且题目保证结果在int范围内. 函数接口定义: int FactorialSum( List L ); 其中单链表List的定义如下: typedef struct Node *PtrToNode; struct Node { int Data; /* 存储结点数据 */ PtrToNode Next; /* 指向下一个结点的指针 */ }; typedef PtrToNode List; /* 定义单链表类型 */ 裁判测…
问题:求单链表倒数第m个结点,要求不准求链表的长度,也不许对链表进行逆转 解:设置两个指针p和q,p.q指向第一个结点.让p先移动到链表的第m个结点,然后p和q同时向后移动,直到p首先到达尾结点.此时,q结点落后p (m-1)个结点,q所指向的结点就是单链表的倒数第m个结点. 算法实现: linkNode *searchLinkM(linkNode *link,int m) { linkNode *p=link->next; ) { ;i<m;i++) { p=p->next; if(p…
/*一个集合用带头结点的单链表L表示,编写算法删除其值最大的结点.*/ /* 算法思想:使用pre,p,premax,max四个指针,pre和p进行比较,premax和max进行最后的删除操作 通过遍历找到最大的值,后进行删除 */ void Delete_Max(LinkList& L) { LNode *pre = L, *p = L->next; LNode *premax = pre, *max = p; while (p) { if (max->data < p->…
/*设计一个递归算法,删除不带头结点的单链表L中所有值为x的结点*/ /* 算法思想:设f(L,x)的功能是删除以L为首结点指针的单链表中所有值等于x的结点, 则显然有f(L->next,x)的功能是删除以L->next为首结点指针的单链表中所有值等于x 的结点.递归模型如下: 终止条件:f(L,x)=不做任何事情 若L为空表 递归主体:f(L,x)=删除*L结点;f(L->next,x); 若L->data == x f(L,x)=f(L->next,x) 其他情况 */…
有一个线性表,采用带头结点的单链表L来存储,设计一个算法将其逆置,且不能建立新节点,只能通过表中已有的节点的重新组合来完成. 分析:线性表中关于逆序的问题,就是用建立链表的头插法.而本题要求不能建立新结点,也就不能把元素重新弄到一个表中.可以将L中的元素作为逆转后的L的元素来源,将L->next设置为空.然后将头结点后的一串结点用头插法逐个插入L中. 伪代码: void reversel(LNode *L) { LNode *p=L->next, *q; L->next=NULL; //…
我在之前一篇博客<C实现头插法和尾插法来构建单链表(不带头结点)>中具体实现了怎样使用头插法和尾插法来建立一个不带头结点的单链表,可是在实际使用中.我们用的最多的还是带头结点的单链表.今天我们就来实现一下带头结点链表的头插和尾插. 代码上传至 https://github.com/chenyufeng1991/HeadInsertAndTailInsert_HeadNode . 核心代码例如以下: //创建带头结点的单链表(尾插法) void CreateListTailInsert(Node…
彻底理解链表中为何使用二级指针或者一级指针的引用 数据结构之链表-链表实现及常用操作(C++篇) C语言实现单链表,主要功能为空链表创建,链表初始化(头插法),链表元素读取,按位置插入,(有序链表)按值插入,按位置删除,按值删除,清空链表,销毁链表. 关键思路:(1)将结点创建结构体:(2)链表中添加头结点,以便统一操作:(3)使用结点一级指针和二级指针的异同点:(4)链表的最小操作单位是结点:(5)操作的起始位置是头结点还是第一个结点,及起始索引是0还是1. #include <stdio.h…
单链表的实现分为两种单链表(其实差别并不是很大):带头结点和不带头结点,分别对应下面图中的上下两种. 链表的每一个结点是由两个域组成:数据域和指针域,分别存放所含数据和下一个结点的地址(这都是很明白的东西) 图中的东西可以分为三种:头指针llist:头节点info:正常的节点ki 下面定义结点的类型和单链表的类型: struct Node; typedef struct Node * PNode; struct Node{ DataType info; PNode link; }; typede…