| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 562 人关注过本帖
标题:查找
只看楼主 加入收藏
lrx2014
Rank: 1
等 级:新手上路
帖 子:39
专家分:0
注 册:2014-4-11
结帖率:70%
收藏
已结贴  问题点数:20 回复次数:12 
查找
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
struct llist
{
    int data;

    struct llist *next;
};
typedef struct llist node;
typedef node *llink;

llink CreatList(int n);
void ListOut(llink L);
void SearchElem(llink L,int value);
void ListInsert(llink L,int i,int value);
void ListDelete(llink L,int i);

void main()
{
    int i,k,n,value;
    llink L;//定义头指针;
    do
    {
        printf("\n----------------------------------------\n");
        printf("1.创建单链表\n");
        printf("2.在i位置插入元素value\n");
        printf("3.删除第i各元素\n");
        printf("4.查找值为value的元素\n");
        printf("0.退出\n");
        printf("请输入您的选择(1,2,3,4,0)\n");
        printf("----------------------------------------\n");
        scanf("%d",&k);
        switch(k)
        {
           case 1:
               {
                   printf("请输入元素的个数:\n");
                   scanf("%d",&n);
                   printf("\n");
                   L=CreatList(n);
                   ListOut(L);
               }
               break;
           case 2:
               {
                   printf("请输入要插入的位置及元素:i,value\n");
                   scanf("%d,%d",&i,&value);
                   ListInsert(L,i,value);
                   ListOut(L);
               }
               break;
           case 3:
               {
                   ListOut(L);
                   printf("\n");
                   printf("请输入i的值:\n");
                   scanf("%d",&i);
                   ListDelete(L,i);
                   ListOut(L);
               }
               break;
           case 4:
               {
                   ListOut(L);
                   printf("请输入要查找的元素值:\n");
                   scanf("%d",&value);
                   SearchElem(L,value);
               }
               break;
           case 0:break;
           default:printf("输入有误!请重新输入!");
        }
    }while(k!=0);   
}

llink CreatList(int n)
{   
    int llist;
    int i;
    llink L,tail,p;                     //定义头指针,尾指针,p指针
    tail=L=(llink)malloc(sizeof(llist));//建立头结点
    L->next=NULL;
    tail=L;                                //用tail标记链表尾部
    printf("请输入元素的数据:\n");
    for(i=0;i<n;i++)
    {
        p=(llink)malloc(sizeof(llist)); //生成新结点
        scanf("%d",&p->data);
        p->next=NULL;
        tail->next=p;                      //插入到表尾
        tail=p;                            //更新尾指针
    }
    return L;                              //返回链表的头指针
}
void ListOut(llink L)
{
    llink p=L->next;                    //使p指向第一个元素
    if(p==NULL)
        printf("该链表为空!");
    else
    {
        printf("当前单链表为:\n");
        while(p)
        {
            printf("%d  ",p->data);
            p=p->next;
        }
        printf("\n");
    }
}
void ListInsert(llink L,int i,int value)
{
    int j=0;
    int llist;
    llink p=L,s;
    while(p&&j<(i-1))
    {
        p=p->next;
        ++j;
    }
    if(!p||j>(i-1))
        printf("输入有误!请确认\n");
    else
    {
        s=(llink)malloc(sizeof(llist));
        s->data=value;
        s->next=p->next;
        p->next=s;
    }
}
void ListDelete(llink L,int i)
{
    int j=1;
    llink p=L,temp;
    while(p->next&&j<(i-1))
    {
        p=p->next;
        ++j;
    }
    if(!(p->next)||j>(i-1))
        printf("输入有误!请确认\n");
    else
    {
        for(;p->next&&j<i;p=p->next,j++);
        temp=p->next;                         //保存要删除的结点位置
        p->next=temp->next;
        free(temp);
    }
}
void SearchElem(llink L,int value)
{
    llink p=L;
   
    int i;
    if(p==NULL)
        printf("该单链表为空!\n");
    else
    {
        for(i=0;p->data!=value;i++,p=p->next);
        printf("当前查找的元素为第%d个\n",i);}
}
搜索更多相关主题的帖子: include 
2014-06-07 13:25
lrx2014
Rank: 1
等 级:新手上路
帖 子:39
专家分:0
注 册:2014-4-11
收藏
得分:0 
這個程序的問題是插入不能實現,並且查找不完全,如輸入1 2 2 3 3,我查找2,它只找到第二個位置,第三個位置也是2啊。為什麼沒找出?求指點。
2014-06-07 13:27
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:14 
以下是引用lrx2014在2014-6-7 13:27:51的发言:

這個程序的問題是插入不能實現,並且查找不完全,如輸入1 2 2 3 3,我查找2,它只找到第二個位置,第三個位置也是2啊。為什麼沒找出?求指點。

你有让它继续找吗?

授人以渔,不授人以鱼。
2014-06-07 13:31
lrx2014
Rank: 1
等 级:新手上路
帖 子:39
专家分:0
注 册:2014-4-11
收藏
得分:0 
回复 3 楼 TonyDeng
就是想讓它繼續找,加個for循環跑不了,該怎麼做呢?還有插入的是什麼原因呢?
2014-06-07 13:34
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
继续找,当然是遍历整个链表咯。你没说插入有问题。

授人以渔,不授人以鱼。
2014-06-07 13:36
lrx2014
Rank: 1
等 级:新手上路
帖 子:39
专家分:0
注 册:2014-4-11
收藏
得分:0 
回复 5 楼 TonyDeng
有問題啊,你能提示下查找在哪裡改嗎?這不算告訴我答案吧。。。
2014-06-07 13:44
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
有两种改法:第一种,在查找函数中改,由于你需要查出所有符合条件的记录,而非找到第一个就了事,所以必须考虑到返回多个数据的情形,则该函数就不能仅仅是返回刚找到那个记录的,必须返回一个数组。第二种,在调用函数中改,用循环,要求查找函数从当前指针的下一个记录开始查,而不是总从头开始。

授人以渔,不授人以鱼。
2014-06-07 13:50
lrx2014
Rank: 1
等 级:新手上路
帖 子:39
专家分:0
注 册:2014-4-11
收藏
得分:0 
回复 7 楼 TonyDeng
多謝指點,那個插入的,你沒告訴我錯哪了?
2014-06-07 13:54
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
插入有问题,你没描述具体是什么问题,怎么可能替你全面检查有什么问题,直接说清楚,省别人的时间也省自己的时间。其实插入就跟构建链表是一样的,插入不行,肯定构建部分也是不大了了,才会出问题。不管是追加还是插入,调试的方法就是,一旦数据发生变动,就用ListOut()把链表数据输出来看看对了没有,不对写到对为止。

授人以渔,不授人以鱼。
2014-06-07 13:54
lrx2014
Rank: 1
等 级:新手上路
帖 子:39
专家分:0
注 册:2014-4-11
收藏
得分:0 
比如我輸入123456,我想再第二個位置插入4,結果應該是1423456,但4跑出來是亂碼。
2014-06-07 14:01
快速回复:查找
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.038347 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved