链表是学习C语言时的重要内容。网上都有很多链表的示例,一般都是控制台版本的。其输入输出显示在控制台。

下面鄙人把链表的输出显示在MFC单文档窗口。

1 首先在VC中创建一个单文档应用程序

加入如下菜单资源

2 把链表相关定义添加到视图类头文件

把链表的结构体定义添加到视图类头文件;把链表的操作函数作为视图类的成员函数;

3 为菜单添加命令处理函数

4 在视图类中

实现链表的操作函数;实现在窗口上输出链表的操作结果;

完成2,3,4,之后的视图类头文件和实现文件如下;VC自动生成的其他类未做修改;

// lianbiaodemoView.h : interface of the CLianbiaodemoView class
//
/#if !defined(AFX_LIANBIAODEMOVIEW_H__36AD083C_F5FE_4FD5_A5F4_78898A5AEC67__INCLUDED_)
#define AFX_LIANBIAODEMOVIEW_H__36AD083C_F5FE_4FD5_A5F4_78898A5AEC67__INCLUDED_#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000struct grade {int score;struct grade *next;
};
typedef struct grade NODE;class CLianbiaodemoView : public CView
{
protected: // create from serialization onlyCLianbiaodemoView();DECLARE_DYNCREATE(CLianbiaodemoView)// Attributes
public:CLianbiaodemoDoc* GetDocument();struct grade *head,*pnew;int m;
// Operations
public:struct grade *create();   //创建链表void insert(NODE *head,NODE *pnew,int i);   //插入链表void pdelete(NODE *head,int i);   //删除列表void Pfree(NODE *head);    //销毁链表// Overrides// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CLianbiaodemoView)public:virtual void OnDraw(CDC* pDC);  // overridden to draw this viewvirtual BOOL PreCreateWindow(CREATESTRUCT& cs);protected:virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);//}}AFX_VIRTUAL// Implementation
public:virtual ~CLianbiaodemoView();
#ifdef _DEBUGvirtual void AssertValid() const;virtual void Dump(CDumpContext& dc) const;
#endifprotected:// Generated message map functions
protected://{{AFX_MSG(CLianbiaodemoView)afx_msg void OnMenuitem32771();afx_msg void OnMenuitem32772();afx_msg void OnMenuitem32773();afx_msg void OnMenuitem32774();//}}AFX_MSGDECLARE_MESSAGE_MAP()
};#ifndef _DEBUG  // debug version in lianbiaodemoView.cpp
inline CLianbiaodemoDoc* CLianbiaodemoView::GetDocument(){ return (CLianbiaodemoDoc*)m_pDocument; }
#endif///{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.#endif // !defined(AFX_LIANBIAODEMOVIEW_H__36AD083C_F5FE_4FD5_A5F4_78898A5AEC67__INCLUDED_)
// lianbiaodemoView.cpp : implementation of the CLianbiaodemoView class
//#include "stdafx.h"
#include "lianbiaodemo.h"#include "lianbiaodemoDoc.h"
#include "lianbiaodemoView.h"#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif/
// CLianbiaodemoViewIMPLEMENT_DYNCREATE(CLianbiaodemoView, CView)BEGIN_MESSAGE_MAP(CLianbiaodemoView, CView)//{{AFX_MSG_MAP(CLianbiaodemoView)ON_COMMAND(ID_MENUITEM32771, OnMenuitem32771)ON_COMMAND(ID_MENUITEM32772, OnMenuitem32772)ON_COMMAND(ID_MENUITEM32773, OnMenuitem32773)ON_COMMAND(ID_MENUITEM32774, OnMenuitem32774)//}}AFX_MSG_MAP// Standard printing commandsON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()/
// CLianbiaodemoView construction/destructionCLianbiaodemoView::CLianbiaodemoView()
{// TODO: add construction code herem=0;
}CLianbiaodemoView::~CLianbiaodemoView()
{
}BOOL CLianbiaodemoView::PreCreateWindow(CREATESTRUCT& cs)
{// TODO: Modify the Window class or styles here by modifying//  the CREATESTRUCT csreturn CView::PreCreateWindow(cs);
}/
// CLianbiaodemoView drawingvoid CLianbiaodemoView::OnDraw(CDC* pDC)
{CLianbiaodemoDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereNODE *p;int x=0;char strscore[5];switch(m){case 1:pDC->TextOut(100,100,"新创建的链表:");      for (p=head->next; p!=NULL; p=p->next){itoa(p->score,strscore,10);pDC->TextOut(100+x*25,125,strscore);x=x+1;}break;case 2:pDC->TextOut(100,150,"插入后的链表:");        for (p=head->next; p!=NULL; p=p->next){itoa(p->score,strscore,10);pDC->TextOut(100+x*25,175,strscore);x=x+1;}break;case 3:pDC->TextOut(100,200,"删除后的链表:");        for (p=head->next; p!=NULL; p=p->next){itoa(p->score,strscore,10);pDC->TextOut(100+x*25,225,strscore);x=x+1;}break;case 4:pDC->TextOut(100,250,"释放后的链表:");        for (p=head->next; p!=NULL; p=p->next){itoa(p->score,strscore,10);pDC->TextOut(100+x*25,275,strscore);x=x+1;}break;default:break;}
}/
// CLianbiaodemoView printingBOOL CLianbiaodemoView::OnPreparePrinting(CPrintInfo* pInfo)
{// default preparationreturn DoPreparePrinting(pInfo);
}void CLianbiaodemoView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{// TODO: add extra initialization before printing
}void CLianbiaodemoView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{// TODO: add cleanup after printing
}/
// CLianbiaodemoView diagnostics#ifdef _DEBUG
void CLianbiaodemoView::AssertValid() const
{CView::AssertValid();
}void CLianbiaodemoView::Dump(CDumpContext& dc) const
{CView::Dump(dc);
}CLianbiaodemoDoc* CLianbiaodemoView::GetDocument() // non-debug version is inline
{ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CLianbiaodemoDoc)));return (CLianbiaodemoDoc*)m_pDocument;
}
#endif //_DEBUG/
// CLianbiaodemoView message handlers//创建链表
void CLianbiaodemoView::OnMenuitem32771()
{// TODO: Add your command handler code herehead=create();if (head==NULL)return;m=1;Invalidate();
}//插入
void CLianbiaodemoView::OnMenuitem32772()
{// TODO: Add your command handler code herepnew=(NODE *)malloc(sizeof(NODE));if (pnew==NULL) {return ;}pnew->score=87;insert(head,pnew, 1);   //将新节点插入节点3的后面m=2;RECT rect1;rect1.left=100;rect1.right=200;rect1.top=150;rect1.bottom=200;InvalidateRect(&rect1,true);
}//删除
void CLianbiaodemoView::OnMenuitem32773()
{// TODO: Add your command handler code herepdelete(head,2);m=3;RECT rect1;rect1.left=100;rect1.right=200;rect1.top=200;rect1.bottom=250;InvalidateRect(&rect1,true);
}//释放
void CLianbiaodemoView::OnMenuitem32774()
{// TODO: Add your command handler code herePfree(head);m=4;RECT rect1;rect1.left=100;rect1.right=200;rect1.top=250;rect1.bottom=300;InvalidateRect(&rect1,true);
}struct grade * CLianbiaodemoView::create() {NODE *head,*tail,*pnew;int score;head=(NODE *)malloc(sizeof(NODE));  //创建头节点。if (head==NULL) { //创建失败返回return NULL;}head->next=NULL;  //头节点指针域置NULLtail=head;  // 开始时尾指针指向头节点pnew=(NODE *)malloc(sizeof(NODE));  //创建新节点if (pnew==NULL) { //创建失败返回return NULL;}score=90;pnew->score=score;  //新节点数据域存放输入的成绩pnew->next=NULL;   //新节点指针域置NULLtail->next=pnew;  //新节点插入到表尾tail=pnew;   //为指针指向当前的尾节点return head;  //返回创建链表的头指针
}void CLianbiaodemoView::insert(NODE *head,NODE *pnew,int i) {NODE *p; //当前指针int j;p=head;for (j=0; j<i&&p!=NULL; j++) //p指向要插入的第i个节点p=p->next;if (p==NULL) { //节点i不存在return;}pnew->next=p->next;   //插入节点的指针域指向第i个节点的后继节点p->next=pnew;    //犟第i个节点的指针域指向插入的新节点
}void CLianbiaodemoView::pdelete(NODE *head,int i) {NODE *p,*q;int j;if (i==0) //删除的是头指针,返回return;p=head;for (j=1; j<i&&p->next!=NULL; j++)p=p->next;  //将p指向要删除的第i个节点的前驱节点if (p->next==NULL) { //表明链表中的节点不存在printf("不存在!");return;}q=p->next;  //q指向待删除的节点p->next=q->next;  //删除节点i,也可写成p->next=p->next->nextfree(q);   //释放节点i的内存单元
}void CLianbiaodemoView::Pfree(NODE *head) {NODE *p,*q;p=head;while (p->next!=NULL) {q=p->next;p->next=q->next;free(q);}free(p);
}

