一,malloc函数简介
定义 | void* malloc (size_t size); |
作用 | 分配内存块,返回指向块开头的指针 |
参数 | 内存块的大小(以字节为单位)。 |
返回值 | 成功时,指向函数分配的内存块的指针 |
二,何时使用或不使用malloc来获取一个新的单元?
必须记住:声明指向一个结构的指针并不创建该结构,而只是给出足够的空间容纳结构可能会使用的地址。
另一方面:如果你想使用一个指针变量沿着一个表进行,那就没有必要创建新的结构。
总结一下:如果要创建一个新的节点或链表需要用malloc
如果只是指向原来的节点则不需要malloc,直接进行赋值就好。
举例:
#define ElemType int
struct Node{
ElemType data;
struct Node * next;
};
typedef struct Node * PtrNode;
1,创建新的节点或链表。
/*创建一个带空节点的初始链表*/
PtrNode initEmptyList(){
PtrNode head = malloc(sizeof(struct Node));
if ( head != NULL){
head->next = NULL;
}
return head;
}
/*把一个新节点插入到链表尾部*/
void insertEnd (PtrNode head, ElemType x){
PtrNode p, tmp, cur;
/*动态分配新节点,将新值存入*/
p = malloc(sizeof(struct Node));
if (p != NULL){
p->data = x; p->next = NULL;
/*找到尾节点,记为前驱指针tmp*/
tmp = getEnd(head) ;
/*在尾节点后链接新节点*/
tmp->next = p;
}
else printf("Not inserted. No memory avaliable.\n");
}
2, 只是指向原来的节点。
/*删除值为x的第一个节点,成功则返回1;否则返回0。*/
int deleteNode(PtrNode head, ElemType x)
{
PtrNode tmp,cur;
tmp=head;
cur=head->next;
//这里就是没有用malloc,
/*查找待删除节点,若找到,则由cur指向该节点*/
while (cur!=NULL && x != cur->data ){
tmp=cur;
cur=cur->next;
}
}