| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 8699 人关注过本帖
标题:单链表的查找和删除
只看楼主 加入收藏
claire_0918
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2012-11-23
结帖率:0
收藏
 问题点数:0 回复次数:7 
单链表的查找和删除
#include<stdio.h>
#include<stdlib.h>

#define OK 1
#define ERROR 0

typedef int ElemType;
typedef struct LNode
{
    ElemType data;
    struct LNode* next;
}LNode,*LinkList;

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

void main()
{
    int i,k,n,value;
    LinkList 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);   
}

LinkList CreatList(int n)
{
    int i;
    LinkList L,tail,p;                     //定义头指针,尾指针,p指针
    tail=L=(LinkList)malloc(sizeof(LNode));//建立头结点
    L->next=NULL;
    tail=L;                                //用tail标记链表尾部
    printf("请输入元素的数据:\n");
    for(i=0;i<n;i++)
    {
        p=(LinkList)malloc(sizeof(LNode)); //生成新结点
        scanf("%d",&p->data);
        p->next=NULL;
        tail->next=p;                      //插入到表尾
        tail=p;                            //更新尾指针
    }
    return L;                              //返回链表的头指针
}

void ListOut(LinkList L)
{
    LinkList p=L->next;                    //使p指向第一个元素
    if(p==NULL)
        printf("该链表为空!");
    else
    {
        printf("当前单链表为:\n");
        while(p)
        {
            printf("%d  ",p->data);
            p=p->next;
        }
        printf("\n");
    }
}

void ListInsert(LinkList L,int i,ElemType value)
{
    int j=0;
    LinkList p=L,s;
    while(p&&j<i-1)
    {
        p=p->next;
        ++j;
    }
    if(!p||j>i-1)
        printf("输入有误!请确认\n");
    else
    {
        s=(LinkList)malloc(sizeof(LNode));
        s->data=value;
        s->next=p->next;
        p->next=s;
    }
}

void ListDelete(LinkList L,int i)
{
    int j=1;
    LinkList 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(LinkList L,ElemType value)
{
    LinkList p=L;
    if(p==NULL)
        printf("该单链表为空!\n");
    else
    {
        for(int i=0;p->data!=value;i++,p=p->next);
        printf("当前查找的元素为第%d个\n",i);
    }
}
删除和查找都不能报错,
如果选择删除之后,输入一个大于超出链表的位置,就不能继续运行了,
查找也是
如果把查找换成
void SearchElem(LinkList L,ElemType value)
{
    LinkList p=L->next;int i=1,j;
    if(p==NULL)
        printf("该单链表为空!\n");
    else
        for(j=1;p->next!=NULL;p=p->next,j++);
        //p=L->next;
        while(p->data!=value&&p->next!=NULL)
        {
            i++;
            p=p->next;
        }
        if(i=j+2&&p->data!=value)
            printf("找不到该元素!");
        else
            printf("当前查找的元素为第%d个\n",i);
}
输出的位置永远是0
求解!!...非常感谢!!
搜索更多相关主题的帖子: void next include 
2013-03-21 10:24
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
删除:
if(!(p->next)  ||  j >=  i-1)
    printf("输入有误!请确认\n");

查找:

你第一个查找函数没有考虑找不到的情况,会出错
第二个中 for循环使 p指到了最后一个节点,后面while当然找不到


[fly]存在即是合理[/fly]
2013-03-21 11:25
peach5460
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:武汉
等 级:贵宾
威 望:30
帖 子:2780
专家分:6060
注 册:2008-1-28
收藏
得分:0 
求解什么?
求解为什么"如果选择删除之后,输入一个大于超出链表的位置,就不能继续运行了"???

我总觉得授人以鱼不如授人以渔...
可是总有些SB叫嚣着:要么给代码给答案,要么滚蛋...
虽然我知道不要跟SB一般见识,但是我真的没修炼到宠辱不惊...
2013-03-21 11:28
peach5460
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:武汉
等 级:贵宾
威 望:30
帖 子:2780
专家分:6060
注 册:2008-1-28
收藏
得分:0 
程序代码:
void ListDelete(LinkList L,int i)
{
    int j=1;
    LinkList 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);
    }
}


    while(p->next&&j<i-1)
    {
        p=p->next;
        ++j;
    }
这是想干嘛?把联表循环了一次,啥也不干?费CPU资源啊?

我总觉得授人以鱼不如授人以渔...
可是总有些SB叫嚣着:要么给代码给答案,要么滚蛋...
虽然我知道不要跟SB一般见识,但是我真的没修炼到宠辱不惊...
2013-03-21 11:30
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
删除没改对,我再调试下


[fly]存在即是合理[/fly]
2013-03-21 11:31
claire_0918
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2012-11-23
收藏
得分:0 
回复 4楼 peach5460
找第i-1个位置呐...额,只是初学
2013-03-21 21:33
claire_0918
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2012-11-23
收藏
得分:0 
回复 2楼 azzbcc
非常感谢~删除已经对了,查找还在努力中~
2013-03-21 21:39
claire_0918
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2012-11-23
收藏
得分:0 
回复 3楼 peach5460
这个问题已经解决了,嘿嘿~谢啦~
2013-03-21 21:40
快速回复:单链表的查找和删除
数据加载中...
 
   



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

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