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. 【ARC 063F】Snuke's Coloring 2

    Description There is a rectangle in the xy-plane, with its lower left corner at (0,0) and its upper ...

  2. .Net Core的Excel导入

    1.前台代码,layui模板 2.后台代码,后台实现 (1)导入 (2)数据验证 (3)将导入数据存储在数据库中 (4)定义保存导入数据接口 (5)接口的实现调用业务层 (6)业务层接口 (7)业务层 ...

  3. vue老司机

    你和答案之间只差一个关键字 1.对象二级查找值渲染早于数据获取   解决vue.js 数据渲染成功仍报错的问题

  4. SimpleDateFormat日期格式解析

    先看一个代码示例: import java.text.SimpleDateFormat; import java.util.Date; public class test{ public static ...

  5. 迁移虚拟机打开快照报错:CPUID错误

    场景:迁移虚拟机后,恢复快照报错 这个没办法解决,正常启动不会报错,恢复快照有可能报错,是因为你的cpu与快照那个cpu不匹配造成的

  6. Dubbo+Nacos做注册中心和配置中心

    项目结构 相关代码 EchoService public interface EchoService { String echo(String msg); } DefaultEchoService @ ...

  7. spring boot集成swagger,自定义注解,拦截器,xss过滤,异步调用,guava限流,定时任务案例, 发邮件

    本文介绍spring boot集成swagger,自定义注解,拦截器,xss过滤,异步调用,定时任务案例 集成swagger--对于做前后端分离的项目,后端只需要提供接口访问,swagger提供了接口 ...

  8. redis集群伸缩【转】

    一:实验介绍 在不影响集群对外服务的情况下,可以为集群添加节点进行扩容,也可以下线部分节点进行缩容. 原理可以抽象为槽和对应数据在不同节点之间灵活移动. 如果希望加入一个节点来实现集群扩容时,需要通过 ...

  9. <A>标记onclick事件

    <script> function ss() { document.getElementById("btnPublicity").click(); }</scri ...

  10. 深入Java虚拟机:多态性实现机制——静态分派与动态分派

    方法解析 Class文件的编译过程中不包含传统编译中的连接步骤,一切方法调用在Class文件里面存储的都只是符号引用,而不是方法在实际运行时内存布局中的入口地址.这个特性给Java带来了更强大的动态扩 ...