带头节点
typedef char ElemType;
typedef struct LNODE
{
ElemType node;
struct LNODE *next;
}LNODE;
void initlistlink(LNODE **L);
int length(LNODE *L);
void destory(LNODE **L);
bool insert(LNODE *L,int i,ElemType e);
void displistlink(LNODE *h);
bool listlinkempty(LNODE *h);
bool getelem(LNODE *h,int i,ElemType *e);
int locate(LNODE *h,char xx);
bool deletelistlink(LNODE *h,int i);
void destory(LNODE **L)
{
LNODE *h;
h = (*L)->next;
free(*L);
while(h)
{
*L = h;
h = h->next;
free(*L);
}
}
void initlistlink(LNODE **L)
{
if(!(*L))
{
*L = malloc(sizeof(LNODE));
(*L)->next = NULL;
}
}
int length(LNODE *L)//初始化只有头结点时长度为0;
{
int len = 0;
while(L->next)
{
len++;
L = L->next;
}
return(len);
}
bool insert(LNODE *L,int i,ElemType e)
{
//查找第i-1个节点。根据第i-1个节点的地址分两种情况。
int j = 0;
LNODE *q = L;
LNODE *s;
while(j < i-1 && q)
{
q = q->next;//当j时,q的含义为第j个节点的地址。q为null>>
j++; //即第j个节点不存在(即前一节点不存在>>失败)
}
if(q == NULL)
{
printf("插入失败");
return false;
}
else
{
s = malloc(sizeof(LNODE));
s->next = q->next;//如果前一节点为最后一个节点时,q->next == NULL;也满足。
q->next = s;
s->node =e;
return true;
}
}
void displistlink(LNODE *h)
{
while (h->next)
{
h = h->next;
printf("%c\n",h->node);
}
}
bool listlinkempty(LNODE *h)
{
return (h->next == NULL);
}
bool getelem(LNODE *h,int i,ElemType *e)
{
int j = 0;
LNODE *p = h;
while (j < i && p)
{
p = p->next;
j++;
}
if( p == NULL)
return false;
else
{
*e = p->node;
return true;
}
}
int locate(LNODE *h,char xx)
{
int i=1;//xx逻辑上在第i个位置。
LNODE *s = h->next;
while(s && s->node!= xx)
{
s = s->next;
i++;
}
if(s == NULL)
return (0);
else
return (i);
}
bool deletelistlink(LNODE *h,int i)
{
//查找第i-1个节点。
int j = 0;
LNODE *s = h;
LNODE *q;
while(j < i-1 && s)
{
s = s->next;
j++;
}
if(s == NULL || s->next == NULL )
{
printf("指定点不存在,无法删除");
return false;
}
else
{
q = s->next;
s->next = q->next;
free(q);
return true;
}
}
int main(void)
{
LNODE *h = NULL;
ElemType e;
initlistlink(&h);//初始化单链表h;
insert(h,1,'a');
insert(h,2,'b');
insert(h,3,'c');
insert(h,4,'d');//在表h的第i个位置插入e;i(逻辑位置);
displistlink(h);//输出链表。
printf("链表长度为%d\n",length(h));//计算链表的长度;
printf("单链表h为%s\n",listlinkempty(h)?"空":"不空");
getelem(h,3,&e);//得到第i个节点的数据。
printf("第3个元素为%c\n",e);
locate(h,'a');
printf("元素a在第%d个位置\n",locate(h,'a'));
insert(h,4,'g');
displistlink(h);//输出链表
deletelistlink(h,6);
printf("删除后的元素\n");
displistlink(h);//输出链表
destory(&h);//销毁单链表;
return 0;
}