单链表(有无头节点)的简单实现

以下注释部分均为个人经验,与各位分享,有错误请批评指正

不带头节点的情况(该部分只提关键的,完全部分请看带头节点的):

#include <iostream>
#include <stdio.h>
#include <stdlib.h>

//.是直接使用结构体名的时候才可以使用
//->是使用*结构体名(也就是给这个结构体赋予了节点的能力)的时候才可以使用
//&要对表进行更改,&必须要到位,之前出现没有&也能使用的情况纯属bug
// 单链表
//定义
typedef  int  Elemtype;
typedef struct LNode{
    Elemtype data;
    struct LNode *next;
}LNode,*LinkList;

//不带头节点的函数
bool InitList(LinkList &L){
    L=NULL;
    return true;
}


//判断列表是否为空
bool Empty(LinkList L){
    if (L==NULL)
        return true;
    else
        return false;
}

//指定节点后插插入
bool InserNextNode(LNode *p,Elemtype e){
    if(p==NULL)
        return false;
    LNode *s = (LNode*)malloc(sizeof(LNode));//此处经过实验,可以将LNode全部变成LinkList
    if (s==NULL)
        return false;
    s->next = p->next;
    s->data = e;
    p->next = s;
    return true;
}

//按位序插入
bool ListInser(LinkList &L,int i,Elemtype e){
    if(i<1)
        return false;
    if(i==1){
        LNode *s = (LNode*)malloc(sizeof(LNode));
        s->data = e;
        L = s;
        return true;
    }
    LNode *p;
    int j=0;
    p = L;
    while (p!=NULL && j<i-1) {
        p = p->next;
        j++;
    }
    return InserNextNode(p, e);
}

int main(){
    LinkList L;
    
    InitList(L);
    ListInser(L, 1, 1);
    ListInser(L, 2, 2);
    ListInser(L, 3, 3);
    ListInser(L, 4, 4);
    printf("%d\n",Empty(L));
 

  
}

带头节点的情况:(部分验证还未完成,大家可以尽情尝试)

#include <iostream>
#include <stdio.h>
#include <stdlib.h>

//.是直接使用结构体名的时候才可以使用
//->是使用*结构体名(也就是给这个结构体赋予了节点的能力)的时候才可以使用
//&要对表进行更改,&必须要到位,之前出现没有&也能使用的情况纯属bug
// 单链表
//定义
typedef  int  Elemtype;
typedef struct LNode{
    Elemtype data;
    struct LNode *next;
}LNode,*LinkList;



bool InitList(LinkList &L);//带头节点的初始化
LNode *GetElem(LinkList L,int i);//按位置查找
bool Empty(LinkList L);//判断列表是否为空
bool InserNextNode(LNode *p,Elemtype e);//指定节点后插插入(该部分在有无头节点的情况下都可以存在)
bool ListInser(LinkList &L,int i,Elemtype e);//按位序插入
bool InsertPriorNode(LinkList p,Elemtype e);//指定节点的前插操作
bool ListDelete(LinkList &L,int i,Elemtype &e);//按位序删除
bool DeleteNode(LNode *p);//删除指定的节点(无返回已经删除的值)
LNode *LocateElem(LinkList L,Elemtype e);//按值查找指定节点
int ListlLength(LinkList L);//求表的长度


//带头节点的函数
//带头节点的的初始化
bool InitList(LinkList &L){
    L=(LNode*)malloc(sizeof(LNode));
    if (L==NULL)
        return false;
    L->next=NULL;
    return true;
}


//按位置查找
LNode *GetElem(LinkList L,int i){
    
    if(i<0){
        printf("出错了\n");
        return NULL;
    }
    LNode *p;
    int j=0;
    p=L;
    while (p!=NULL && j<i) {
        p = p->next;
        j++;
    }
//    printf("1\n");
//    printf("%d\n",p);
    return p;
}


//判断列表是否为空
bool Empty(LinkList L){
    if (L->next==NULL)
        return true;
    else
        return false;
}

//指定节点后插插入(该部分在有无头节点的情况下都可以存在)
bool InserNextNode(LNode *p,Elemtype e){
    if(p==NULL)
        return false;
    LNode *s = (LNode*)malloc(sizeof(LNode));//此处经过实验,可以将LNode全部变成LinkList
    if (s==NULL)
        return false;
    s->next = p->next;
    s->data = e;
    p->next = s;
    return true;
}


//按位序插入
bool ListInser(LinkList &L,int i,Elemtype e){
    if(i<1)
        return false;
    LNode *p;
//    int j=0;
//    p = L;
//    while (p!=NULL && j<i-1) {
//        p = p->next;
//        j++;
//    }
    p = GetElem(L,i-1);
//    printf("%d\n",p);
    return InserNextNode(p, e);
}



//指定节点的前插操作
bool InsertPriorNode(LinkList p,Elemtype e){
    if (p==NULL)
        return false;
    LNode *s = (LNode*)malloc(sizeof(LNode));
    if (s==NULL)
        return false;
    s->data = p->data;
    s->next = p->next;
    p->data = e;
    p->next = s;
    return true;
}

//按位序删除
bool ListDelete(LinkList &L,int i,Elemtype &e){
    if(i<1)
        return false;
    LNode *p;
//    p=L;
//    int j=0;
//    while (p!=NULL && j<i-1) {
//        p = p->next;
//        j++;
//    }
    p = GetElem(L, i-1);
    if(p==NULL)
        return false;
    if(p->next==NULL)
        return false;
    LNode *q = (LNode*)malloc(sizeof(LNode));
    
    q=p->next;
    p->next=q->next;
    e=q->data;
    free(q);
    return true;
    
}


//删除指定的节点(无返回已经删除的值)
bool DeleteNode(LNode *p){
    if (p==NULL)
        return  false;
    LNode *q = (LNode*)malloc(sizeof(LNode));
    q=p->next;
    p->data = q->data;//课本可能是为了更好的理解,所以我将p->next->data改成q->data
    p->next = q->next;
    free(q);
    return true;
}

//按值查找指定节点
LNode *LocateElem(LinkList L,Elemtype e){
    LNode *p = L->next;//没有头节点的请注意
    while (p!=NULL && p->data!=e) {
        p=p->next;
    }
    return p;
}
//求表的长度
int ListlLength(LinkList L){
    int len=0;
    LNode *p =L;
    while (p->next!=NULL){
        p=p->next;
        printf("值为:%d\n",p->data);
        len++;
    }
    
    return len;
}

//查看表内所有值


int main(){
    LinkList L;
    LNode *p;
    InitList(L);
    printf("%d\n", ListInser(L, 1, 1));
    ListInser(L, 2, 2);
    ListInser(L, 3, 3);
    ListInser(L, 4, 4);
    printf("%d\n",Empty(L));
    
    printf("%d\n",ListlLength(L));
    //验证前插操作
    p=LocateElem(L, 2);
    InsertPriorNode(p, 10);
    printf("表的长度为%d\n",ListlLength(L));
    
    //验证删除
    Elemtype e;
    ListDelete(L, 2, e);
    printf("表的长度为%d\n",ListlLength(L));
    
    //验证按值获取节点,按值删除节点
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值