链表是由节点组成的,节点中包含:数据域和指针域
头指针(★):头指针的类型是struct Node *类型,指向链表的第一个节点。
链表中存储节点的内存地址是随机,我们只能依靠头指针 head->next.....->next来一个一个找到节点和遍历节点。
示例:①创建一个没有头节点的链表,用头部插入的方式插入一个节点
②用户输入链表的数据,并可以打印出链表的数据
头指针head定义成全局变量,在程序中任何地方都能访问 typedef struct node{
int data;
struct node *pNext;
}Node;
Node * head;//全局变量,存储在数据段
用函数创建一个节点:
Node * Create_Node(int value)
{
Node *temp = (Node*)malloc(sizeof(Node));//申请堆内存
if(NULL == temp){
printf("malloc error!\n");//检验堆内存是否分配成功
return NULL;
}
memset(temp,'\0',sizeof(Node));//堆内存初始化
temp->data = value;
temp->pNext = NULL;
return temp;
}
用头部插入的方式插入一个节点
1.链表为空时
Node* temp = Create_Node(int value);
temp->data = value;
temp->next = NULL;
head = temp;
2.链表不为空
temp->data = value;
temp ->next = head;
head = temp;
由于最开始全局变量head=NULL,第二种情况可以包含第一种状况。
插入节点的函数
void Insert_Beginning(int value)
{
Node* temp = Create_Node(value);
temp->data = value;
temp->pNext = head;
head =temp;
}
打印出列表中的数据
void PrintList()
{
Node *temp = head;
printf("-----链表数据-----\n");
while(NULL != temp)
{
printf("%d ",temp->data);
temp = temp->pNext;
}
printf("\n");
}
main函数
int main()
{
int n,x,i;
printf("请输入链表共有多少条数据: \n");
scanf("%d",&n);
for(i = 0 ;i<n;i )
{
printf("请输入节点的数据: \n");
scanf("%d",&x);
Insert_Beginning(x);
PrintList();
}
return 0;
}