指针动态创建数组,二维指针处理字符数组,链表对象排序

原创 2016年08月30日 15:14:15

一,关于给链表中的对象排序的问题:

之前纠结于链表排序,比如要给一个学生成绩链表冒泡排序。冒泡排序是要交换元素再数组中的位置,然而每一个学生的成绩都对应着固定的名字,怎么才能让整个对象跟着元素一起移动是关键。

下面是Mr.T的思路:

拷贝整个链表对象,然后放入一个对象指针数组,然后取到参考元素进行排序。但交换变量时交换的是整个对象指针的值,即他们所指的对象。然后再打印时按数组下标顺序,就可以实现按我们想要的顺序显示。并且不影响链表的原始结构。

#include<iostream>
#include<string>
using namespace std;

struct Std
{
    int score;
    char name;
    struct Std *next;   
};

int main()
{   
    int i = 0,j = 0;
    char c = 'A';
    struct Std* arr[10];      //结构体指针数组
    for(i = 0;i<10;i++)
    {   
        arr[i] = new Std;      //动态创建对象(如果给已有对象排序,直接等于对象地址就可以了,比如&s1,&s2等)
        arr[i]->score = rand()%100+50;    //随机给分数赋值
        arr[i]->name = c;                 //随机给名字赋值(遗留问题,如何随机生成字符串,给名字赋值。)
        c++;    
    }

    printf("\n\n排序前:");
    for(i = 0;i<10;i++)
    {
        printf("\n arr[%d]->name = %c  arr[%d].score = %d",i,arr[i]->name,i,arr[i]->score);
    }
    for(i = 0;i<10;i++)
    {
        for(j = 1;j<10;j++)
        {
            if(arr[j]->score < arr[j-1]->score)
            {
                Std t;
                t = *arr[j];
                *arr[j] = *arr[j-1];       //交换指针的指向
                *arr[j-1] = t;              
            }
        }
    }

    printf("\n\n排序后");  
    for(i = 0;i<10;i++)
    {
        printf("\n arr[%d]->name = %c  arr[%d].score = %d",i,arr[i]->name,i,arr[i]->score);
    }
    getchar();
    return 0;
}

二,解决rand()生成随机数,每次打开生成的数都一样的问题:

第一步:头文件多加一条应用#include<time.h>
第二步:在主函数开头加上srand((unsigned) time(NULL));
第三步:希望您使用愉快

三,二维指针处理字符数组:

# include<stdio.h>
main()
{
    char *Names[]={"Bill","Sam","Jim","Paul","Charles",0};
    char **nm=Names;
    while(*nm!=0) 
    {
        printf("%s\n",*nm++);
    }
    getchar();
}
/*
打印效果:
Bill
Sam
Jim
Paul
Charles
*/
刚开始看到这个代码我略懵,稍微捋一捋就清楚了
1定义字符数组有这样两种方式:
    A:char st[] = {"hello"}     
此时默认全部赋值,sizeof(st)的值为6。
    B:char *p;p ="hello";       
动态创建了字符串"hello",并把字符串的首地址赋给字符指针p,字符数组名默认的也是指向数组的首地址。
所以P可以当做字符数组名用。但是P本身其实是一个单独的变量,拥有单独的地址。
打印:p,&st,&st[0]会发现后面两个是一个地址,而P又是一个地址。

2,所以上题中的char *name[6],可以这么理解:
char *name[6];     
创建了一个包含六个元素的字符指针数组。
name[1] = "Bill";  
既然是字符指针就可以像char *p = "Bill"这么用。
前面的类型说明符char可以省略,是因为数组名的类型已经做了统一说明。 
简写就成了:char *name ={"Bill",...}。
所以可以认为每一个名字,都是一个char型的指针,指向的就是这个名字的首地址。

3**nu = name
此时nu指向的是整个字符指针数组,但默认指向num[0];所以*nu就是取num[0],它还是个地址。
但是字符数组的特殊想就在于,打印首地址就可以输入整个字符串。
于是*nu%s下输出的是"Bill",
后面的*nu++,不解释。

四,困扰许久的问题,动态创建数组,自定义大小:

#include<stdio.h>
#include<math.h>
#include<time.h>

