单链表的定义、插入、删除、查找、建立

1.定义一个单链表

typedef int ElemType;
typedef struct LNode{  //定义单链表结点类型
    ElemType data;  //每个结点存放一个数据元素
    struct LNode *next;  //定义一个next指针指向下一个结点
}LNode,*LinkList;  //Lnode==struct Lnode  LinkList==LNode*

2.初始化一个空单链表

//初始化一个带头结点的单链表
bool InitList(LinkList &L){
    L=(LNode*)malloc(sizeof(LNode));//为头结点分配空间
    if(L==NULL)
        return false;  //内存不足 分配失败
    L->next=NULL;  //头结点之后无结点 设置为空
    return true;
}

3.单链表插入

3.1 按位插入(带头结点)

//在第i个位序插入i
bool ListInsert(LinkList &L,int i,ElemType e){
    if(i<1)
        return false;//判断i是否合法
    LNode *p;  //p指向while内扫描到的结点
    int j=0;  //当前p指向的第j个结点
    p=L;  //L指向头结点 令P指向头结点
    while(p!=NULL&&j<i-1){//遍历链表 找到要存的结点i-1
        p=p->next;  //p指向下一个结点
        j++;
    }
    if(p==NULL)  //遍历到最后没找到
        return false;
    LNode *s=(LNode *)malloc(sizeof(LNode));
    s->data=e;  //将s结点的data改为e
    s->next=p->next;  //将s结点的指针指向p的指针指向的下一个结点
    p->next=s;  //将p的指针指向s
    return true;
}

3.2 按位插入(不带头结点)

//在第i个位序插入i(不带带头结点)
bool ListInsert(LinkList &L,int i,ElemType e){
    if(i<1)
        return false;//判断i是否合法
        if(i==1){
            LNode *s=(LNode*)malloc(sizeof(LNode));
            s->data=e;
            s->next=L;
            L=s;  //头指针指向新的结点
            return true;
        }
    LNode *p;  //p指向while内扫描到的结点
    int j=0;  //当前p指向的第j个结点
    p=L;  //L指向头结点 令P指向头结点
    while(p!=NULL&&j<i-1){//遍历链表 找到要存的结点i-1
        p=p->next;  //p指向下一个结点
        j++;
    }
    if(p==NULL)  //遍历到最后没找到
        return false;
    LNode *s=(LNode *)malloc(sizeof(LNode));
    s->data=e;  //将s结点的data改为e
    s->next=p->next;  //将s结点的指针指向p的指针指向的下一个结点
    p->next=s;  //将p的指针指向s
    return true;
}

3.3 指定结点的后插操作

//后插操作:在p结点之后插入元素e
bool InsertNextNode(LNode *p,ElemType e){
    if(p==NULL)
        return false;
    LNode *s=(LNode*)malloc(sizeof(LNode));
    if(s==NULL)
        return false;
    s->data=e;  //将e存入s结点
    s->next=p->next;  //s结点的指针改成p的指针
    p->next=s; //p的指针指向s结点
    return true;
}

3.4 指定结点的前插操作

//前插操作:在p结点之前插入元素e
//实际上是 后插后 交换s和p
bool InsertPriorNode(LNode *p,ElemType e){
    if(p==NULL)
        return false;
    LNode *s=(LNode*)malloc(sizeof(LNode));
    if(s==NULL)
        return false;
    s->next=p->next; //s结点的指针改为p指针
    p->next=s;  //p指向s结点
    s->data=p->data;  //将p结点的数据复制到s结点
    p->data=e;  //p结点的数据改为e
}

4.单链表的删除

4.1 按位序删除

//按位序删除
bool ListDelete(LinkList &L,int i,ElemType &e){
    if(i<1)
        return false;
    LNode *p;
    int j=0;
    p=L;  //L指向头结点 头结点不存数据
    while(p!=NULL&&j<i-1){
        p=p->next;
        j++;
    }
    if(p==NULL)
        return false;
    if(p->next==NULL)//i-1个结点后无结点了
        return false;
    LNode *q=p->next;  //令q指向被删除结点
    e=q->data;  //用e返回元素的值
    p->next=q->next;  //将*q结点从链中 断开
    free(q); //删除
    return true;
}

4.2 指定结点删除(最后一个不行)

//指定结点删除
bool DeleteNode(LNode *p){
    if(p==NULL)
        return false;
    LNode *q=p->next;
    p->data=p->next->data;
    p->next=q->next;
    free(q);
    return true;
}

5.单链表的查找

5.1 按位查找

//按位查找
LNode *GetElem(LinkList L,int i){
    if(i<0)
        return NULL;
    LNode *p;
    int j=0;
    p=L;
    while(p!=NULL&&j<i){
        p=p->next;
        j++;
    }
    return p;//返回第i个元素
}

5.2 按值查找

//按值查找
LNode *LocateElem(LinkList L,ElemType e){
    LNode *p=L->next;
    //从第一个结点开始查找数据域为e的结点
    while(p!=NULL&&p->data!=e)
        p=p->next;
    return p;
}

6.求表长

//求表长
int Length(LinkList L){
    int len=0;
    LNode *p=L;
    while(p->next!=NULL){
        p=p->next;
        len++;
    }
    return len;
}

7.单链表的建立

7.1 尾插法

LinkList List_TailInsert(LinkList &L){
    int x;
    L=(LinkList)malloc(sizeof(LNode));//建立头结点
    LNode*s,*r=L;//r为尾指针
    scanf("%d",&x);
    while(x!=9999)//输入为9999结束
    {
        s=(LNode*)malloc(sizeof(LNode));
        s->data=x;  //s结点数据域为x
        r->next=s;  //尾指针指向新结点s
        r=s;  //将尾指针设置为s
        scanf("%d",&x);
    }
    r->next=NULL; //对尾指针的指针设置为空
    return L;
}

7.2 尾插法(链表的逆置)

LinkList List_TailInsert2(LinkList &L) {
    int x;
    LNode *s;
    L = (LinkList) malloc(sizeof(LNode));//建立头结点
    L->next=NULL;  //置空
    scanf("%d",&x);
    while(x!=9999){
        s=(LNode*)malloc(sizeof(LNode));
        s->data=x;
        s->next=L->next;
        L->next=s;
        scanf("%d",&x);
    }
    return L;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值