码迷,mamicode.com
首页 > 编程语言 > 详细

【C语言编程练习】7.2动态数列排列

时间:2019-03-22 22:43:12      阅读:228      评论:0      收藏:0      [点我收藏+]

标签:lin   git   for   课程   编写   ini   NPU   算法   返回值   

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动态数列排列

标签:lin   git   for   课程   编写   ini   NPU   算法   返回值   

原文地址:https://www.cnblogs.com/mumutoday/p/10581329.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!