#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返回该结点指针,如果查到了,也返回该节点指针
}