注册 登录
编程论坛 闲聊灌水

光说不练

令狐少侠56 发布于 2015-09-24 23:36, 384 次点击
老师问
List *FindKth( int K, List *PtrL )
{     List  *p = PtrL;
       int  i = 1;
       while (p !=NULL && i < K ){
              p = p->Next;
              i++;  
       }
       if(i == K) return p;    /*找到第K个,返回指针*/
       else  return NULL;    /* 否则返回空 */
}
中的判断语句改为:
if (p==NULL) return NULL;
else return p;
或者说直接简化为:return p;
这样是否正确,讨论的人多就是没人写代码,自己写了个,虽然不知道有没有错。
程序代码:
#include<stdio.h>
#include<stdlib.h>

struct node
{
    int data;
    struct node *next;
};
typedef struct node lnode;
typedef struct node *list;

list creat()//尾插法建立带表头的链表
{
    list tempnode,head;
    list s;
    int i,N,a;//共N个元素

    printf("请输入元素个数\n");
    scanf("%d",&N);

    head=(list)malloc(sizeof(lnode));
    head->next=NULL;
    printf("请输入数据\n");

    for(i=1;i<=N;i++)
    {
        scanf("%d",&a);
        tempnode=(list)malloc(sizeof(lnode));

        tempnode->data=a;
        tempnode->next=NULL;

        if(head->next==NULL)
            head->next=tempnode;
        else
            s->next=tempnode;

        s=tempnode;   
    }
    return head;
}


//按序号查找,第K个元素
list find(int k,list head)
{
    int i=1;
    list p=head;
    while(i<k&&p->next!=NULL)//表不为空,并且未找到k
    {
        p=p->next;
        i++;
    }
    if(i==k)    return p->next;
    else return NULL;
}
//按序号查找第k个元素,第二种形式
list find_2(int k,list head)
{
    int i=1;
    list p=head;
    while(i<k&&p->next!=NULL)//表不为空,并且未找到k
    {
        p=p->next;
        i++;
    }
    if(p->next==NULL)    return NULL;
    else return p->next;
}


list find_3(int k,list head)
{
    int i=1;
    list p=head;
    while(i<k&&p->next!=NULL)//表不为空,并且未找到k
    {
        p=p->next;
        i++;
    }
    return p->next;
}


void output(list head)
{
    list s=head;
    while(s->next!=NULL)
    {   
        printf("%d ",s->next->data);
        s=s->next;
    }
    printf("\n");
}


void main()
{
    list head,s;
    int k;
    head=creat();
   
    printf("请输入查找序号\n");
    scanf("%d",&k);

    printf("输出该链表\n");
    output(head);

    s=find(k,head);
    printf("第一种查找方式输出第k个结点的数据\n");
    printf("%d\n",s->data);            //输出第k个结点的数据

    s=find_2( k,head);
    printf("第二种查找方式输出第k个结点的数据\n");
    printf("%d\n",s->data);

    s=find_3( k,head);
    printf("第三种查找方式输出第k个结点的数据\n");
    printf("%d\n",s->data);

}
8 回复
#2
诸葛欧阳2015-09-24 23:44
结果怎么样
#3
令狐少侠562015-09-24 23:45
回复 2楼 诸葛欧阳
结果是三种方法都对,我当时就觉得都对的,应该没有编错
#4
TonyDeng2015-09-27 14:08
你為什麼不測試一下單結點鏈表的情形?想當然鏈表總有多於一個結點罷了。
#5
令狐少侠562015-09-27 21:29
回复 4楼 TonyDeng
这个不是单链表吗??
#6
TonyDeng2015-09-27 21:31
我說的是單結點鏈表,當整個鏈表衹有一個結點時,會如何?
#7
TonyDeng2015-09-27 22:12
如果所要找的元素恰好是最後一個結點呢?
#8
令狐少侠562015-09-28 00:10
回复 7楼 TonyDeng
最后一个结点的情况我以前试过,可以,只有一个节点的刚刚试了一下也可以。
不过倒是出现了我没想到的情况。
只有本站会员才能查看附件,请 登录

只有本站会员才能查看附件,请 登录

只有本站会员才能查看附件,请 登录
#9
TonyDeng2015-09-30 15:05
1樓老師問代碼改成那樣行不行,事實那樣改是錯的。你前面的測試以為通了,其實是沒測試完整。學會測試,擅長測試,找到測試程序的好辦法,比學什麼高深算法都強。本來,這個問題,從邏輯思考就可以判斷那樣改是錯的,可陷阱正是讓人覺得那很巧妙,偏生就錯了,這對不願寫直接代碼的人來說是很強的警醒,希望你能從這裡學到真正的東西。
1