单链表操作(带头节点)

时间:2020-03-06
本文章向大家介绍单链表操作(带头节点),主要包括单链表操作(带头节点)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
//带头节点的单链表 
#include <stdio.h>
#include <malloc.h>

typedef struct LNode{       //定义单链表 
    int data;
    struct LNode *next;
}Node , *LinkList; 

bool InitList(LinkList &);  //初始化单链表 
bool ListInsert(LinkList & , int , int);    //在指定位置插入数据 
bool Empty(LinkList);   //判断链表是否为空  
bool HListInsert(LinkList & , int , int);   //在指定节点前面插入数据  
bool RListInsert(LinkList & , int , int);   //在指定节点后面插入数据  
void output(LinkList);  //输出链表 
bool ListDelete(LinkList & , int , int &);  //删除指定位置的数据 
bool HeadInsert(LinkList , int);    //头插法 
bool TailInsert(LinkList , int);    //尾插法 
Node* GetElem(LinkList , int);      //查找指定位置的值 
int LocateElem(LinkList , int);     //查找指定的值在哪个位置 

int main(void){
    LinkList L;
    InitList(L);
    
    HeadInsert(L,5);
    HeadInsert(L,2);
    TailInsert(L,7);
    TailInsert(L,4);
    
    printf("当前单链表中的数据是:");
    output(L);
    
    printf("\n");
    Node* r = GetElem(L,3);
    printf("你要查找的值是%d",r->data);
    
    printf("\n");
    int x = LocateElem(L,7);
    printf("你要查找的值在第%d位",x);
    
    printf("\n");
    int e = -1;
    ListDelete(L,2,e);
    printf("删除的哪个元素是:%d",e);
    
    printf("\n");
    printf("当前单链表中的数据是:");
    output(L);
    
    printf("\n");
    if(Empty(L)){
        printf("当前链表为空!");
    }else{
        printf("当前链表不为空! ");
    } 
    return 0;
} 

//初始化单链表 
bool InitList(LinkList &L){
    L = (Node*)malloc(sizeof(Node));
    if(L == NULL){
        return false;
    }
    L->next = NULL;
    return true;
} 

//遍历单链表
void output(LinkList L){
    Node *p = L->next;
    while(p != NULL){
        printf("%d ",p->data);
        p = p->next;
    }
} 

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

//在指定的位置插入数据 
bool ListInsert(LinkList &L ,int i , int e){
    if(i < 1){
        return false;
    }
    Node *p = L;
    int j = 0;
    while(p != NULL && j < i-1){
        p = p->next;
        j ++;
    }
    if(p == NULL){
        return false;
    }
    Node *s = (Node*)malloc(sizeof(Node));
    s->data = e;
    s->next = p->next;
    p->next = s;
    return true;
} 

//在指定节点前面插入数据 
bool HListInsert(LinkList &L , int i , int e){
    if(i < 1){
        return false;
    }
    Node *p = L;
    int j = 0;
    while(p != NULL && j < i){
        p = p->next;
        j ++; 
    }
    if(p == NULL){
        return false;
    }
    Node *s = (Node *)malloc(sizeof(Node));
    s->data = p->data;
    p->data = e;
    s->next = p->next;
    p->next = s; 
    return true;
} 

//在指定节点后面插入数据 
bool RListInsert(LinkList &L , int i , int e){
    if(i < 1){
        return false;
    }
    Node *p = L;
    int j = 0;
    while(p != NULL && j < i){
        p = p->next;
        j ++;
    }
    if(p == NULL){
        return false;
    }
    Node *s = (Node *)malloc(sizeof(Node));
    s->next = p->next;
    p->next = s;
    s->data = e; 
}

//删除指定位置的数据 
bool ListDelete(LinkList &L , int i , int &e){
    if(i < 1){
        return false;
    }
    Node *p = L;
    int j = 0;
    while(p != NULL && j < i-1){
        p = p->next;
        j ++;
    }
    if(p == NULL || p->next == NULL){
        return false;
    }
    Node *q = p->next;
    e = q->data;
    p->next = q->next;
    free(q);
    return true;
} 

//头插法
bool HeadInsert(LinkList L , int e){
    Node *s = (Node *)malloc(sizeof(Node));
    //L->next = NULL;   //使用头插法建立单链表时需要初始化next 
    s->data = e;
    s->next = L->next;
    L->next = s;
    return true;
}

//尾插法
bool TailInsert(LinkList L , int e){
    Node *p = L;
    while(p->next != NULL){
        p = p->next;
    }
    Node *s = (Node *)malloc(sizeof(Node));
    s->next = p->next;
    p->next = s;
    s->data = e;
    return true; 
}

//查找指定位置的值 
Node* GetElem(LinkList L , int i){
    if(i < 1){
        return NULL;
    }
    Node *p = L;
    int j = 0;
    while(p != NULL && j < i){
        p = p->next;
        j ++;
    }
    return p;
}

//查找指定的值在哪个位置 
int LocateElem(LinkList L , int e){
    Node *p = L->next;
    int j = 1;
    while(p != NULL && p->data != e){
        p = p->next;
        j ++;
    }
    if(p == NULL){
        return -1;
    }else{
        return j; 
    }
}

原文地址:https://www.cnblogs.com/Timesi/p/12425972.html