链表的C语言操作

也是跨考408备考期间自己练习的代码,试验过的,可行!!

因为是链表,所以结点定义包括指针域和数据域,定义如下

typedef int ElemType ;
typedef struct LNode{         // 定义结点
    ElemType data ;       //数据域
    LNode *next ;         //指针域
}LNode,*LinkList ;

因为不带头结点的链表相对比较困难,考研考到概率不大,所以只写了带头结点的定义

bool InitList(LinkList &L){            //带头结点链表初始化
    L=(LNode *)malloc(sizeof(LNode)) ;   //LNode*是结构体指针 和 LinkList完全等价
    L->next= nullptr ;
    return true ;
}

链表查找分为按值查找和按位查找,考验中都有涉及

void LocateElem(LinkList L ,int i){    //按位查找  找第i位元素
    LNode *p=L ;                       //指针p记录当前访问结点
    int j=0 ;
    int k ;
    while(p!= nullptr && j<i){
        p=p->next ;
        j++ ;
    }
    if(p== nullptr || j>i){         //链表p为空否则链表长度过短
        printf("nullptr\n");}		//第i个元素不存在
    else{
        k=p->data;				//取第i个元素的数据
        printf("%d\n",k);
    }

}
void GetElem(LinkList L ,ElemType x){      //按值查找   找值为x的元素
    int len=0 ;
    LNode *p=L->next ;
    while (p!= nullptr && p->data!=x){
        p=p->next ;
        len++ ;                             //计数器原理
    }
    if(p== nullptr){
        printf("nullptr\n") ;
    } else{
        printf("exist element , pos=%d\n",len) ;
    }

}

之后是插入(不是头插和尾插)和删除结点的代码   

(头插法和尾插法下次单独写)

bool ListInsert(LinkList &L,int i,ElemType x){      //一般插入结点方法 将值为x的结点插入第i位
    LNode *p=L ;
    int j=0 ;
    while(p!= nullptr && j<i-1){
        p=p->next ;
        j++ ;
    }
    if(p== nullptr){
        return false ;
    }
    LNode *s=(LNode *)malloc(sizeof(LNode)) ;
    s->data=x ;            //注意顺序  必须在 p->next=s ;之前
    s->next=p->next ;
    p->next=s ;            //注意顺序  必须在 s->data=x ;之后
    return true ;
}
void ListDelete(LinkList &L,int i,ElemType &e){     //删除第i个结点,用e返回
    LNode *p=L ;
    int j=0 ;
    while(p!= nullptr && j<i-1){
        p=p->next ;
        j++ ;
    }
    if(p== nullptr || p->next== nullptr){
        printf("not find\n") ;
        return ;
    }
    LNode *q=p->next ;
    e=q->data ;
    p->next=q->next ;
    free(q) ;
    printf("delete success\n") ;
    return ;
}

最后是打印链表定义

void PrintList(LinkList L){
    L=L->next ;
    while (L!= nullptr){
        printf("%3d" ,L->data) ;      //打在一行,空三格
        L=L->next ;
    }
    printf("\n") ;
}

 

 最后,链表综合操作代码如下:

#include <stdio.h>
#include <stdlib.h>          //malloc申请的头文件

typedef int ElemType ;
typedef struct LNode{         // 定义结点
    ElemType data ;
    LNode *next ;
}LNode,*LinkList ;

bool InitList(LinkList &L){            //带头结点初始化
    L=(LNode *)malloc(sizeof(LNode)) ;   //LNode*是结构体指针 和 LinkList完全等价
    L->next= nullptr ;
    return true ;
}

//bool InitList(LinkList &L){         //不带头结点链表初始化定义,不考
//    L=NULL ;
//    return true ;
//}

void LocateElem(LinkList L ,int i){    //按位查找  找第i位元素
    LNode *p=L ;                       //指针p记录当前访问结点
    int j=0 ;
    int k ;
    while(p!= nullptr && j<i){
        p=p->next ;
        j++ ;
    }
    if(p== nullptr || j>i){         //链表p为空否则链表长度过短
        printf("第i个元素不存在\n");}		//第i个元素不存在
    else{
        k=p->data;				//取第i个元素的数据
        printf("%d\n",k);
    }

}

void GetElem(LinkList L ,ElemType x){      //按值查找   找值为x的元素
    int len=0 ;
    LNode *p=L->next ;
    while (p!= nullptr && p->data!=x){
        p=p->next ;
        len++ ;                             //计数器原理
    }
    if(p== nullptr){
        printf("不可查\n") ;
    } else{
        printf("存在该值,在第%d位\n",len) ;
    }

}

bool ListInsert(LinkList &L,int i,ElemType x){      //一般插入结点方法 将值为x的结点插入第i位
    LNode *p=L ;
    int j=0 ;
    while(p!= nullptr && j<i-1){            //第i位下标是i-1
        p=p->next ;
        j++ ;
    }
    if(p== nullptr){
        return false ;
    }
    LNode *s=(LNode *)malloc(sizeof(LNode)) ;
    s->data=x ;            //注意顺序  必须在 p->next=s ;之前
    s->next=p->next ;
    p->next=s ;            //注意顺序  必须在 s->data=x ;之后
    return true ;
}

void ListDelete(LinkList &L,int i,ElemType &e){     //删除第i个结点,用e返回
    LNode *p=L ;
    int j=0 ;
    while(p!= nullptr && j<i-1){
        p=p->next ;
        j++ ;
    }
    if(p== nullptr || p->next== nullptr){
        printf("没有该结点") ;
        return ;
    }
    LNode *q=p->next ;
    e=q->data ;
    p->next=q->next ;
    free(q) ;
    printf("删除成功") ;
    return ;
}

void PrintList(LinkList L){
    L=L->next ;
    while (L!= nullptr){
        printf("%3d" ,L->data) ;      //打在一行,空三格
        L=L->next ;
    }
    printf("\n") ;
}


int main(){               //链表的初始化  一般插入  删除  查找(按位、按值)
    LinkList L;               //声明链表L
    InitList(L) ;         //初始化链表  建立一个头结点
    printf("********************************************************************\n") ;
    ListInsert(L,1,4) ;
    ListInsert(L,2,8) ;
    ListInsert(L,3,6) ;
    ListInsert(L,4,2) ;
    ListInsert(L,5,9) ;          //给链表赋值
    PrintList(L) ;                       //打印链表L
    printf("********************************************************************\n") ;
    GetElem(L,2) ;                //按值查找  查值为2的结点   可查
    GetElem(L,5) ;                      //查值为5的结点    查不到
    printf("********************************************************************\n") ;
    LocateElem(L,3) ;             //按位查找   查第3位结点    可查
    LocateElem(L,8) ;                       //查第8位结点   查不到
    printf("********************************************************************\n") ;
    ElemType del ;
    ListDelete(L,4,del) ;           //删除第4位元素  用del返回
    PrintList(L) ;
    ListDelete(L,5,del) ;          //若交换删除顺序,会删除两个元素
    PrintList(L) ;
    printf("********************************************************************\n") ;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值