void main()
{
    srand((unsigned) time(NULL));
    int *p,n,i = 0;
    printf("你希望数组有多少个元素,给我一个数字:");
    scanf("%d",&n);
    getchar();
    p = (int*)malloc(sizeof(int)*n);     //动态分配内存
    if(p != NULL)                        //检查是否分配成功
    {
        for(i=0;i<n;i++)
        {
            p[i] = rand()%75+25;
            printf("%d\t",p[i]);    
        }
    }
    getchar();
}
//分配了大小为4n内存空间,并且返回了该段内存空间的首地址给P。
此时的P可以当数组名用,也就是说可以写成p[1] = 10这种形式来完成数组的赋值。
再回顾一下之前意淫的形式:
int N,a[N];
scanf("%d",N);
错!错!错!
版权声明:本文为博主原创文章,未经博主允许不得转载。

char *指针的详细解释

前段时间写了一篇char*和char[]的区别,今天对char*做个更深的理解 1:char指针和其他指针一样,也是定义了一块地址,如int*定义了一块栈,4个字节,char*呢,现在写一段代码 #i...
  • panker2008
  • panker2008
  • 2015年06月12日 06:39
  • 3388

动态创建二维vector数组 C和C++ 及指针与引用的区别

二维vectorvector > ivec(m ,vector(n));    //m*n的二维vector动态创建m*n的二维vector方法一:vector > ivec;ivec.resize(...
  • ranjiewen
  • ranjiewen
  • 2016年09月20日 14:03
  • 1167

二维数组的排列以及二维数组与指针例题

二维数组的排列: #include int main() {         int a[2][3],i,j;              printf("please intput by line...
  • u012402276
  • u012402276
  • 2016年08月12日 14:57
  • 831

【C++】指针数组和数组指针/链表的构建和排序

在上一篇计算机图形学/扫描线填充算法中,由于每一条扫描线要对应一个链表,所以使用到了指针数组,在对活性边表排序时涉及到链表的排序,这些知识都忘了,现在捡起来。指针数组用于存储指针的数组,也就是每个元素...
  • flyfish5
  • flyfish5
  • 2015年12月01日 14:33
  • 780

指针数组、数组指针、二维数组动态分配内存

C 二维数组动态分配和释放 已知第二维 char (*a)[N];//指向数组的指针 a = (char ()[N])malloc(sizeof(char ) * m); printf(“%d\...
  • tianwei11
  • tianwei11
  • 2016年03月22日 22:59
  • 2647

没有躲过的坑--new一个指针数组、以及创建动态二维数组

实际工作中,有一个类A,现在需要使用多个A对象的指针,这是时候,首先想到的就是指针数组。———————————————————————————————————————————— 指针数组与数组指针 ...
  • wangshubo1989
  • wangshubo1989
  • 2015年11月26日 22:19
  • 4859

二维字符串指针

解决问题:使用指针,灵活控制指针关系。参考博文: 1. 二维字符数组与char** 关系 2. C语言中二维字符数组的定义和初始化思考下面代码出现的问题:void list_dir(char **...
  • bangdingshouji
  • bangdingshouji
  • 2016年10月12日 18:35
  • 1090

怎么用指针操作二维数组

本人第一次发博客,请大家多多指教 我们都知道一维数组的我们都很熟悉: int a[5] = { 1,2,3,4,5 }; int*p = a; int i, j; 这里p指针是int型指针,这里的赋...
  • chin_out
  • chin_out
  • 2017年05月10日 13:20
  • 734

指针数组,数组指针与二维数组剖析

int *p[3]与int (*p)[3]的区别 *p[3]这个是一个指针数组,它所代表的意思是数组中的每一个元素都是一个指针变量,而(*p)[3],p是一个指针变量,表示指向一个含有3个整型元素的一...
  • qiumingjian
  • qiumingjian
  • 2015年05月06日 17:24
  • 3332

一维数组,二维数组,三维数组,数组与指针,结构体数组,通过改变指针类型改变访问数组的方式

 打印数组中的每个元素,打印每个元素的地址: #include #include   void main(void) {    ...
  • toto1297488504
  • toto1297488504
  • 2014年08月01日 01:08
  • 1851
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:指针动态创建数组,二维指针处理字符数组,链表对象排序
举报原因:
原因补充:

(最多只允许输入30个字)