一个师弟的简单的链表代码(经过修改)。嗯,应该是学习链表的实例代码吧。
- // testlist.cpp : Defines the entry point for the console application.
- //
- #include "stdafx.h"
- #include <iostream>
- #include <stdio.h>
- #include <malloc.h>
- using namespace std;
- /*一、 插入链表。一个链表A={a1,a2,..,an}结构如下:
- 节点定义为:
- struct node{
- int num; //关键字
- struct node *next;
- };
- 编程。要求程序实现如下功能:
- (1) 插入链表。主程序输入关键码值,调用插入函数insert(),将节点插入到A中;
- (2) 遍历节点计数。调用节点计数函数counter(),遍历求A中的节点个数。调用counter()函数之后,其返回值(整数)输出到屏幕;
- (3) 递归节点计数。调用递归函数Rcounter(),递归求A中的节点个数,调用Rcounter()函数之后,其返回值(整数)输出到屏幕;
- 我的case 3 为什么总输出0啊???
- 其他都能运行,就递归(Rcounter)不行?为什么
- */
- struct node{
- int num;
- struct node *next;
- };
- int counter(struct node *);
- int Rcounter(struct node *,int*);
- struct node *insert(struct node *,struct node *);
- int main()
- {
- struct node *head=NULL,*node1;
- int k;
- cout<<"输入要执行的功能:1 插入节点 2 遍历计数 3 递归计数 4 退出程序"<<endl;
- cin>>k;
- node1=(struct node *)malloc(sizeof(struct node));
- while(k!=4)
- {
- switch(k)
- {
- case 1:
- cout<<"输入关键码值:"<<endl;
- cin>>node1->num;
- head=insert(head,node1);
- break;
- case 2:
- int i;
- i=counter(head);
- cout<<"共有"<<i<<"个节点"<<endl;
- break;
- case 3:
- struct node *s;
- node* pNode = NULL;
- int t=0;
- int k=0;
- //s=head; 由于下面是动态内存分配的所以你这里赋值是没有什么意义的
- head = (struct node *)malloc(sizeof(struct node));
- //判断是否动态内存分配成功
- if (NULL == head)
- {
- cout << "get memory failed!";
- break;
- }
- //初始化
- head->next = NULL;
- //对于链表的头需要单独的处理
- cout<<"是否输入关键字:1是 0否"<<endl;
- cin>>k;
- if (0 == k)
- {
- cout << "递归求得的节点数是 0" << endl;
- break;
- }
- else
- {
- head->num = k;
- }
- //动态内存分配了之后再赋值
- s = head; //这样 head 里面保存了头了
- //开始建立链表
- while(k)
- {
- pNode = (struct node *)malloc(sizeof(struct node));
- //判断是否动态内存分配成功
- if (NULL == pNode)
- {
- cout << "get memory failed!";
- break;
- }
- //初始化
- pNode->next = NULL;
- cout<<"输入num:"<<endl;
- cin>> pNode->num;
- cout<<"是否继续输入:1是 0否"<<endl;
- cin>>k;
- if(k)
- {
- //下面的语句是建立链表的关键代码
- //s=s->next;
- s->next = pNode;
- s = pNode;
- }
- }
- //建立链表结束
- s=head;
- t = 0;
- //Rcounter 函数是需要改变t的,所以参数应该传递指针,当然你的做法也可以,但是需要修改一个很微小的地方
- cout<<"递归求得的节点数是:"<< Rcounter(s, &t) << endl;
- }
- cout<<"输入要执行的功能:1 插入节点 2 遍历计数 3 递归计数 4 退出程序"<<endl;
- cin>>k;
- }
- if(k==4)
- {
- cout<<"谢谢!"<<endl;
- }
- return 0;
- }
- struct node *insert(struct node *head,struct node *node1)
- {
- struct node *p0,*p1,*p2;
- p1=head;
- p0=node1;
- if(head==NULL)
- {
- head=p0;
- p0->next=NULL;
- }
- else
- {
- while(p0->num > p1->num)
- {
- p2=p1;
- p1=p1->next;
- }
- if(p0->num<=p1->num)
- {
- if(head==p1)head=p0;
- else p2->next=p0;
- p0->next=p1;
- }
- else
- {
- p1->next=p0;
- p0->next=NULL;
- }
- }
- return (head);
- }
- int counter(struct node *head)
- {
- int k=0,i=0;
- cout<<"是否输入节点关键字:1是 0否"<<endl;
- cin>>k;
- while(k)
- {
- head=(struct node *)malloc(sizeof(struct node));
- cout<<"输入num:"<<endl;
- cin>>head->num;
- cout<<"是否继续输入节点关键字:1是 0否"<<endl;
- cin>>k;
- if(k)
- {
- head=head->next;
- i++;
- }
- }
- if(head==NULL)
- {
- cout<<"链表为空"<<endl;
- return 0;
- }
- return i+1;
- }
- int Rcounter(struct node *s,int* pt)
- {
- if (NULL == s)
- {
- return *pt;
- }
- else
- {
- (*pt)++;
- return Rcounter(s->next, pt);
- }
- }