单链表的基本操作的实现 C++实现

定义单链表结点类型

#include<stdio.h>

//定义单链表结点类型
typedef struct LNode{
    int data; //结点的数据域
    LNode *next; //结点的指针域
}LNode, *LinkList; //LinkList为指向结构体LNode的指针类型

单链表的初始化

//单链表的初始化
void InitList(LinkList &L){
    L=new LNode;//分配一个头结点 或L=(LinkList)malloc(sizeof(LNode));
    L->next=NULL;
}

判断链表是否为空

//判断链表是否为空
bool ListEmpty(LinkList L){
    if(L->next==NULL) //判断头结点指针域是否为空
        return true;
    else
        return false; 
}

销毁单链表

//销毁单链表
void DestroyList(LinkList &L){
    LNode *p;//或LinkList p;
    while(L){
        p=L;
        L=L->next;
        delete p;
    }
}

清空单链表(只留头结点)

//清空单链表(只留头结点)
void ClearList(LinkList &L){
    LNode *p,*q;//或LinkList p,q;
    p=L->next; //p指向要删除的结点 
    while(p){
        q=p->next; //q指向要删除的下一个结点
        delete p;
        p=q;
    }
    L->next=NULL;
}

求表的长度(从首元结点开始算,头结点不算)

//求表的长度(从首元结点开始算,头结点不算)
int ListLength(LinkList L){
    int length=0;
    LNode *p;
    p=L->next;
    while(p){
        length++;
        p=p->next;
    }
    return length;
}

取值(取第i个元素)

//取值(取第i个元素)
bool GetElem(LinkList L,int i,int &e){
    LNode *p; //指针p指向当前扫描到的结点
    int j=1; //当前p指向的是第几个结点
    p=L->next; //初始化,p指向首元结点
    while(p && j<i)//向后扫描,直到p指向第i个元素或p为空
    {
        p=p->next;
        ++j;
    }
    if(!p || j>i) return false; //i值不合法i>n或i≤0
    e=p->data;
    return true;
}

 遍历

// 遍历
void PrintList(LinkList L){
    for(int i=0;i<ListLength(L);i++){
        int e;
        GetElem(L,i+1,e);
        printf("第%d个元素的值=%d\n",i+1,e);
    }    
}

按值查找---返回指向包含这个值的结点的指针

//按值查找---返回指向包含这个值的结点的指针
LNode *LocateElem(LinkList L,int e){
    LNode *p=L->next;
    //从第1个结点开始查找数据域为e的结点
    while(p && p->data!=e)
        p=p->next;
    return p; //找到后返回该结点指针,否则返回NULL
}

按值查找---返回包含这个值的结点的位置序号

//按值查找---返回包含这个值的结点的位置序号
int Locate(LinkList L,int e){
    LNode *p=L->next;
    int i=1;
    while(p && p->data!=e){
        p=p->next;i++;
    } 
    if(p) return i;
    else return -1; //没有找到返回-1
}

在第i个位置插入元素e

//在第i个位置插入元素e
bool ListInsert(LinkList &L,int i,int e){
    LNode *p=L; //p指向头结点
    int j=0;
    while(p && j<i-1){ //查找第i-1个结点,p指向该结点
        p=p->next;++j;
    }
    if(!p || j>i-1) return false; //i>n+1或i<1,插入位置不合法
    LNode *s=new LNode;
    s->data=e;
    s->next=p->next;
    p->next=s; //将新结点s连到p之后
    return true; //插入成功
}

删除第i个元素

//删除第i个元素
bool ListDelete(LinkList &L,int i, int &e){
    LNode *p=L;int j=0;
    while(p->next && j<i-1){ //查找第i-1个结点,p指向该结点
        p=p->next;++j;
    }
    if(!(p->next) || j>i-1) return false; //i>n或i<1,删除位置不合法
    LNode *q=p->next;//令q指向被删除结点
    e=q->data; //用e返回元素的值
    p->next=q->next; //改变删除结点前驱结点的指针域
    delete(q);
    return true;
}

头插法建立单链表(逆序排序)

//头插法建立单链表(逆序排序)
void CreateList_H(LinkList &L,int n){
    L=new LNode; //新建头结点
    L->next=NULL;
    for(int i=0;i<n;++i){
        LNode *p=new LNode;
        printf("请输入第%d个值:",i+1);
        scanf("%d",&p->data);
        p->next=L->next; //插入到表头
        L->next=p;
    }
}

尾插法建立单链表(顺序排序)

//尾插法建立单链表(顺序排序)
void CreateList_R(LinkList &L,int n){
    L=new LNode;//新建头结点
    L->next=NULL;
    LNode *r=L; //尾指针:最开始指向头结点,然后慢慢向后移
    for(int i=0;i<n;++i){
        LNode *p=new LNode;
        printf("请输入第%d个值:",i+1);
        scanf("%d",&p->data);
        p->next=NULL;
        r->next=p; //新结点插入到表尾
        r=p; //尾指针r指向新的尾结点
    }
}

整个程序代码

#include<stdio.h>

//定义单链表结点类型
typedef struct LNode{
    int data; //结点的数据域
    LNode *next; //结点的指针域
}LNode, *LinkList; //LinkList为指向结构体LNode的指针类型


//单链表的初始化
void InitList(LinkList &L){
    L=new LNode;//分配一个头结点 或L=(LinkList)malloc(sizeof(LNode));
    L->next=NULL;
}

