本文将我学习链表的过程加以总结,将遇到的问题进行记录汇总,便于今后复习
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ERROR 0
#define OK 1
#define TRUE 1
#define FALSE 0
typedef int status;
typedef int elemtype;
//创建链表
struct node
{
elemtype data;
struct node *next;
}node;
typedef struct node* linklist;
//初始化链表
status initlink(linklist *l)
{
(*l)=(linklist)malloc(sizeof(node));//(linklist)将泛型指针转换为指向节点的指针
if(!(*l))
return ERROR;//分配内存时,一定要检查是否成功分配,否则容易超内存
(*l)->next=NULL;//头节点
return OK;
}
//访问链表中的元素
status visit(elemtype c)
{
printf("%d ",c);
return OK;
}
// 返回l中元素个数
status listlength(linklist *l)
{
int count;
linklist p=(*l)->next;
while(p)
{
count++;
p=p->next;
}
return count;
}
//判断是否为空
status listempty(linklist *l)
{
linklist p=(*l)->next;
if(!p)
return TRUE;
else
return FALSE;
}
//清空l
status clearlist(linklist *l)
{
linklist p=(*l)->next,q;
while(p)
{
q=p->next;//q先记录p的后继节点,否则直接free(p)链表的后继节点将全部丢失
free(p);
p=q;//最后将后继节点赋值给p,循环往复直到表尾
}
(*l)->next=NULL;//最后记得将头节点置空
}
//用k返回链表第i个元素的值
status getelem(linklist l,int i,elemtype k)
{
int j=1;
linklist p=l->next;
while(p&&j<i)
{
p=p->next;
j++;
}
if(!p||j>i)
return ERROR;
k=p->data;
return k;
}
//返回第一个值为k的元素的位序
status locateelem(linklist l,elemtype k)
{
linklist p=l->next;
int i=1;
while(p)
{
if(p->data==k)
return i;
i++;
p=p->next;
}
if(!p)
return ERROR;
}
// 在链表的第i个位置插入元素k
status listinsert(linklist