1. 题目要求

编写这样一个C程序,实现这样的功能:从键盘输入任意个整数,以0作为结束标志,对于这个整数序列从小到大排序,并输出排序后结果

2. 题目分析

不得不说,我确实对这类问题毫无思路呢!应该也是一个熟练度的问题吧。前面的这几个练习,可以先看看参考的解题思路呢。比如这道题要实现的是动态数列排序,首先要选好数据存储结构(刚好最近在看的C语言课程视频里,就有讲这些东西)如果选择静态的线性存储结构,例如数组,静态顺序表等就无法实现动态数列排序的功能,因为静态纤细存储结构的内存空间开辟在内存的静态区(区别于heap与stack?)它在程序编译时就已经分配好了,因此无法在程序运行时改变空间的大小,也就无法实现动态数列排序的功能,因此只可以选择动态的顺序表或者链表作为数据的存储结构。

在这里,应该用链表作为数据的存储结构,因为链表的存储空间是分配在系统的动态存储区的,因此可以在程序执行时动态分配内存,这样就可以轻松的解决动态的数列排序问题了。

再一个,需要考虑的是数列排序算法,采用典型的冒泡算法。

https://blog.csdn.net/Mr_HCW/article/details/82026333

  1. 链表知识补充

#include <stdio.h>

#include <stdlib.h> //用于malloc,free内存申请与释放

一个节点就像火车的一节车厢, data是车厢里面的东西, next相当于一个钩子, 用于将车厢之间的连接起来

#include <stdio.h>

#include <stdlib.h> //用于malloc,free内存申请与释放

//定义节点

typedef struct node{

int data;

struct node *next;

}*PNODE,NODE; //PNODE是指向struct node的指针,而NODE就是这个结构体

//函数声明

PNODE init(); //链表初始化

void insert(PNODE head,int newdata);

void print(PNODE head); //打印整个链表

void freeAllNode(PNODE head);//释放整个内存

//这个块里面没有数据

PNODE init(){

PNODE first = (PNODE)malloc(sizeof(NODE));

first->next = NULL;

return first;

}

void insert(PNODE head,int newdata){

PNODE temp = (PNODE)malloc(sizeof(NODE));//开辟内存,存放新的节点

temp->data=newdata;

//头插

//temp->next = head->next;

//head->next = temp;

//尾插

//要找到最后一个节点,要注意这写特别

//PNODE p = (PNODE)malloc(sizeof(NODE));

PNODE p;

p = head;

while(p->next!=NULL)p=p->next;

temp->next=NULL;

p->next=temp;

}

//如何遍历链表呢?

void print(PNODE head){

PNODE temp = head->next; //定义temp,让它指向第一个有内容的节点

while(temp != NULL){ //知道遍历完所有节点

printf("%d\t",temp->data);

temp = temp->next;

}

printf("NULL\n");

}

//释放整个内存

void freeAllNode(PNODE head){

PNODE p = head,temp;

while(p!=NULL){

temp = p->next;

free(p);

p = temp;

}

}

int main(){

PNODE head = init(); //返回值是指向first node的指针

for(int i=0;i<10;i++){

insert(head,i);

}

print(head);

freeAllNode(head);

return 0;

}

4. 代码学习

#include <string.h>

#include <stdio.h>

#include <malloc.h>

/*定义int为ElemType类型*/

//这个是为了跨平台

typedef int ElemType;

/*定义链表的结点类型*/

typedef struct node{

ElemType data;

struct node *next;

}*LinkList,LNode;

/*创建一个长度为n的链表,并输入数据*/

LinkList CreateLinkList(int n){

LinkList p,r,list=NULL;

//p,r,list都是指向结点的指针,并且list指向的是NULL,这里的list应该是头结点

ElemType e;

for(int i=0;i<n;i++){

scanf("%d",&e);

p=(LinkList)malloc(sizeof(LNode));//什么时候需要malloc?

p->data=e;

p->next=NULL;

if(!list)

如果list现在是头结点,那么

list=p;

else

r->next=p;

r=p;

}

return list;

}

/*向链表中插入节点,并向该节点的数据域中存放数据*/

void insertList(LinkList *list,LinkList q, ElemType e){

LinkList p;

p=(LinkList)malloc(sizeof(LNode));

p->data=e;

if(!*list){

*list=p;

p->next = NULL;

}else{

p->next=q->next;

q->next=p;

}

}

/*用于链表的冒泡排序法*/

void sort(LinkList q){

LNode *p = q;

int t,i,j,k=0;

while(p){

k++;

p=p->next;//p是null

}

p = q;

for(i=0;i<k-1;i++){

for(j=0;j<k-i-1;j++){

if(p->data>p->next->data){

t=p->data;

p->data=p->next->data;

p->next->data=t;

}

p=p->next;

}

p=q;

}

}

/*打印链表*/

void print(LinkList q){

while(q){

printf("%d\t",q->data);

q=q->next;

}

}

void main(){

ElemType e;

LinkList l,q;

printf("please input some integer digit and type 0 for end\n");

q=l=CreateLinkList(1);

scanf("%d",&e);

while(e){

insertList(&l,q,e);

q=q->next;

scanf("%d",&e);

}

sort(l);

print(l);

}

5 . 总结

其实,我有觉得自己的进步,从半年前什么都不知道的人,到现在渐渐理解了这些语句的意思,有坚持一定会有进步的!多看到自己的闪光点,不要太轻易被打击到毫无自信,做就对了!

