链表
动态化创建一个链表:动态内存申请+模块化设计
1创建链表(创建一个表头表示整个链表)
#include<stdio.h>
#include <stdlib.h>
struct Node
{
int data; //数据域
struct Node* next; //指针域
};
struct Node* creatList()
{
struct Node*headNode=(struct Node*)malloc( sizeof (struct N) );
//动态内存申请,指针变成变量
//headNode变成了结构体变量
//变量使用前初始化
headNode->next = NULL;
return headNode
}
int main()
{
struct Node* list=creatList();
//创建链表
return 0;
}
2创建节点(用来形成新的节点)
节点——结构体变量(通过指针来表示)
struct Node*creatNode(int data)
{
struct Node*newNode = (struct Node*)malloc( sizeof (struct Node));
newNode->data = data;
newNode->next = NULL;
return newNode;
}
3插入节点
(头插法)
//插入哪个链表,插入节点的数据是多少
void insertNodeByHead(struct Node* headNode,int data)
{
struct Node* newNode = creatNode(data); //创建插入节点
newNode->next=headNode->next; //newNode的next指向headNode的next
headNode->next=newNode; //headNode的next指向newNode
}
例题:函数Creatlink()的功能是创建带头节点的单向链表,并为各个节点数据域赋0~m-1的值
#include <stdio.h>
#include <stdlib.h>
typedef struct aa
{ int data;
struct aa *next;
} NODE;
NODE *Creatlink(int n, int m)
{ NODE *h=NULL, *p, *s;
int i;
/**********found***********/
p=(NODE )malloc(sizeof(NODE)); //错误,改为p=(NODE*)malloc(sizeof(NODE);
h=p;
p->next=NULL;
for(i=1; i<=n; i++)
{ s=(NODE *)malloc(sizeof(NODE));
s->data=rand()%m; s->next=p->next;
p->next=s; p=p->next;
}
/**********found***********/
return p; //错误,改为 return h;
}
void outlink(NODE *h)
{ NODE *p;
p=h->next;
printf("\n\nTHE LIST :\n\n HEAD ");
while(p)
{ printf("->%d ",p->data);
p=p->next;
}
printf("\n");
}
void main()
{ NODE *head;
head=Creatlink(8,22);
outlink(head);
}
*补充 :-> (指向运算符)
“->”是一个整体,它是用于指向结构体子数据的指针,用来取子数据。
换种说法,如果在C语言中定义了一个结构体,然后申明一个指针指向这个结构体,那么我们要用指针取出结构体中的数据,就要用到“->”。
#include<stdio.h>
#include <stdlib.h>
struct Data
{
int a,b,c;
} ; //定义结构体
int main()
{
struct Data * p; //定义结构体指针
struct Data A = {1,2,3}; //申明变量A
int x;
p = &A; //让p指向A
x = p->a; //取出p所指向的结构题中的a的值然后将值赋给x,所以x=1
printf("%d",x);
return 0;
}
输出结果 1