最后的结果如下:

链表的实现可参阅相关资料;
另上面 的MFC程序有几个要点:
itoa(p->score,strscore,10);
pDC->TextOut(100+x*25,225,strscore);
itoa是转化整型的成绩为字符串,然后输出;
每输出一个数字,x坐标增加25,再输出下一个数字;输出完一行后y坐标增加25;
Invalidate()刷新整个窗口;
InvalidateRect(&rect1,true)刷新所指定的矩形区域;对于第二次以后的输出是刷新局部区域,否则前一次的输出就会没有了;

上述工程下载
http://pan.baidu.com/s/1o8qyWLs
文件名
lianbiaodemo

二 控制台版链表

#include<stdio.h>
#include<stdlib.h>
typedef struct k
{
int data;
struct k*next;
}node;
node*creatlink()
{
node *head,*tail,*q;
int x;
head=tail=NULL;
printf("please input zhengshu,endby 0:\n");
scanf("%d",&x);
while(x!=0)
{
q=(node*)malloc(sizeof(node));
q->data=x;
if(head==NULL)
{
head=tail=q;
}
else
{
tail->next=q;
tail=q;
}
scanf("%d",&x);
}
if(tail!=NULL)
tail->next=NULL;
return head;
}
void print(node*head)
{
node*p=head;
printf("List is:\n");
while(p!=NULL)
{
printf("%5d",p->data);
p=p->next;
}
printf("\n");
}
int main()
{
node*head;
head=creatlink();
print(head);
getchar();
return 0;
}

