数据结构-线性表-单链表

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cyzyfs/article/details/78032578

单链表定义

单链表:具有指向下一个节点的结构体.

功能描述

  • 创建新链表
  • 获取长度
  • 按索引查找
  • 按值查找
  • 删除某节点
  • 更改某结点值
  • 向后添加一个结点
  • 显示所有结点内容

代码实现

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

typedef struct LNode{
    int num;
    LNode * next;
};
//创建链表
LNode * creatLNode(){
    LNode * lNode=(LNode *)malloc(sizeof(LNode));
    lNode->next=NULL;
    return lNode;
}
//获取长度
int lengthLNode(LNode *L){
    int i=0;
    LNode *lNode=L;
    while(lNode->next!=NULL){
        lNode=lNode->next;
        i++;
    }
    return i+1;//之所以+1,因为指针指向最后一个元素,但i没用自增,故+1
}
int getLenth(LNode *L){
    int length=0;
    LNode *p=L;
    while (p){
        p=p->next;
        length++;
    }
    return length;
}
//向后添加一个结点
bool addLnode(LNode * L,int num){
    LNode * last=L;
    LNode * lnode=(LNode *)malloc(sizeof(LNode));
    lnode->num=num;
    lnode->next=NULL;
    while (last->next!=NULL){
        last=last->next;
    }
    last->next=lnode;
    return true;
}
//查找 通过索引值
LNode * findNodeByIndex(LNode *L,int index){
    LNode *p=L;
    int i=0;
    while (p!=NULL&&i<index){
        p=p->next;
        i++;
    }
    if(i==index)return p;
    else return NULL;
}
//查找 通过值
LNode *findLNodeByValue(LNode *L,int value){
    LNode *p=L;
    while(p){
        if(p->num==value){
            return p;
        }
        p=p->next;
    }
    return NULL;
}
LNode * findLNodeByV2(LNode *L, int value){
    LNode *p=L;
    while (p!=NULL&&p->num!=value){
        p=p->next;
    }
    return p;
}
//插入 索引值为插入结点
//存在插入头结点的情况,故以返回值形式的函数
LNode* insert(LNode *L,int index,int num){
    LNode* p;
    LNode *newL=(LNode *)malloc(sizeof(LNode));
    newL->num=num;
    if (index==0){
        newL->next=L;
        return newL;
    }
    //获取前结点
    p=findNodeByIndex(L,index-1);
    //判断是否为空
    if (p=NULL){
        return NULL;
    }
    //进行插入操作
    newL->next=p->next;
    p->next=newL;
    return L;
}
//修改某节点值
bool changeValueByIndex(LNode *L,int index, int value){
    if (index<0||index>getLenth(L)){
        return false;
    }
    LNode * p=findNodeByIndex(L,index);
    p->num=value;
    return true;
}
//删除某结点 存在删除头结点,故用函数返回值方式返回链表
LNode * delNodeByIndex(LNode *L,int index){
    if (index==0){
        LNode *p=L;
        p=p->next;
        free(L);
        return p;
    }
    LNode * p1=findNodeByIndex(L,index-1);
    if (p1==NULL||p1->next==NULL){
        return NULL;
    }
    LNode *p2=p1->next;
    p1->next=p2->next;
    free(p2);
    return L;
}

//显示所有节点内容
void showAllLNode(LNode *L){
    LNode * lNode=L;
    while(lNode){
        printf("%d\t",lNode->num);
        lNode=lNode->next;
    }
    printf("\n");
}
int main(){
    LNode *lNode=creatLNode();
    for (int i = 0; i <10 ; i++) {
        addLnode(lNode,i);
    }
    LNode *head=findNodeByIndex(lNode,0);
    changeValueByIndex(lNode,0,-1);
    lNode=delNodeByIndex(lNode,5);
    showAllLNode(lNode);

    return 0;
}

猜你喜欢

转载自blog.csdn.net/cyzyfs/article/details/78032578