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

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

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

下面是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);
错!错!错!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值