//判断链表是否为空
bool ListEmpty(LinkList L){
    if(L->next==NULL) //判断头结点指针域是否为空
        return true;
    else
        return false; 
}

//销毁单链表
void DestroyList(LinkList &L){
    LNode *p;//或LinkList p;
    while(L){
        p=L;
        L=L->next;
        delete p;
    }
}

//清空单链表(只留头结点)
void ClearList(LinkList &L){
    LNode *p,*q;//或LinkList p,q;
    p=L->next; //p指向要删除的结点 
    while(p){
        q=p->next; //q指向要删除的下一个结点
        delete p;
        p=q;
    }
    L->next=NULL;
}

//求表的长度(从首元结点开始算,头结点不算)
int ListLength(LinkList L){
    int length=0;
    LNode *p;
    p=L->next;
    while(p){
        length++;
        p=p->next;
    }
    return length;
}


//取值(取第i个元素)
bool GetElem(LinkList L,int i,int &e){
    LNode *p; //指针p指向当前扫描到的结点
    int j=1; //当前p指向的是第几个结点
    p=L->next; //初始化,p指向首元结点
    while(p && j<i)//向后扫描,直到p指向第i个元素或p为空
    {
        p=p->next;
        ++j;
    }
    if(!p || j>i) return false; //i值不合法i>n或i≤0
    e=p->data;
    return true;
}

// 遍历
void PrintList(LinkList L){
    for(int i=0;i<ListLength(L);i++){
        int e;
        GetElem(L,i+1,e);
        printf("第%d个元素的值=%d\n",i+1,e);
    }    
}

//按值查找---返回指向包含这个值的结点的指针
LNode *LocateElem(LinkList L,int e){
    LNode *p=L->next;
    //从第1个结点开始查找数据域为e的结点
    while(p && p->data!=e)
        p=p->next;
    return p; //找到后返回该结点指针,否则返回NULL
}

//按值查找---返回包含这个值的结点的位置序号
int Locate(LinkList L,int e){
    LNode *p=L->next;
    int i=1;
    while(p && p->data!=e){
        p=p->next;i++;
    } 
    if(p) return i;
    else return -1; //没有找到返回-1
}

//在第i个位置插入元素e
bool ListInsert(LinkList &L,int i,int e){
    LNode *p=L; //p指向头结点
    int j=0;
    while(p && j<i-1){ //查找第i-1个结点,p指向该结点
        p=p->next;++j;
    }
    if(!p || j>i-1) return false; //i>n+1或i<1,插入位置不合法
    LNode *s=new LNode;
    s->data=e;
    s->next=p->next;
    p->next=s; //将新结点s连到p之后
    return true; //插入成功
}

//删除第i个元素
bool ListDelete(LinkList &L,int i, int &e){
    LNode *p=L;int j=0;
    while(p->next && j<i-1){ //查找第i-1个结点,p指向该结点
        p=p->next;++j;
    }
    if(!(p->next) || j>i-1) return false; //i>n或i<1,删除位置不合法
    LNode *q=p->next;//令q指向被删除结点
    e=q->data; //用e返回元素的值
    p->next=q->next; //改变删除结点前驱结点的指针域
    delete(q);
    return true;
}

//头插法建立单链表(逆序排序)
void CreateList_H(LinkList &L,int n){
    L=new LNode; //新建头结点
    L->next=NULL;
    for(int i=0;i<n;++i){
        LNode *p=new LNode;
        printf("请输入第%d个值:",i+1);
        scanf("%d",&p->data);
        p->next=L->next; //插入到表头
        L->next=p;
    }
}


//尾插法建立单链表(顺序排序)
void CreateList_R(LinkList &L,int n){
    L=new LNode;//新建头结点
    L->next=NULL;
    LNode *r=L; //尾指针:最开始指向头结点,然后慢慢向后移
    for(int i=0;i<n;++i){
        LNode *p=new LNode;
        printf("请输入第%d个值:",i+1);
        scanf("%d",&p->data);
        p->next=NULL;
        r->next=p; //新结点插入到表尾
        r=p; //尾指针r指向新的尾结点
    }
}

int main(){
    LinkList L;
    //初始化
    InitList(L);

    //尾插法建立单链表
    CreateList_R(L,5); //插入5个元素
    printf("*******************\n");

    //求表长
    printf("表的长度=%d\n",ListLength(L));
    //遍历
    PrintList(L);
    printf("*******************\n");

    //查找
    printf("值为4的结点位置序号=%d\n", Locate(L,4));
    printf("验证:值为4的结点的数据域=%d\n", LocateElem(L,4)->data);
    printf("*******************\n");

    //取值(取第i个元素)
    int e;
    GetElem(L,2,e);
    printf("第2个元素的值=%d\n",e);
    printf("*******************\n");

    //在第i个位置插入元素e
    ListInsert(L,6,6);
    printf("表的长度=%d\n",ListLength(L));
    PrintList(L);
    printf("*******************\n");

    //删除第4个元素
    int k;
    ListDelete(L,4,k);
    printf("表的长度=%d\n",ListLength(L));
    printf("被删除的第4个元素的值=%d\n",k);
    PrintList(L);

}

 

 

 

posted @ 2022-04-21 14:18  不会飞的鲨鱼  阅读(73)  评论(0编辑  收藏  举报