标题:单链表的查找和删除
取消只看楼主
claire_0918
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2012-11-23
结帖率:0
 问题点数:0 回复次数:3 
单链表的查找和删除
#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
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



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-401432-1-1.html




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

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