实验9-2 空指针


实验目的:

进一步理解指针变量的作用。

实验步骤:

1.分析讨论下面程序的说法。

使用指针变量有两个步骤。

第一步:通过赋值(初始化)操作使指针变量指向某存储单元。(如int i, *pi=&i;或pi=&i;或pi=pj;等)

第二步:通过间接引用操作符使用指针变量指向的存储单元。(如printf("%d",*pi);或*pi=5;等)

2.指出并改正下面程序中的错误。

#include <stdio.h>

void main(  )

{

       float f = 2.3, *pf;

       *pf = *pf * *pf;

       printf("%f,%d\n", f, *pf);

}

3.分析下面的程序。

3.1

 #include <stdio.h>

void main( )

{

       int*pi;

       pi= 5;

}

3.2

#include <stdio.h>

void main( )

{

       int*pi;

       pi= 0;

}

3.3

#include <stdio.h>

void main( )

{

       int i;

       scanf("%d", &i);

       if(i > NULL)

              printf("%d是正数!\n", i);

       else

              printf("%d是非正数!\n", i);

}

分析:

1)3.1和3.2两个程序有何区别?

2)如何评价程序3.3?0与NULL相同吗?通常如何使用?

4.(练习9.13)已知整型指针变量pa,pb,pc分别指向整型变量a,b,c。按下面要求编程。

4.1使用指针交换a,b,c的值,使变量a,b,c按升序排列。(指针指向的对象不变,即pa一直指向a。)

4.2变量a,b,c的值不变,但pa,pb,pc指向的变量按升序排列(即pa指向值最小的变量。)
链表归并是指将两个有序链表合并成一个有序链表的过程。实验11_9的目的是通过链表归并的实现,加深对链表操作的理解和应用。 具体实现步骤如下: 1. 定义一个链表结构体Node,包含一个整型数据域和一个指向下一个节点的指针域。 2. 定义一个链表归并函数merge,输入参数为两个链表的头节点指针head1和head2,输出参数为归并后的链表头节点指针head3。 3. 在merge函数内部,定义一个临时节点指针p,将其指向头节点较小的那个链表的头节点,将头节点较大的那个链表的头节点赋值给head3。 4. 在while循环中,判断p的指针域是否为空,如果为空,则将p的指针指向头节点较大的那个链表的头节点,并将该链表的头节点指针head3赋值给p。 5. 在while循环中,判断p所指向的节点的数据域与另一个链表头节点的数据域的大小关系,将p的指针指向数据域较小的节点。 6. 在while循环结束后,将剩余的节点直接接到归并后的链表尾部。 完整代码如下: ``` #include<iostream> using namespace std; struct Node{ int data; Node* next; }; Node* merge(Node* head1,Node* head2){ if(head1==NULL) return head2; if(head2==NULL) return head1; Node* head3=NULL; Node* p=NULL; if(head1->data<head2->data){ p=head1; head1=head1->next; } else{ p=head2; head2=head2->next; } head3=p; while(head1!=NULL&&head2!=NULL){ if(head1->data<head2->data){ p->next=head1; head1=head1->next; } else{ p->next=head2; head2=head2->next; } p=p->next; } if(head1!=NULL) p->next=head1; if(head2!=NULL) p->next=head2; return head3; } int main(){ Node* head1=new Node; Node* head2=new Node; Node* p1=head1; Node* p2=head2; int n,m; cout<<"请输入第一个链表的长度:"; cin>>n; cout<<"请输入第一个链表的元素:"; for(int i=0;i<n;i++){ int x; cin>>x; Node* node=new Node; node->data=x; p1->next=node; p1=node; } cout<<"请输入第二个链表的长度:"; cin>>m; cout<<"请输入第二个链表的元素:"; for(int i=0;i<m;i++){ int x; cin>>x; Node* node=new Node; node->data=x; p2->next=node; p2=node; } Node* head3=merge(head1->next,head2->next); cout<<"合并后的链表为:"; while(head3!=NULL){ cout<<head3->data<<" "; head3=head3->next; } cout<<endl; return 0; } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值