【单链表】
单链表(singly linked list):由有限个数据类型相同的元素所组成的有序集合。
单链表中的数据元素:结点(node)
结点:通常把结点定义成一个结构体,包括数据域和指针域。
数据域:存储结点的数据信息
指针域:存储下一个结点的地址
定义结点:
typedef struct node{
int data;
struct node *next;
}Node;
头结点(head):第一个结点,指针域指向下一个结点
尾结点:最后一个结点,指针域指向NULL
【注意】
插入单链表的新结点,其内存分配均采用动态内存分配方式
尾插法:新结点均被插入链尾
头结点的作用:在单链表中,每个结点只知道下一个结点的位置,不知道前一个结点的位置,故设置头结点便可以对单链表的每个结点进行访问。
如果某个创建的结点没有被连入单链表中,就会成为无人管理的结点,并一直占用内存空间。
【代码——单链表的创建、打印】
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct node{
int data;
struct node *next;
}Node;
Node *CreatLinkList(); //创建链表
void PrintLinkList(Node *head);
int main()
{
Node *p;
p=CreatLinkList(); //创建一个单链表,将链表的头结点地址赋给p
PrintLinkList(p);
return 0;
}
Node *CreatLinkList()
{
int length,i,value;
Node *tail,*pNew;
Node *head;
head = (Node *)malloc(sizeof(Node)); //创建了一个不存放有效数据的头结点
if(head==NULL){
printf("内存分配失败,程序退出!\n");
exit(-1);
}
tail = head; //tail始终指向尾结点
tail->next =NULL; //清空指针域
printf("please input the number of the node:");
scanf("%d",&length);
for(i=0;i<length;i++){
printf("请输入第%d个元素的值:",i+1);
scanf("%d",&value);
pNew = (Node*)malloc(sizeof(Node));
pNew->data = value; //向新结点中放入值
tail->next = pNew; //将尾结点指向新结点
pNew->next = NULL; //将新结点的指针域清空
tail = pNew; //将新结点赋给tail,使tail始终指向为尾结点
}
return head;
}
void PrintLinkList(Node *head)
{
Node *p = head->next;
while(p!=NULL){
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}