原创  动态存储分配 收藏

 1.分配内存空间函数malloc
调用形式: (类型说明符*) malloc (size) 功能:在内存的动态存储区中分配一块长度为"size" 字节的连续区域。
函数的返回值为该区域的首地址。 “类型说明符”表示把该区域用于何种数据类型。(类型说明符*)表示把返回值
强制转换为该类型指针。“size”是一个无符号数。例如: pc=(char *) malloc (100); 表示分配100个字节的内
存空间,并强制转换为字符数组类型, 函数的返回值为指向该字符数组的指针, 把该指针赋予指针变量pc。

2.分配内存空间函数 calloc
calloc 也用于分配内存空间。调用形式: (类型说明符*)calloc(n,size) 功能:在内存动态存储区中分配n块长度
为“size”字节的连续区域。函数的返回值为该区域的首地址。(类型说明符*)用于强制类型转换。calloc函数与
malloc 函数的区别仅在于一次可以分配n块区域。例如: ps=(struet stu*) calloc(2,sizeof (struct stu)); 其
中的sizeof(struct stu)是求stu的结构长度。因此该语句的意思是:按stu的长度分配2块连续区域,强制转换为stu
类型,并把其首地址赋予指针变量ps。

3.释放内存空间函数free
调用形式: free(void*ptr); 功能:释放ptr所指向的一块内存空间,ptr 是一个任意类型的指针变量,
它指向被释放区域的首地址。被释放区应是由malloc或calloc函数所分配的区域


main()
{
    struct stu
    {
        int num;
        char *name;
        char sex;
        float score;
    }*ps;
    ps=(struct stu*)malloc(sizeof(struct stu));
    ps->num=102;
    ps->name="Zhang ping";
    ps->sex='M';
    ps->score=62.5;
    printf("Number=%d\nName=%s\n",ps->num,ps->name);
    printf("Sex=%c\nScore=%f\n",ps->sex,ps->score);
    free(ps);
}

4 建立链表,删除结点,插入结点
#define NULL 0
#define TYPE struct stu
#define LEN sizeof(struct stu)

struct stu
{
    int num;
    int age;
    struct stu *next;
};

TYPE * creat(int n)
{
    struct stu *head,*pf,*pb;
    int i;
    for(i=0;i<n;i++)
    {
        pb=(TYPE *)malloc(LEN);
        printf("input Number and Age\n");
        scanf("%d%d",&pb->num,&pb->age);
        if(i==0)
            pf=head=pb;
        else
            pf->next=pb;
        pb->next=NULL;
        pf=pb;
    }
    return(head);
}

TYPE * delete(TYPE * head,int num)
{
    TYPE *pf,*pb;
    if(head==NULL)
    {   printf("\nempty list!\n");
        goto end;
    }
    pb=head;
    while (pb->num!=num && pb->next!=NULL)
    {   pf=pb;
        pb=pb->next;
    }
    if(pb->num==num)
    {
        if(pb==head)
            head=pb->next;
        else
            pf->next=pb->next;
        free(pb);
        printf("The node is deleted\n");
    }
    else
        printf("The node not been found!\n");
    end:
    return head;
}


TYPE * insert(TYPE * head,TYPE * pi)
{
    TYPE *pb ,*pf;
    pb=head;
    if(head==NULL)
    {   head=pi;
        pi->next=NULL;
    }
    else
    {
        while((pi->num>pb->num)&&(pb->next!=NULL))
        {   pf=pb;
            pb=pb->next;
        }
        if(pi->num<=pb->num)
        {   if(head==pb)
                head=pi;
               
            else
                pf->next=pi;
            pi->next=pb;
        }
        else
        {
            pb->next=pi;
            pi->next=NULL;
        }
    }
    return head;
}


void print(TYPE * head)
{
    printf("Number\t\tAge\n");
    while(head!=NULL)
    {
        printf("%d\t\t%d\n",head->num,head->age);
        head=head->next;
    }
}


main()
{
    TYPE * head,*pnum;
    int n,num;
    printf("input number of node: ");
    scanf("%d",&n);
    head=creat(n);
    print(head);
    printf("Input the deleted number: ");
    scanf("%d",&num);
    head=delete(head,num);
    print(head);
    printf("Input the inserted number and age: ");
    pnum=(TYPE *)malloc(LEN);
    scanf("%d%d",&pnum->num,&pnum->age);
    head=insert(head,pnum);
    print(head);
    getch();
}

发表于 @ 2006年11月28日 17:41:00 | 评论( loading... ) | 编辑| 举报| 收藏

旧一篇:turbo c中结构体的使用 | 新一篇:联合体的使用

  • 发表评论
  • 评论内容:
  •  
Copyright © linuxcumt
Powered by CSDN Blog