单链表的一系列操作

时间:2022-02-01 23:31:06
带头节点
#include<stdio.h>
#include<malloc.h>
#define bool char
#define true 1
#define false 0
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;
}