| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 730 人关注过本帖, 1 人收藏
标题:麻烦大家看下,加点的
只看楼主 加入收藏
hwf214685147
Rank: 2
等 级:论坛游民
帖 子:70
专家分:94
注 册:2011-9-14
结帖率:62.5%
收藏(1)
已结贴  问题点数:5 回复次数:7 
麻烦大家看下,加点的
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#define N 10
typedef struct node
{
    char name[20];
    struct node *link;
}stud;

stud * creat(int n)
{
    stud *p,*h,*s;
    int i;
    if((h=(stud *)malloc(sizeof(stud)))==NULL)
    {
        printf("不能分配内存空间!");
        exit(0);
    }
    h->name[0]='\0';
    h->link=NULL;
    p=h;
    for(i=0;i<n;i++)
    {
        if((s= (stud *) malloc(sizeof(stud)))==NULL)
        {
            printf("不能分配内存空间!");
            exit(0);
        }
        p->link=s;
        printf("请输入第%d个人的姓名",i+1);
        scanf("%s",s->name);
        s->link=NULL;
        p=s;
    }
    return(h);
}

stud * search(stud *h,char *x)
{
    stud *p;
    char *y;
    p=h->link;
    while(p!=NULL)
    {
        y=p->name;
        if(strcmp(y,x)==0)
        return(p);
        else p=p->link;
    }
    if(p==NULL)
    printf("没有查找到该数据!");
    return 0;
}

stud * search2(stud *h,char *x)
{
    stud *p,*s;
    char *y;
    p=h->link;
    s=h;
    while(p!=NULL)
    {
        y=p->name;
        if(strcmp(y,x)==0)
        return(s);
        else
        {
            p=p->link;
            s=s->link;
        }
    }
    if(p==NULL)
    printf("没有查找到该数据!");
    return 0;
}

void insert(stud *p)
{
    char stuname[20];
    stud *s;
    if((s= (stud *) malloc(sizeof(stud)))==NULL)
    {
        printf("不能分配内存空间!");
        exit(0);
    }
    printf("\n请输入你要插入的人的姓名:");
    scanf("%s",stuname);
    strcpy(s->name,stuname);
    s->link=p->link;
    p->link=s;
}
void del(stud *x,stud *y)
{
    stud *s;
    s=y;
    x->link=y->link;
    free(s);
}

void print(stud *h)
{
    stud *p;
    p=h->link;
    printf("数据信息为:\n");
    while(p!=NULL)
    {
        printf("%s ",&*(p->name));
        p=p->link;
    }
}
void quit()
{
    exit(0);
}

void menu(void)
{
    //clrscr();
    printf("\t\t\t单链表C语言实现实例\n");
    printf("\t\t|————————————————|\n");
    printf("\t\t| |\n");
    printf("\t\t| [1] 建 立 新 表 |\n");
    printf("\t\t| [2] 查 找 数 据 |\n");
    printf("\t\t| [3] 插 入 数 据 |\n");
    printf("\t\t| [4] 删 除 数 据 |\n");
    printf("\t\t| [5] 打 印 数 据 |\n");
    printf("\t\t| [6] 退 出 |\n");
    printf("\t\t| |\n");
    printf("\t\t| 如未建立新表,请先建立! |\n");
    printf("\t\t| |\n");
    printf("\t\t|————————————————|\n");
    printf("\t\t 请输入你的选项(1-6):");
}
main()
{
    int choose;
    stud *head,*searchpoint,*forepoint;
    char fullname[20];
   
    while(1)
    {
        menu();
        scanf("%d",&choose);
        switch(choose)
        {
        case 1:
            head=creat(N);//创建链表
            break;
        case 2:
            printf("%d\n",head->link);
            if(head->link==NULL)
            break;
            printf("输入你所要查找的人的姓名:");
            scanf("%s",fullname);
            searchpoint=search(head,fullname);
            printf("你所查找的人的姓名为:%s",*&searchpoint->name);
            printf("\n按回车键回到主菜单。");
            getchar();
            getchar();
            break;
        case 3:;
            printf("输入你要在哪个人后面插入:");
            scanf("%s",fullname);
            searchpoint=search(head,fullname);
            printf("你所查找的人的姓名为:%s",*&searchpoint->name);
            insert(searchpoint);
            print(head);
            printf("\n按回车键回到主菜单。");
            getchar();
            getchar();
            break;
        case 4:
            print(head);
            printf("\n输入你所要删除的人的姓名:");
            scanf("%s",fullname);
            searchpoint=search(head,fullname);
            forepoint=search2(head,fullname);
            del(forepoint,searchpoint);
            break;
        case 5:

            print(head);
            printf("\n按回车键回到主菜单。");
            getchar();
            getchar();
            break;
        case 6:
            quit();
            break;
        default:
            printf("你输入了非法字符!按回车键回到主菜单。");
            //clrscr();
            menu();
            getchar();
        }
    }
}
我直接输入2,为什么打印出来head->link 不是空,而我用其他程序试了是可以的。
搜索更多相关主题的帖子: include 空间 
2011-09-19 15:18
hwf214685147
Rank: 2
等 级:论坛游民
帖 子:70
专家分:94
注 册:2011-9-14
收藏
得分:0 
不好意思标题打错了,应该是链表问题!
2011-09-19 15:20
laznrbfe
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:482
专家分:1599
注 册:2011-5-22
收藏
得分:2 
因为你没有建立链表的时候就选择了2吧?head没有指向具体的对象,成为了野指针。不能直接选择2。

[ 本帖最后由 laznrbfe 于 2011-9-19 16:17 编辑 ]
2011-09-19 16:15
hwf214685147
Rank: 2
等 级:论坛游民
帖 子:70
专家分:94
注 册:2011-9-14
收藏
得分:0 
那如果我不允许这种操作该怎么办?如果加一个条件判断语句!
2011-09-19 16:30
mengcan555
Rank: 4
等 级:业余侠客
帖 子:104
专家分:253
注 册:2011-9-17
收藏
得分:2 
先建立表,在查询才对啊,若想解决可以这样:把创建表的操作放到switch外面,先建立表格后,在执行switch语句就ok 了,希望能帮到你
2011-09-19 22:32
hwf214685147
Rank: 2
等 级:论坛游民
帖 子:70
专家分:94
注 册:2011-9-14
收藏
得分:0 
呵呵,可是我不想这么做,就想在这里加个判断,我想等跟好的解决方案!
2011-09-20 10:28
yucwei
Rank: 2
等 级:论坛游民
帖 子:25
专家分:46
注 册:2007-10-10
收藏
得分:2 
以下是引用laznrbfe在2011-9-19 16:15:50的发言:

因为你没有建立链表的时候就选择了2吧?head没有指向具体的对象,成为了野指针。不能直接选择2。
说的对,你没有建空表,选择2当然出问题了。你应该先在main()程序中先建立一个主空表,再去执行各种操作。
2011-09-20 10:43
yucwei
Rank: 2
等 级:论坛游民
帖 子:25
专家分:46
注 册:2007-10-10
收藏
得分:0 
以下是引用hwf214685147在2011-9-20 10:28:57的发言:

呵呵,可是我不想这么做,就想在这里加个判断,我想等跟好的解决方案!
那你必须在2中先建链表了,然后,你再去判断各种情况子。
2011-09-20 10:55
快速回复:麻烦大家看下,加点的
数据加载中...
 
   



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

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