C语言中结构体指针————注意问题
以例子说明————新建一个单链表并打印表中元素:
用尾插法
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
int data;
struct node * next;
} *LinkedList; //指向结构体node的指针 可以理解为创建了一个LinkedList指针代表所有指向这个结构的指针。表示结构体指针类型
// 创建新建链表函数
LinkedList LinkedListCreat(int a[5]) // 返回指针类型
{
LinkedList p,L,tail; // 定义了三个指向结构体note的指针
L=(struct node *) malloc(sizeof(struct node)); // 分配内存空间 ,返回空间地址 转化为指针 给L
///
tail=L;
int i;
for(i=0;i<5;i++)
{
p=(struct node*) malloc(sizeof(struct node));//为每个元素分配内存空间
p->data=a[i];
tail->next=p;
p->next=NULL;
tail=p;
}
tail->next=NULL;
return L; // 返回LinkedList 指针类型。。。L指向新建的空间的第一个元素
}
//链表元素打印
void LinkedListPrint(LinkedList L) // 传入地址
{
LinkedList p;
p=L->next;
while(p!=NULL)
{
printf("%d",p->data);
p=p->next; // 修改指针
}
}
void main()
{
int a[5];
int i;
for(i=0;i<5;i++)
{
scanf("%d",&a[i]);
}
LinkedList L;
L=LinkedListCreat(a);
LinkedListPrint (L);
}
特别注意:
1.
typedef struct {...}*P; 这个指针怎么用法?
一般指向整型的指针都是如下使用的:int *p ; 指向一个整型的指针。在前面我们使用了 typedef int * Pint;则上面的声明方法,可以改为: Pint p;同样是声明一个指向整型的指针。typedef int *Pint;表示的意思并不是定义一个指向int型指针,而是表示定义一种新的数据类型,这种类型是指向int型的指针,那么如果下面有Pint a;则这时的a是指向int型指针同理typedef struct {...}*P; 表示定义一种数据类型,该类型是指向结构体的所以下面如果有P p;则p是一个指向结构体的指针
2.内存分配malloc 的使用
L=(struct node *) malloc(sizeof(stuct node));
表示新开辟的 空间 是分配了一个
node 这个结构体这么大的空间(大小取决于note,sizeof(stuct node)表示结构体空间大小 ),然后把这个空间地址转换成
node的这个指针类型,赋值给L。
(struct node *) 表示强制类型转换 ,括号内 struct node * 表示指向结构体的指针类型 。类似于LinkedList。 返回分配内存地址指针给L