MFC版本链表演示程序相关推荐

  1. 12306客户端MFC版本

    MFC + libCurl 以后有时间再慢慢完善,打算MFC版本完成之后再做个wxWidgets版本. 花了7个小时左右的半成品,不为了刷票什么的,纯粹是练手.... 目前做到了提交订单部分,要处理数 ...

  2. MFC版链表实现稀疏多项式相加减

    链表实现多项式运算(加减)MFC可视化版 题目 设计一个一元稀疏多项式简单计算器. 基本要求 (1)输入并建立两个多项式: (2)多项式a与b相加,建立和多项式c: (3)多项式a与b相减,建立差多项 ...

  3. 卷积的C语言实现的MFC版本

    卷积定义 卷积是一种数学运算,符号为*,是两个变量在某范围内相乘后求和的结果. 重点:先相乘后求和.结果是一个数值[标量]. "相乘"的另外一种说法"加权",即 ...

  4. 未完成版本链表通讯录脑壳疼只做了一个添加

    #include<stdio.h> #include<stdlib.h> #include<string.h> #define OK 1 #define ERR 0 ...

  5. C语言函数指针的MFC版本Demo

    新建一个单文档工程: 在视图类cpp文件尾部,加入函数:代码如下, int Max(int x, int y) {int z;if (x > y){z = x;}else{z = y;}retu ...

  6. MFC视图滚动条的基本使用和C语言输出三角形的MFC版本

    win7, vc6:新建一个单文档工程:最后一步选择视图类的基类为CScrollView: 代码: void CTestView::OnDraw(CDC* pDC) {CTestDoc* pDoc = ...

  7. MFC 教程【5_MFC对象的创建】

    MFC对象的创建 前面几章介绍了MFC的核心概念和思想,即介绍了MFC对Windows对象的封装方法和特点:MFC对象的动态创建.序列化:MFC消息映射机制. 现在,考查MFC的应用程序结构体系,即以 ...

  8. VC++动态链接库(DLL)编程(四)――MFC扩展 DLL

    VC++动态链接库(DLL)编程(四) ――MFC扩展 DLL 作者:宋宝华  e-mail:21cnbao@21cn.com   前文我们对非MFC DLL和MFC规则DLL进行了介绍,现在开始详细 ...

  9. C语言指针函数MFC版Demo

    指针函数,就是一个函数,返回值是一个指针: VC6,新建一个单文档工程: 在视类CPP文件尾部添加一个函数: int * func_sum(int n) {if (n < 0){//printf ...

最新文章

  1. FBI承认技术实力不足 要求国会增加3800万美元财政预算
  2. 【Java】MyBatis与Spring框架整合(一)
  3. 有关[Http持久连接]的一切,卷给你看
  4. mac 配置php和mysql_Mac下配置PHP+MySql环境
  5. dump查询Java 状态
  6. php代码加文件后缀,php中一行代码获取文件后缀名
  7. Scala 类和对象
  8. leetcode:Majority Number
  9. finally块的return语句会覆盖其他语句的return
  10. CentOS linux系统将UTC时间修改为CST时间
  11. 正确的Kado ED「永遠のこたえ」
  12. 谷粒学院项目总结(持续更新)
  13. 基于SSM框架的学生学籍管理系统(源码及具体讲解)
  14. iPad开发强制横屏
  15. 枚举---知识总结----------gyy加以整理以及改为C++方法
  16. 95%的人都会答错的类加载的问题
  17. uniapp微信授权+获取手机号+解密手机号(带图详解)
  18. 电能质量监测装置及系统
  19. 本地电脑ssh连接机器人,使用rviz控制机器人导航
  20. 软件的4种维护(更正性、完善性、预防性、适应性)的区别

热门文章

  1. 三层架构 || SpringMVC 和 Struts2 的优略分析
  2. 【UVA624 01背包中的路径问题】
  3. 欧几里得算法扩展欧几里得算法
  4. [YTU]_2781( 重复字符串)
  5. java中字符串的截取
  6. img文件解包工具_使用tar归档命令,就不怕文件多!
  7. Python中字符串使用方法总结(学习笔记)
  8. iPhone音频播放后台控制
  9. 少儿编程:玩游戏不如设计游戏!
  10. Ubuntu 16.04 下Redis Cluster集群搭建