链表的概念及结构
概念:链表是一种物理存储结构上非连续 、非顺序的存储结构
,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。
例如,使用链表存储 {1,2,3}
图 1 链表随机存储数据
我们看到,图 1 根本无法体现出各数据之间的逻辑关系。对此,链表的解决方案是,每个数据元素在存储时都配备一个指针,用于指向自己的直接后继元素。如图 2 所示:
像图 2 这样,数据元素随机存储,并通过指针表示数据之间逻辑关系的存储结构就是链式存储结构。
如图,1的位置是当前链表的起始位置,我们称之为表头
,它里面放着的是第一个数据的地址,而2中数据p2,p2指向第二个数据的位置,第二个数据里面不仅有2,同时里面放着p3,p3指向下一个数据的位置,而4这里最后的指针指向的是NULL,也就是说链表就到这里结束。
遍历链表
struct Test{
int data;
struct Test *next;
};
用头插法创建链表
struct Test *linkHeadInsert(struct Test *phead, struct Test *new)
{
if(phead == NULL){
phead = new;
}else{
new->next = phead;
phead = new;
}
return phead;
}
用尾插法创建一个链表
struct Test *linkTailInsert(struct Test *phead, struct Test *new)
{
struct Test *p = phead;
if(p == NULL){
phead = new;
return phead;
}
while(p->next != NULL){
p = p->next;
}
p->next = new;
return phead;
}
初始化一个链表
创建一个链表需要做如下工作:
1、声明一个头指针(如果有必要,可以声明一个头节点);
2、创建多个存储数据的节点,在创建的过程中,要随时与其前驱节点建立逻辑关系;
struct Test *creatLink(struct Test *phead)
{
struct Test *new;
while(1){
new = (struct Test*)malloc(sizeof(struct Test));
printf("Input your new data:\n");
scanf("%d",&(new->data));
if(new->data == 0){
printf("0 quit!\n");
return phead;
}
phead = linkHeadInsert(phead,new);
}
}
删除链表
struct Test *deleteLink(struct Test *phead, int data)
{
struct Test *p = phead;
if(p->data = data){
phead = phead ->next;
free(p);
return phead;
}
}
查找链表
int searchLink(struct Test *phead,int data)
{
while(phead != NULL){
if(phead->data == data){
return 1;
}
phead = phead -> next;
}
return 0;
}