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

来源:互联网 发布:app直播源码下载 编辑:程序博客网 时间:2024/06/05 08:00

单链表定义

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

功能描述

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

代码实现

#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;}
原创粉丝点击