1.本篇应用链表:
? ? ? ?分配内存空间函数??malloc,calloc;其原型为:void*calloc(unsigned?n,unsigned?size);
? ? ? ?malloc()在堆区分配一块指定大小的内存空间,用来存放数据。这块内存空间在函数执行完成后不会被初始化,它们的值是未知的。如果希望在分配内存的同时进行初始化,请使用calloc()函数。[返回值]分配成功返回指向该内存的地址,失败则返回NULL。
? ? ? ?calloc()函数用来动态地分配内存空间并初始化为0,calloc()在内存中动态地分配num个长度为size的连续空间,并将每一个字节都初始化为0。
? ? ? ?释放内存空间函数??free;函数原型为void?free(void*p);free函数是释放之前某一次malloc函数申请的空间,而且只是释放空间,并不改变指针的值。free函数是我们再写C语言程序时常用的函数,注意free函数与malloc()函数配对使用,释放malloc函数申请的动态内存。
? ? ? ?对于free(p)这句语句,如果p是NULL指针,那么free对p无论操作多少次都不会出问题。如果p不是NULL指针,那么free对p连续操作两次就会导致程序运行错误。
? ? ? ?链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。?链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。?每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。
? ? ? ? 链表组成:头指针:存放一个地址,该地址指向第一个元素
????????结点:用户需要的实际数据和链接节点的指针
2.代码
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define LEN sizeof(struct student)
struct student
{
int num;
float score;
struct student *next;
};
struct student *creat();
void print(struct student *head);
void delete(struct student *head);
void insert(struct student *head,struct student *stud);
int n;
void main()
{
struct student *stu,*stud;
stu=creat();
printf("\n");
printf("链表有%d个数据\n",n);
print(stu);
printf("\n");
delete(stu);
printf("\n");
while(1)
{
stud=(struct student *)malloc(LEN);
printf("please enter the insert to num: ");
scanf("%d",&stud->num);
printf("please enter the insert to score: ");
scanf("%f",&stud->score);
if(stud->num==0)
break;
insert(stu,stud);
}
system("pause");
}
struct student *creat()
{
struct student *p1,*p2,*head;
p1=p2=(struct student *)malloc(LEN);
printf("please enter the num: ");
scanf("%d",&p1->num);
printf("please enter the score: ");
scanf("%f",&p1->score);
head=NULL;
n=0;
while(p1->num)
{
n++;
if(n==1)
head=p1;
else
p2->next=p1;
p2=p1;
p1=(struct student *)malloc(LEN);
printf("please enter the num: ");
scanf("%d",&p1->num);
printf("please enter the score: ");
scanf("%f",&p1->score);
}
p2->next=NULL;
return head;
}
void print(struct student *head)
{
struct student *p;
p=head;
if(head)
{
do
{
printf("\n学号为%d的成绩是:%f\n",p->num,p->score);
p=p->next;
} while (p);
}
}
void delete(struct student *head)
{
int m;
struct student *q1,*q2;
while(1)
{
printf("please enter the delete num: ");
scanf("%d",&m);
if(m==0)
break;
if(head==NULL) //判断链表是否为空
printf("空表\n");
else
{
q1=head; //链表不为空时从头结点开始
while(m!=q1->num && q1->next!=NULL)//判断被删除的结点与已有结点是否相等和结点为空时退出
{
q2=q1; //q2指向q1即q2后移一位
q1=q1->next; //q1指向下一结点即q1后移一位
}
if(m==q1->num) //判断被删除的结点与已有结点是否相等
{
if(q1==head)
head=q1->next;//删除头结点
else
q2->next=q1->next;//删除m=num的结点
printf("删除%d成功\n",m);
n=n-1; //记录链表数据
}
else
printf("找不到\n");
}
printf("链表中有%d个数据",n);
print(head); //打印删除后的链表
}
}
void insert(struct student *head,struct student *stud)
{
struct student *p1,*p2,*p0;
p1=head;
p0=stud;
if(head==NULL)
{
head=p0;
p0->next=NULL;
}
else
{
while(p0->num > p1->num && p1->next!=NULL)
{
p2=p1;
p1=p1->next;
}
if(p0->num<=p1->num)
{
if(p1==head)
head=p0;
else
p2->next=p0;
p0->next=p1;
}
else
{
p1->next=p0;
p0->next=NULL;
}
}
n++;
printf("链表有%d个数据\n",n);
print(head);
}
3.功能
? ? (1).可以实现学生信息的输入;
? ? (2).可以进行信息的添加和删除。
|