【C语言编程练习】7.2动态数列排列的更多相关文章

  1. 华为C语言编程规范

    DKBA华为技术有限公司内部技术规范DKBA 2826-2011.5C语言编程规范2011年5月9日发布 2011年5月9日实施华为技术有限公司Huawei Technologies Co., Ltd ...

  2. linux 操作系统下c语言编程入门

    2)Linux程序设计入门--进程介绍 3)Linux程序设计入门--文件操作 4)Linux程序设计入门--时间概念 5)Linux程序设计入门--信号处理 6)Linux程序设计入门--消息管理  ...

  3. 有关c语言编程

    有关C语言编程 统计代码"行数" 对于统计代码"行数",行数不包括空白行和注释行.程序改进如下: while(fgets (mystring , 100 , f ...

  4. C++语言编程规范

    前言 这里参考了<高质量C++C 编程指南 林锐>.<google C++编程指南>以及<华为C++语言编程规范>编写了这份C++语言编程规范文档,以合理使用 C+ ...

  5. C语言编程实现Linux命令——who

    C语言编程实现Linux命令--who 实践分析过程 who命令是查询当前登录的每个用户,它的输出包括用户名.终端类型.登录日期及远程主机,在Linux系统中输入who命令输出如下: 我们先man一下 ...

  6. 个人c语言编程风格总结

    总结一下我个人的编程风格及这样做的原因吧,其实是为了给实验室写一个统一的C语言编程规范才写的.首先声明,我下面提到的编程规范,是自己给自己定的,不是c语言里面规定的. 一件事情,做成和做好中间可能隔了 ...

  7. Linux下C语言编程实现spwd函数

    Linux下C语言编程实现spwd函数 介绍 spwd函数 功能:显示当前目录路径 实现:通过编译执行该代码,可在终端中输出当前路径 代码实现 代码链接 代码托管链接:spwd.c 所需结构体.函数. ...

  8. 混合语言编程:启用CLR(公共语言运行时编译)让C#调用C++

    前言 关于混合C#和C++的编程方式,本人之前写过一篇博客(参见混合语言编程:C#使用原生的Directx和OpenGL),在之前的博客中,介绍了在C#的Winform和WPF下使用原生的Direct ...

  9. Linux基础与Linux下C语言编程基础

    Linux基础 1 Linux命令 如果使用GUI,Linux和Windows没有什么区别.Linux学习应用的一个特点是通过命令行进行使用. 登录Linux后,我们就可以在#或$符后面去输入命令,有 ...

  10. LINUX下C语言编程基础

    实验二 Linux下C语言编程基础 一.实验目的 1. 熟悉Linux系统下的开发环境 2. 熟悉vi的基本操作 3. 熟悉gcc编译器的基本原理 4. 熟练使用gcc编译器的常用选项 5 .熟练使用 ...

随机推荐

  1. 一次多个数据库tnsping及登录单点登录需求

    [环境介绍] 系统环境:Linux + Oracle 11.2.0.4.0 + python 2.7.10 [背景描述] 需求:因为涉及生产数据库较多,业务夸多个数据库使用.当收到业务有些影响时,数据 ...

  2. socket.io emit callback调用探秘

    socket.io https://socket.io/ https://socket.io/docs/ What Socket.IO is Socket.IO is a library that e ...

  3. IntelliJ IDEA打包WAR并部署运行(mac osx)将Web项目War包部署到Tomcat服务器基本步骤(完整版)

    用IntelliJ IDEA做web开发体验很好,但导出war包比eclipse麻烦了不少,以下是解决方案: 打包:1.自动打包:File —> Project Structure —> ...

  4. mysql远程连接很慢问题解决

    mysql开启远程访问发现从远程连接每次都在5秒以上,从本机连接很快. 解决方案: [mysqld] 标签下添加一行配置 skip-name-resolve 重启mysqld服务, 问题解决!

  5. day 22 - 2 面向对象练习

    练习一 在终端输出如下信息 小明,10岁,男,上山去砍柴小明,10岁,男,开车去东北小明,10岁,男,最爱大保健老李,90岁,男,上山去砍柴老李,90岁,男,开车去东北老李,90岁,男,最爱大保健老张 ...

  6. 使用Perfect Player观看电视直播

    Perfect Player下载地址: 官网 http://niklabs.com/ 去广告版本:链接: https://pan.baidu.com/s/1gevIdBghB6lB46vVyfQUWg ...

  7. 阿里云服务器+ftp文件操作+基于Centos7的vsftpd配置

    路径问题:一定要注意此位置是否需要加入"/" 文件上传方式:被动模式 vsftp完整配置: # # The default compiled in settings are fai ...

  8. 项目Alpha冲剂(3/10)

    1.项目燃尽图 2.今日进度描述 项目进展 完成数据库和服务器的连接部分,完成了一些应用的基本功能. 问题困难 完成了服务器的成功配置,同时实现了客户端与服务器的连接 心得体会 进度有明显的变化,成员 ...

  9. Java基础11-List;Set;Map

    作业解析: remove(int index); //删除指定位置的元素 List list = new ArrayList(); list.add("s1"); list.add ...

  10. Sql server2012转sql server2008步骤经验总结(转)

    wIndows用户登入选择“数据库”右键选择“附加”点击“添加” 打开数据库,右键选中 选择“任务”→“生成脚本”→“选择对象”→“编写整个数据及所有数据库对象的脚本” →“下一步” “设置脚本编写选 ...