在查找代码中出现警告 取消对NULL 指针p的引用 尚未解决 ,有知道如何解决的小伙帮可以帮忙解释下 互相学习
单链表的查询创建函数在另一个文章,本段只截取查询函数部分
void FindList(linkList L, int j,int e) {//查找数值为e在j位置
linkList p = L->next;j = 1; //j从0或1开始取决于p从头结点还是头指针开始
if (p == NULL) { printf("链表无元素"); } //判断链表是否包含元素
else {
while (p && p->data != e) { //p不为空且数据不等于e
p = p->next; //指向下一个结点
j++; //指向下一个结点
}
if (p == NULL && p->data != e) { //经上次循环退出后有两个结果
printf("该链表中不包含元素%d", e); //走到尾结点未发现e
}
else { printf("找到了元素在第%d位置", j); //找到了元素e
}
}
free(p);
}
查找元素e并返回当前位置的 主函数
int main() {
linkList L = 0;
linkList q = 0;
int arr[5] = { 1,2,3,4,5 }; //链表成员
int n= 0; //链表总共n个
int j = 0;
q=create(L, arr, n); //单链表建立
//查找第i项
FindList(q,j,5); //查找链表里是否有3,返回位置j
return 0;
}
单链表的删除(按值查找)
此代码未考虑到具有相同数值的情况,后续会增补上,删除之前可进行判断列表是否为空,为空则不需要进行,直接返回。单链表的删除核心在于将前驱结点直接与当前结点的后继节点相连。同时最后要注意到free掉 要删除的空间。
1、遍历列表,判断条件:遇到相等则停止进行下一步判断
2、判断是否有和输入数值相等的情况,有则删除并释放空间,没有则打印“未发现”
linkList DeleteList(linkList q,int j) { //删除等于j的值
linkList p=q; //设置p为头结点
linkList w= p->next; //设置w为p的前一个节点
while(w&&w->data!=j){ //w不为空且w的数据域等于j
p = w;
w = w->next; //此两步为将p和w跳向下两个结点
}
if (w->data==j) {
p->next = w->next; //前驱p指向w的后继结点
free(w); //释放空间
}
else {
printf("列表找过未发现值%d", j);
}
return q;
}
单链表的删除(按序查找)
1、遍历列表以count计数
2、判断输入数值是否在链表范围内
3、如果在范围内,删除项释放空间。如果不在打印 “输入数值不对”,
linkList DeleteList(linkList q,int j) {
linkList t = q; //t为前驱,w为当前结点
linkList w = t->next; int count = 1; //以count来计数
if (w==NULL) { //判断头结点的next域是否为空
printf("链表已经空了");
}
else {
while (w && countnext; //后移
count++;
}
if (w && count == j) { //当前位置与输入数值相等则删除
t->next = w->next;
free(w);
}
else if(w==NULL) { //当w为空时代表前驱的next域指向尾结点
printf("输入值不正确"); //表示走遍列表并为找到数值
}
}
return q;
}
单链表的插入(第j位插入某数值)链表的插入结合了链表头插法创建与删除的操作进行的步骤如下:
1、创建头结点w,计数器count;
2、遍历找到第j位(判断),
3、创建空间->输入数据域->连接节点与后继节点->连接前驱结点与后继节点
linkList AddList(linkList q, int j,int e){ //在第j位插入e
linkList w = q->next;int count = 1;
while (w&&countnext;
count++;
}
if (w&&count==j) {
if (create==NULL) {
return NULL;
}
linkList create = (linkList)malloc(sizeof(node)); //插入需要创建新的空间
create->data = e;
create->next = w->next;
w->next = create;
}
else if (w == NULL) {
printf("输入数据错误");
}
return q;
}
修改单链表值(第j位的值更改)
linkList ChangeList(linkList q, int j,int e){ //在第j位插入e
linkList Change = q->next;int count = 1;
while (Change&&countnext;
count++;
}
if (Change && count == j) {
Change->data = e; //将data域数值改为输入数值
}
else if (Change == NULL){
printf("位置不合理");
}
return q;
}



