C语言 利用指针和内存分配函数malloc()和free()实现动态数组的定义、使用和释放。

2024-11-28 18:20:08
推荐回答(3个)
回答1:

这个是我以前写的,,没有注释,,包括数组的创建,排序,删除,插入,,,

其实还少一个保存数据文件和载入 也就是save();load();应该很好写的,,,

你可以参考一下相应的函数,,

 

这是代码:

 

#include
#include
typedef struct p{ int a; p *next;}P;

P* create();
void show(P *h);
P* paixu(P *h);
P* insert(P *h);
P* search(P *h,int s);
P* dele(P *h);
void fre(P *h);

int main()
{

   P *head;
   head=create();
   show(head);
   head=paixu(head);
   show(head);
   head=dele(head);
   show(head);
   head=insert(head);
   show(head);
   puts("按任意键继续。。。。");
   getchar();
   fre(head);
   return 0;

}

P* create()
{
 int i;
 puts("请问你想创建几个数据的链表,请输入数字:");
 scanf("%d",&i);
 P *h,*e,*p;
 p=(P *)malloc(sizeof(P));
 h=p;
 e=p;
 int j=0;
 while(j {
  printf("请输入第 %d 个数据 :\n",j+1);
  p=(P *)malloc(sizeof(P));
  scanf("%d",&p->a);
  e->next=p;
  e=p;
  j++;
 }
 e->next=NULL;
 return h;
}

void show(P *h)
{

 P *p;
 p=h->next;
 while(p!=NULL)
 { 
  printf("%-10d",p->a);
  p=p->next;
 }
 puts("");
}

P* paixu(P *h)  //从大往小排序
{
    
 P *p1,*p2,*p3,*p;
    int flag=0;  //标志 0的是说明排序还没完成 
 while(flag!=1)
 {
           p1=h;
           p2=p1->next;
        p3=p2->next;
        while(p3!=NULL)
     {
       if((p2->a)<(p3->a))
    {
       p=p2;
       p2=p3;
       p3=p;

   p1->next=p2;
   p=p2->next;
   p2->next=p3;
   p3->next=p;
    }
        
      p1=p2;
       p2=p3;
      p3=p3->next;
     }
          p1=h;
    p2=p1->next;
      while(1)
   { 
          p1=p2;
    p2=p2->next;
    if((p1->a)<(p2->a))
    {flag=0;break;}
    if(p2->next==NULL)
    { flag=1; break;}
   }
 }
 return h;
}


P* insert(P *h)
{

    int i;
 puts("请输入你想插入的数:");
 scanf("%d",&i);
 P *in=(P *)malloc(sizeof(P));
 in->a=i;
 P *p1,*p2;
 p1=h;
 p2=p1->next;
 while(p2!=NULL)
 {
  if((in->a)>(p2->a))
        {
   p1->next=in;
   in->next=p2;
   break;
  }
  p1=p2;
  p2=p2->next;
 }
 if(p2=NULL)
 {
            p1->next=in;
   in->next=NULL;
 }
 return h;
}

P* search(P *h,int d)
{
 P *p;
 p=h->next;
 while(p!=NULL)
 {
       if((p->a)==d)  break;
    else
            p=p->next;
 }

 return p;
}


P* dele(P *h)
{
    int d;
 puts("请输入你想删除的数:");
 scanf("%d",&d);
    P *p1,*p2;
    p2=search(h,d);
    p1=h;
 while(p1->next!=p2)
 {
  p1=p1->next;
 }
    p1->next=p2->next;
 free(p2);
 return h;
}

void fre(P *h)
{
 P *p1=h,*p2=h->next;
 while(p2!=NULL)
 {
  free(p1);
  p1=p2;
  p2=p2->next;
 }
}

 

 

 这是我调试运行的结果,,

回答2:

#include
#include    //有的编译器不识别malloc,要是不识别加上这个头文件 
struct student        //定义学生类结构体
{
    char name[20];    //姓名
    int score;        //成绩
    int  rank;        //名次
};
void main()
{
    int n = 0;        //人数
     do{
        scanf("%d",&n);
        if(n>=0&&n<=100)
            break;
        else                  
            printf("输入人数有误");
    }while(1);         //防输错,若输入有错,会一直重新输入
    struct student * st = (struct student *)malloc( 
                                n * sizeof(struct student)                                     );        //开辟空间
    int i,j,t;
    printf("请按顺序输入学生姓名和成绩:\n");
    for(i=0;i    {
        scanf("%s %d",st[i].name,&st[i].score);
    }
    for(i=0;i        for(j=0;j            if(st[j].score            {
                t=st[j].score;
                st[j].score=st[j+1].score;
                st[j+1].score=t;
            }
    for(i = 0;i < n;i ++)  //排名次
    {
        if(i = 0)
            st[i].rank = 1;        //第一名
        else if(st[i].score = st[i-1].score)
            st[i].rank = st[i-1].rank;        //并列名次设定   
        else
            st[i].rank = i+1; 
     }  
    printf("名次\t\t姓名\t\t成绩\n"); //输出         
    for(i=0;i        printf("%d\t\t%s\t\t%d\n",st[i].rank,st[i].name,st[i].score);
    free(st);        //亲,不要忘了释放空间哦~~
}

 这个是我之前帮别人写的简单的成绩排名,使用了malloc和free来定义和释放一个结构体数组, 希望可以帮到你,注释都加上了,应该很好理解的~~~请采纳哦亲~~~

回答3:

这个程序应该就可以吧..改一下变量基本就符合要求呀