链表”逻辑与“前后位置也会影响其值,有可能导致程序崩溃

#include <stdio.h>
#include <stdlib.h>
//包含了头插入和尾插入
typedef int ElemType;
// 一些易错点是赋值的左右 切记切记 仔细排查
typedef struct LNode {
    ElemType data;      //数据域
    struct LNode *next;//指针域
} LNode, *LinkList;

//输入以9999终结 3 4 5 6 7 9999
void list_head_insert(LinkList &L)//LNode*是结构体指针 其和LinkList完全等价的 LNode *&L等价于LinkList &L
{
    L = (LNode *) malloc(sizeof(LNode));//申请头节点空间,同时将头指针指向头结点
    L->next = NULL;//头节点的next赋值给NULL
    ElemType x;//scanf读取第一个要插入元素的值
    scanf("%d", &x);
    //给第一个结点申请空间,然后把读取的值放进去
    LNode *s;
    while (x != 9999) {
        s = (LNode *) malloc(sizeof(LNode));//第一个结点的数据满足要求,新建一个结点空间
        s->data = x;
        s->next = L->next;
        L->next = s;
        scanf("%d", &x);
    }
}

void liset_tail_insert(LinkList &L)
{
    L = (LNode *) malloc(sizeof(LNode));//申请头节点空间,同时将头指针指向头结点
    L->next = NULL;//头节点的next赋值给NULL
    ElemType x;//scanf读取第一个要插入元素的值
    scanf("%d", &x);
    //给第一个结点申请空间,然后把读取的值放进去
    LNode *s,*r=L;//s是新创建的指针,r是始终指向链表尾部的指针,开始创建时r也指向L
    while (x != 9999)
    {
        s=(LNode *) malloc(sizeof(LNode));
        s->data=x;
        r->next=s;
        r=s;//因为尾插法,所以r指向新增的结点
        scanf("%d", &x);//记得写scanf
    }
    r->next=NULL;//最后r尾结点的next要等于NULL
}

void print_list(LinkList L) {
    L = L->next;
    while (L != NULL) {
        printf("%3d", L->data);
        L = L->next;
    }
    printf("\n");
}

LinkList GetPosElem(LinkList L,int SearchPos)
{
    //先判断找的位置是否合法,合法则遍历查找
    if(SearchPos<0){
        return NULL;//位置不合法
    }
    if(SearchPos==0){
        return L;//返回头结点
    }
    //若不是上面两个,则查找的位置大于等于1,可以进行遍历了
    LinkList p;//新建一个结构体指针
    p=L->next;//p指向L的下一位
    int j=1;//用来辅助p
    while (p!=NULL&&j<SearchPos){
        p=p->next;//再往后移
        j++;
    }
    return p;//若p为空则返回空值,否则返回当前结点指针
}

LinkList GetValElem(LinkList L,ElemType val){
    LNode *p;
    p=L->next;
    while (p!=NULL&&p->data!=val){
        p=p->next;
    }
    return p;//如果为NULL返回该结点指针,如果查到了,也返回该节点指针
}

//头插法新建链表
int main() {
    LinkList L;//L是链表头指针,是结构体类型指针 头指针指向头节点
//    list_head_insert(L);
    liset_tail_insert(L);
    print_list(L);
    LinkList search;//用来存储拿到的某一个结点
    search=GetPosElem(L,5);
    if(search==NULL){
        printf("Sorry you search NULL position\n");//对不起,你查询的位置为空
    } else{
        printf("Success!The position data you find is %d\n",search->data);//找到了,你要找的位置的值为:
    }
    search=GetValElem(L,999);
    if(search==NULL){
        printf("Sorry don't have this value in this Linklist\n");//对不起,你查询的值为空
    } else{
        printf("Success!The data you find %d is exist\n",search->data);//恭喜你要找的元素存在
    }
    return 0;
}

 原先我用了下面的代码,发现main中调用if-else一直上面语句不执行

搜索函数 GetValElem 中有一个潜在的逻辑错误。在 while 循环中,你首先检查 p->data 是否等于 val,但是在检查之前,你并没有检查 p 是否为 NULL,这可能导致访问空指针而引发程序崩溃。你应该调整代码顺序,先检查 p 是否为 NULL,再检查 p->data 是否等于 val。这样可以避免在空指针上访问数据。

LinkList GetValElem(LinkList L, ElemType val) {
    LNode *p;
    p = L->next;
    while ( p->data != va&&lp != NULL ) {
        p = p->next;
    }
    return p; // 如果为NULL返回该结点指针,如果查到了,也返回该节点指针
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值