数据结构c语言版单链表的查找,数据结构–单链表查找条件

在数据结构与算法中,对于单链表的查找算法有两种。

6654a1379d1826c596aa8192db190048.png

6d2cb06dded1f0868501b328669a6ba2.png

这两个算法的循环判断条件对于前半部分p表达的应该是一样意思。

P&&j

P!=null&&P->next ! e;当P不是空的时候判断后边的。

但是为什么用不同的写法呢 ?

解决方案

20

while(p)是判断指针p的值,假如p为0则假,p为非0则真;while(p!=NULL)是判断表达式(p!=NULL)的值,假如p为NULL,则表达式的值为0,即假,p不等于NULL,则表达式的值为1,即真,可以理解为:int a; a=(p!=NULL); while(a);

10

仅供参考:

//带表头结点的单向链表

#include 

#include 

#include 

#include 

struct NODE {

int          data;

struct NODE *next;

} H,*head,*p,*q,*q1,*s1,*s2,*s3,*s4,*s;

int i,j,k,n,t,m;

int main() {

srand(time(NULL));

//填写头节点数据

H.data=-1;

H.next=NULL;

head=&H;

//创建10个节点的单链表

p=head;

for (i=0;i<10;i++) {

q=(struct NODE *)malloc(sizeof(struct NODE));

if (NULL==q) return 1;

q->data=rand()%100;//填写0..99的随机值

q->next=NULL;

p->next=q;

p=q;

}

//输出整个单链表

s=head->next;

while (1) {

if (NULL==s) {

printf("\n");

break;

}

printf("%02d->",s->data);

s=s->next;

}

//将值为5的结点插入到单链表的第k个结点前

k=3;

n=0;

p=head;

while (1) {

if (NULL==p) {

break;

}

n++;

if (k==n) {

q=(struct NODE *)malloc(sizeof(struct NODE));

if (NULL==q) return 1;

q->data=5;

q->next=p->next;

p->next=q;

break;

}

p=p->next;

}

//输出整个单链表

s=head->next;

while (1) {

if (NULL==s) {

printf("\n");

break;

}

printf("%02d->",s->data);

s=s->next;

}

//删除第k个节点

k=5;

n=0;

p=head;

while (1) {

if (NULL==p) {

break;

}

n++;

if (k==n) {

q=p->next;

if (q) {

p->next=q->next;

free(q);

}

break;

}

p=p->next;

}

//输出整个单链表

s=head->next;

while (1) {

if (NULL==s) {

printf("\n");

break;

}

printf("%02d->",s->data);

s=s->next;

}

//从小到大排序

for (p=head;p!=NULL && p->next!=NULL;p=p->next) {

for (q=p->next;q!=NULL && q->next!=NULL;q=q->next) {

if (p->next->data > q->next->data) {

//交换data

//              printf("swap %02d %02d\n",p->next->data,q->next->data);

//              t=p->next->data;p->next->data=q->next->data;q->next->data=t;

//或

//交换next

//              printf("swap %02d %02d\n",p->next->data,q->next->data);

s1=p->next;

s2=p->next->next;

s3=q->next;

s4=q->next->next;

if (s2!=s3) {

p->next=s3;

s3->next=s2;

q->next=s1;

s1->next=s4;

} else {

p->next=s3;

s3->next=s1;

q=s3;

s1->next=s4;

}

//输出整个单链表

//              s=head->next;

//              while (1) {

//                  if (NULL==s) {

//                      printf("\n");

//                      break;

//                  }

//                  printf("%02d->",s->data);

//                  s=s->next;

//              }

//              getchar();

}

}

}

//输出整个单链表

s=head->next;

while (1) {

if (NULL==s) {

printf("\n");

break;

}

printf("%02d->",s->data);

s=s->next;

}

//将整个链表逆序

if (head->next!=NULL && head->next->next!=NULL) {

p=head->next;

q=p->next;

p->next=NULL;

while (1) {

q1=q->next;

q->next=p;

p=q;

q=q1;

if (NULL==q) break;

}

head->next=p;

}

//输出整个单链表

s=head->next;

while (1) {

if (NULL==s) {

printf("\n");

break;

}

printf("%02d->",s->data);

s=s->next;

}

//将单链表中前 m 个结点和后 n 个结点进行互换,m+n为链表总长10

m=4;

n=6;

k=0;

p=head;

while (1) {

if (NULL==p) {

break;

}

k++;

if (m+1==k) {

q=p;

}

s=p;

p=p->next;

}

s1=head->next;

head->next=q->next;

s->next=s1;

q->next=NULL;

//输出整个单链表

s=head->next;

while (1) {

if (NULL==s) {

printf("\n");

break;

}

printf("%02d->",s->data);

s=s->next;

}

//释放全部节点

p=head->next;

while (1) {

if (NULL==p) {

break;

}

q=p->next;

free(p);

p=q;

}

return 0;

}

//84->28->20->23->96->19->59->97->29->41->

//84->28->05->20->23->96->19->59->97->29->41->

//84->28->05->20->96->19->59->97->29->41->

//05->19->20->28->29->41->59->84->96->97->

//97->96->84->59->41->29->28->20->19->05->

//41->29->28->20->19->05->97->96->84->59->

//

40

引用:

Quote: 引用:

大部分情况下其实一样的。

但不同的环境下可能有区别:

NULL 只需要保证不是任何有效地址即可,NULL不保证实现为 0

抱歉,本人没有太明白。

也就是说其实这两个也可以写成一样的 ?

可以这样理解

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明数据结构–单链表查找条件!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值