链表是一种线性表,链表的物理储存结构是用一组地址任意的存储单元存储数据的(将存储单元分散在内存的任意地址上)。在链表结构中,每个数据元素记录都存放到链表的一个结点(node)中,每个结点由指针连接。
链表的每个结点可以是一个结构体类型元素,也可是其他构造类型元素。在链表的每个结点中,有一个存放地址(指针)的域。一条链表通常有一个指针变量作为“表头”,用来存放第一个结点地址;最后一个结点指向“NULL"作为尾结点。
逻辑连续,但物理上并不一定连续。
链表的建立
#include"stdio.h" #include"stdlib.h" /* 创建结点 */ typedef int ElemType; typedef struct node{ ElemType data; struct node *next; }LNode,*LinkList; //将struct node 定义为LNode类型,即每个结点类型为LNode LinkList GreatLinkList(int n ){ //建立一个长度为n的链表 LinkList p,r,list = NULL; ElemType e; int i ; for(i = 1; i <= n; i++){ scanf("%d",&e); //输入每个结点的内容 p = (LinkList)malloc(sizeof(LNode)); //动态内存分配一块大小为LNode的空间,并将其地址赋给 p p->data = e; //数据e被存入结点数据域data p->next = NULL; //指针域存放NULL if(!list) //判断list是否为空,若为空,则说明本次生成的结点为第一个结点 list = p; //将p赋值给list else r->next = p; //????? r = p; } return list; //list为头指针,指向第一个链表结点,所以返回list } int main() { int e,i; LinkList l,q; q = GreatLinkList(3); while(q) { printf("%d ",q->data); q = q->next; } }(有点不理解r ->next = p 这一块)