就快要参加考核了,总结一下学的链表内容,加深记忆,,啊啊啊,为什么考核呢,我还是个宝宝。
静态链表
把线性表的元素存放在数组中,这些元素通过逻辑关系来进行连接。数组单元存放链表结点,结点的链域(链就是代表指针,是下一元素的地址,链表中一个结点可以分为两个部分,一个指针域用来存放指针,另一个数据域用来存放数据。单链表中一个指针域存放一个指针,双链表中两个指针域存放一个指针)指向下一个元素的位置,及下一个元素所在的数组单元的下标。
优点,可以方便的进行大量的删除和插入工作。
单向链表(单链表)
链接方向是单向的,对链表的访问要通过顺序读取从头部开始。
由于链表的每个结点都包含数据域和指针域,即每个节点都要包含不同类型的数据,所以节点的数据类型必须选用结构体类型,其中必须有一个成员是指向本结构体类型的指针类型。类型定义中,经常会采用递归调用。
struct film{ char title[TSIZE]; int rating; struct film*next; //指向链表中的下一个结构 };
struct film{ char title[TSIZE]; int rating; struct film*next; //指向链表中的下一个结构 };
这就是两个创建示例。
struct film{
char title[TSIZE];
int rating;
struct film*next; //指向链表中的下一个结构
};
int icount; //全局变量表示链表的长度
struct student *create()
{
struct student *phead=NULL; //初始化链表为空
struct student *pend,*pnew;
icount=0; //初始化链表长度
pend=pnew=(stuct student*)malloc(sizeof(struct student)); //动态为节点分配内存
scanf("%d",pnew->cname);
scanf("%d",&pnew->inumber); //这里要用到取地址符因为不是读取到数组里
while(pnew->inumber)
{
icount++;
if(icount==1) //从头开始创建这个链表,此时是头结点
{
pnew->next=phead; //是指针指向为空
pend=pnew; //跟踪新加入的节点
phead=pnew; //头指针指向首节点
}
else
{
pnew->next=NULL; //新节点的指针为空
pend->next=pnew; //原来的结点指向新节点
pend=pnew; //pend指向新节点
}
pnew=(struct student *)malloc(sizeof(struct student)); //再次分配节点的内存空间
scanf("%s",pnew->cname);
scanf("%d",&pnew->inumber);
}
free(pnew);
return phead; //释放节点空间
} _________静态链表的创建
循环的单向链表在查找一个元素的时候,每次都需要从头开始遍历,循环单向链表从任意一个元素开始,都可以循环找到每一个元素。那么怎样判断有没有循环呢?可参考如下的代码:
bool isloop(node *h) { node *p=h; node *q=h->next; while(p&&q&&q->next&&p!=q) { p=p->next; q=q->next->next; } if(p==q) { return true; } }
//如果是循环链表,p,q就能够相遇。