【C语言编程练习】7.2动态数列排列
1. 题目要求
编写这样一个C程序,实现这样的功能:从键盘输入任意个整数,以0作为结束标志,对于这个整数序列从小到大排序,并输出排序后结果
2. 题目分析
不得不说,我确实对这类问题毫无思路呢!应该也是一个熟练度的问题吧。前面的这几个练习,可以先看看参考的解题思路呢。比如这道题要实现的是动态数列排序,首先要选好数据存储结构(刚好最近在看的C语言课程视频里,就有讲这些东西)如果选择静态的线性存储结构,例如数组,静态顺序表等就无法实现动态数列排序的功能,因为静态纤细存储结构的内存空间开辟在内存的静态区(区别于heap与stack?)它在程序编译时就已经分配好了,因此无法在程序运行时改变空间的大小,也就无法实现动态数列排序的功能,因此只可以选择动态的顺序表或者链表作为数据的存储结构。
在这里,应该用链表作为数据的存储结构,因为链表的存储空间是分配在系统的动态存储区的,因此可以在程序执行时动态分配内存,这样就可以轻松的解决动态的数列排序问题了。
再一个,需要考虑的是数列排序算法,采用典型的冒泡算法。
https://blog.csdn.net/Mr_HCW/article/details/82026333
- 链表知识补充
#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动态数列排列的更多相关文章
- 华为C语言编程规范
DKBA华为技术有限公司内部技术规范DKBA 2826-2011.5C语言编程规范2011年5月9日发布 2011年5月9日实施华为技术有限公司Huawei Technologies Co., Ltd ...
- linux 操作系统下c语言编程入门
2)Linux程序设计入门--进程介绍 3)Linux程序设计入门--文件操作 4)Linux程序设计入门--时间概念 5)Linux程序设计入门--信号处理 6)Linux程序设计入门--消息管理 ...
- 有关c语言编程
有关C语言编程 统计代码"行数" 对于统计代码"行数",行数不包括空白行和注释行.程序改进如下: while(fgets (mystring , 100 , f ...
- C++语言编程规范
前言 这里参考了<高质量C++C 编程指南 林锐>.<google C++编程指南>以及<华为C++语言编程规范>编写了这份C++语言编程规范文档,以合理使用 C+ ...
- C语言编程实现Linux命令——who
C语言编程实现Linux命令--who 实践分析过程 who命令是查询当前登录的每个用户,它的输出包括用户名.终端类型.登录日期及远程主机,在Linux系统中输入who命令输出如下: 我们先man一下 ...
- 个人c语言编程风格总结
总结一下我个人的编程风格及这样做的原因吧,其实是为了给实验室写一个统一的C语言编程规范才写的.首先声明,我下面提到的编程规范,是自己给自己定的,不是c语言里面规定的. 一件事情,做成和做好中间可能隔了 ...
- Linux下C语言编程实现spwd函数
Linux下C语言编程实现spwd函数 介绍 spwd函数 功能:显示当前目录路径 实现:通过编译执行该代码,可在终端中输出当前路径 代码实现 代码链接 代码托管链接:spwd.c 所需结构体.函数. ...
- 混合语言编程:启用CLR(公共语言运行时编译)让C#调用C++
前言 关于混合C#和C++的编程方式,本人之前写过一篇博客(参见混合语言编程:C#使用原生的Directx和OpenGL),在之前的博客中,介绍了在C#的Winform和WPF下使用原生的Direct ...
- Linux基础与Linux下C语言编程基础
Linux基础 1 Linux命令 如果使用GUI,Linux和Windows没有什么区别.Linux学习应用的一个特点是通过命令行进行使用. 登录Linux后,我们就可以在#或$符后面去输入命令,有 ...
- LINUX下C语言编程基础
实验二 Linux下C语言编程基础 一.实验目的 1. 熟悉Linux系统下的开发环境 2. 熟悉vi的基本操作 3. 熟悉gcc编译器的基本原理 4. 熟练使用gcc编译器的常用选项 5 .熟练使用 ...
随机推荐
- shell 脚本实现定时备份mysql数据库
首先要知道直接在脚本中输入mysql的密码是不被允许的,但是我们可以曲线救国 1. 在新建一个文件专门用来存储用户密码 如: vim ./.mysql.conf [mysqldump] user=yo ...
- Ubuntu18.04格式化U盘为NTFS的方法
1.先安装工具ntfs-3g sudo apt-get install ntfs-3g 2.找到需要格式化的U盘在系统中的序号 df -h 找到U盘的序列号后记下来,例如“/dev/sdd1” 3.解 ...
- js中对cookie的操作及json数据与cookie结合的用法
cookie的使用 添加cookie 添加cookie:document.cookie = “key=value”; // 一次写入一个键值对 document.cookie = 'test1=hel ...
- Selenium中三种等待的使用方式---规避网络延迟、代码不稳定问题
在UI自动化测试中,必然会遇到环境不稳定,网络慢的情况,这时如果你不做任何处理的话,代码会由于没有找到元素,而报错.这时我们就要用到wait(等待),而在Selenium中,我们可以用到一共三种等待, ...
- eclipse添加jar包进jar源码debug调试
1.点击调试配置 2.选中源码 3.点击添加 4.点击java路径变量 5.点击环境变量配置 6.输入名称及jar包复制限定名
- smbclient匿名访问win7共享文件夹
windows: 首先需要开启Guest用户,设置密码为空. 然后需要在管理工具下的本地安全策略中检查本地策略\用户权限分配\拒绝从网络访问这台计算机如果有Guest或Guests则删掉. 然后正常共 ...
- ThinkPHP 2053错误
这个报错是调用存储过程的时候产生的,用的是5.1的代码是根据官方文档写的,我怀疑5.0也有这个问题.去官方查了一下发现不少人有这个问题,但是官方都没有回应过,只能自己动手一步步调了. $center ...
- JAVA第三次实训作业
---恢复内容开始--- 1. 编写“学生”类及其测试类. “学生”类: 类名:Student 属性:姓名.性别.年龄.学号.5门课程的成绩 方法1:在控制台输出各个属性的值. 方法2:计算平均成绩 ...
- python的pandas库学习笔记
导入: import pandas as pd from pandas import Series,DataFrame 1.两个主要数据结构:Series和DataFrame (1)Series是一种 ...
- java请求URL带参之防XSS攻击
1.web.xml新增filter配置 <!-- URL请求参数字符过滤或合法性校验 --> <filter> <filter-name>XssFilter< ...