指针:存储一个地址,确切地说是存储一个内存空间的地址。
malloc函数的作用是从内存中申请分配指定字节大小的分配空间。可以用 malloc(sizeof(int));申请。我们用指针来对这空间进行操作。用一个指针指向这个空间,即存储这个空间的首地址。
struct node *q;
p=(struct node *)malloc(sizeof(struct node));
malloc函数返回类型是 void *类型,可以强制转换为任何其他类型的指针。
ps:为什么申明指针时需要申明类型呢?
因为指针变量存储的是以恶搞内存空间的首地址(第一个字节的地址),但是这个空间占用了多少个字节,用来存储什么类型的数,则是由指针的类型来标明的。这样系统才知道应该取多少个连续内存作为一个数据。
结点的读入:
struct node *p,*q;
scanf("%d",&a);
//动态申请一个空间,用来存放一个结点,并用临时指针p指向这个结点
p=(struct node *)malloc(sizeof(struct node));//指针p获取动态内存分配的内存空间地址
//数据存储到当前结点中
p->data=a;
p->next=NULL;
if(head==NULL)head=p; //如果这是第一个创建的结点,则将头指针指向这个结点
else
q->next=p; //如果不是第一个创建的结点,则将上一个结点的后继指针指向当前结点
q=p; //指针q也要指向当前结点
题目代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <string.h>
const int max=1000;
//用结构体表示链表的结点类型
struct node{
int data;
struct node *next;
};
int main() {
struct node *head,*p,*q,*t;
int n,a;
scanf("%d",&n);
head=NULL; //头指针为空
for (int i=1; i<=n; i++) {
scanf("%d",&a);
//动态申请一个空间,用来存放一个结点,并用临时指针p指向这个结点
p=(struct node *)malloc(sizeof(struct node));//指针p获取动态内存分配的内存空间地址
//数据存储到当前结点中
p->data=a;
p->next=NULL;
if(head==NULL)head=p; //如果这是第一个创建的结点,则将头指针指向这个结点
else
q->next=p; //如果不是第一个创建的结点,则将上一个结点的后继指针指向当前结点
q=p; //指针q也要指向当前结点
}
//链表中插入数
scanf("%d",&a); //读入插入的数
t=head;//从链表头部开始遍历
while (t!=NULL) {
if (t->next->data>a) { //如果当前结点指向的下一个结点的值大于被插数,将数插入到中间用来存放新增结点
p=(struct node *)malloc(sizeof(struct node));
p->data=a;
p->next=t->next; //新增结点的后继指针指向当前结点的后继指针指向的结点
t->next=p; //当前结点的后继指针指向新增结点
break; //插入完毕退出循环
}
t=t->next; //继续下一个循环
}
//输出链表中的所有数
t=head;
while (t!=NULL) {
printf("%d ",t->data);
t=t->next;
}
printf("\n");
getchar();getchar();
return 0;
}