| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 490 人关注过本帖, 1 人收藏
标题:链表问题
只看楼主 加入收藏
lxh30907
Rank: 1
等 级:新手上路
帖 子:22
专家分:9
注 册:2010-12-15
结帖率:60%
收藏(1)
已结贴  问题点数:20 回复次数:9 
链表问题
为什么会出现有乱码的呢?而且输出也有问题。。
求高手解答

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct student
{
    char name[20];
    char sno[13];
    int mark;
 }student;

typedef struct Node
{
    student studentInfo;
    struct Node *next;
}LinkList;

LinkList *input()
{
    LinkList *s;
    s=(LinkList *)malloc(sizeof(LinkList));
    s->next=0;
    return s;
}

void insert(LinkList *stu,LinkList *stulist)
{
    LinkList *pointer = stulist;
    LinkList *stupointer =stulist->next;

    while(stupointer!=0&& stupointer->studentInfo.mark<=stu->studentInfo.mark)
    {
        pointer =stupointer;
        stupointer=stupointer->next;
    }
    pointer->next=stu;
    stu->next =stupointer;
}



int search(LinkList *L, char sno[13])
{

    LinkList *S = L,*P;
    while(S && (strcmp(S->studentInfo.sno, sno) != 0))
       S = S->next;
    if(!S->next)
        printf("NO FIND!\n");
    else
    {
        P = S->next;
        S->next = P->next;
        free(S);
    }
    return 0;
}

void main()
{
    LinkList *stulist,*stu,*stupointer;
    stulist=input();
    stu=(LinkList *)malloc(sizeof(LinkList));
    printf("插入3个学生");
    strcpy(stu->studentInfo.sno,"001");
    strcpy(stu->studentInfo.name,"张1");
    stu->studentInfo.mark=90;
    stu->next=0;
    insert(stu,stulist);

    stu=(LinkList *)malloc(sizeof(LinkList));
    strcpy(stu->studentInfo.sno,"002");
    strcpy(stu->studentInfo.name,"张2");
    stu->studentInfo.mark=85;
    stu->next=0;
    insert(stu,stulist);

    stu=(LinkList *)malloc(sizeof(LinkList));
    strcpy(stu->studentInfo.sno,"003");
    strcpy(stu->studentInfo.name,"张3");
    stu->studentInfo.mark=87;
    stu->next=0;
    insert(stu,stulist);
    stupointer=stulist;

    while(stupointer!=0)
    {
        printf("%s,%s,%d\n",stupointer->studentInfo.sno,stupointer->studentInfo.name
                            ,stupointer->studentInfo.mark);

        stupointer=stupointer->next;
    }
    printf("\n");

    printf("删除一个学号为001的学生后:\n");
    search(stu,"001");
    while(stupointer!=0)
    {
        printf("%s,%s,%d\n",stupointer->studentInfo.sno,stupointer->studentInfo.name
                            ,stupointer->studentInfo.mark);

        stupointer=stupointer->next;
    }

}

搜索更多相关主题的帖子: return 
2011-04-17 14:16
死不了的恨
Rank: 2
来 自:淮北
等 级:论坛游民
帖 子:16
专家分:54
注 册:2011-4-11
收藏
得分:5 
你在input函数中未对s进行初始化。
input()函数应改为
LinkList *input()
{
    LinkList *s;
    s=(LinkList *)malloc(sizeof(LinkList));
    if(!s)
        exit(OVERFLOW);
    s->studentInfo.name[0]='\0';
    s->studentInfo.sno[0]='\0';
    s->studentInfo.mark=0;
    s->next=NULL;
    return s;
}

天行鉴,君子以自强不息。
2011-04-18 09:28
死不了的恨
Rank: 2
来 自:淮北
等 级:论坛游民
帖 子:16
专家分:54
注 册:2011-4-11
收藏
得分:0 
另外,你在执行删除操作时,search()函数里面的判断语句
if(!S->next)
        printf("NO FIND!\n");
判断有误。
删除操作执行后,要想输出学生信息,应重新将stupointer指针指向你删除后的链表!

天行鉴,君子以自强不息。
2011-04-18 09:31
cxinshou999
Rank: 1
来 自:南京
等 级:新手上路
帖 子:15
专家分:3
注 册:2011-4-15
收藏
得分:0 
  
2011-04-18 09:36
w123012306
Rank: 9Rank: 9Rank: 9
来 自:湖南
等 级:蜘蛛侠
威 望:4
帖 子:307
专家分:1180
注 册:2010-4-22
收藏
得分:2 
注意链表的开头和结尾!

楼上,楼下的一定要幸福开心哦!
2011-04-18 09:43
lxh30907
Rank: 1
等 级:新手上路
帖 子:22
专家分:9
注 册:2010-12-15
收藏
得分:0 
回复 2楼 死不了的恨
似乎不是这里出问题的
2011-04-18 11:41
lxh30907
Rank: 1
等 级:新手上路
帖 子:22
专家分:9
注 册:2010-12-15
收藏
得分:0 
回复 3楼 死不了的恨
    printf("删除学号为002学生后:\n");
    search(stu,"002");
    stupointer = stulist->next;

    while(stupointer!=0)
    {
        printf("%s,%s,%d\n",stupointer->studentInfo.sno,stupointer->studentInfo.name
                            ,stupointer->studentInfo.mark);

        stupointer=stupointer->next;

我加了这句后能显示输出,但他不能按输入的学号删除
//删除功能
int search(LinkList *L, char sno[13])
{

    LinkList *S = L, *P;
    while(S && (strcmp(S->studentInfo.sno, sno) != 0))
       S = S->next;
    if(!S->next)
        printf("NO FIND!\n");  
    else
    {
        P = S->next;
        S->next = P->next;
        free(P);

    }
    return 0;
}
2011-04-18 11:53
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:0 
====

[ 本帖最后由 voidx 于 2011-4-18 12:47 编辑 ]
2011-04-18 12:39
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:13 
程序代码:
int search(LinkList *L, char sno[13])
{

    //LinkList *S = L,*P;    // S表示要被删除的元素,P表示他的前一个元素,应该像下面那样写:
    LinkList *P = L, *S = P->next;
    while(S && (strcmp(S->studentInfo.sno, sno) != 0)) {
        P = S;    // 记录被删除元素前一个元素的位置
        S = S->next;
    }
    //if(!S->next)    //这个是错的
    if (!S)
        printf("NO FIND!\n");
    else
    {
        //P = S->next;
        //S->next = P->next;
        P->next = S->next;    // 删除元素 S
        free(S);
    }
    return 0;
}

// 在 main() 里:
search(stu,"001");    //楼主太粗心了,居然传递了错误的参数
search(stulist, "001");
// 还有,链表 stulist 的第一个结点是头结点,不保存学生信息,从第二个节点开始才有学生信息,所以
stupointer = stulist;    // 应该改成下面这样
stupointer = stulist->next;    // 注意有两处要修改


另外啊,删除函数还是应该取名 delete。英语不好没关系,咱可以用汉语拼音啊,重要的是表达要清楚

[ 本帖最后由 voidx 于 2011-4-18 13:09 编辑 ]
2011-04-18 13:08
lxh30907
Rank: 1
等 级:新手上路
帖 子:22
专家分:9
注 册:2010-12-15
收藏
得分:0 
回复 9楼 voidx
非常感谢啊·~~不是英文不好,只是因为当时想实现搜索功能,后来放弃了,没改掉而已
2011-04-18 13:34
快速回复:链表问题
数据加载中...
 
   



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

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