| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 389 人关注过本帖
标题:链表操作,问题在哪里呢?
只看楼主 加入收藏
晨风柳影
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2009-9-14
结帖率:33.33%
收藏
已结贴  问题点数:10 回复次数:6 
链表操作,问题在哪里呢?
//动态链表操作
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 30

//链表结构的声明
typedef struct name
{
    char name[MAX];
    struct name *link;
}NAME;

NAME *head;
int n;

//创建链表
NAME *creat_link_list(int n)
{
    NAME *p,*q;
    int i=1;
    printf("'We will creat a link for you \n");
    p = (NAME *)malloc(sizeof(NAME));
    head = p;
    for(;i<n;i++)
    {
        scanf("%s",p->name);
        q = (NAME *)malloc(sizeof(NAME));
        q->link = p;
        p = q;
    }

    scanf("%s",p->name);
    p->link = NULL;
    //getchar();
    return (head);
}

//链表插入函数
NAME *input_link_list(char name[MAX],int x)
{
    NAME *p,*q;
    int i=1;
    p=(NAME*)malloc(sizeof(NAME));
    strcpy(p->name,name);
    if(x==1)
    {
        p->link = head;
        head = p;
    }
    else if(x<1 || x>n)
    {
        printf("\nError!The location is wrong!\n");
        exit (1);
    }
    else
    {
        q = head;

        for(;i<x;i++)    //找x的位置
            q = q->link;

        p->link = q->link;//插入
        q->link = p;
    }
    return (head);
}

//链表元素删除函数
NAME *cut_link_list(int x)
{
    NAME *p,*q;
    int i=1;
    q = head;
    if(x<1 || x>n)
    {
        printf("You have told a wrong location !\n");
        exit (1);
    }
    if(x==1)
    {
        p = head;
        free(head);
        head = p->link;
    }
    if(x>1 || x <=n)
    {
        for(;i<x;i++)  //以找到删除元素的位置。
            q = q->link;

        p = q->link;
        q->link = p->link;
        free(p);
    }
    return (head);
}

//链表打印函数自定义。
int print(NAME *head)
{
    NAME *p;
    p = head;
    printf("This is it\n");
    while(p != NULL)
    {
        printf("%s",p->name);
        p = p->link;
    }
    printf("\n");
    return 1;
}

//主函数已测试所有的应用函数
int main()
{
    int m,k;
    char name2[MAX];
    printf("\nPlease enter the n to define the structlink :\n");
    scanf("%d",&n);
    creat_link_list(n);
    if(print(head))
    {
   
        printf("Enter the name you want to add and the m which is the location:\n");
        scanf("%s %d",name2,&m);
        input_link_list(name2,m);
        if(print(head))
        {
             printf("Enter the k which is the location:\n");
             scanf("%d",&k);
             cut_link_list(k);
             print(head);
        }
    }
}
搜索更多相关主题的帖子: 链表 
2009-10-11 11:43
Aion
Rank: 2
等 级:论坛游民
帖 子:19
专家分:52
注 册:2009-10-10
收藏
得分:3 
设计本身就有严重问题,为什么head不是通过传参传递,非得用全局?

Admin

专门做题
2009-10-11 11:55
晨风柳影
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2009-9-14
收藏
得分:0 
但是,这样有问题么?我的意思是说,我们先撇开风格问题,来看程序本身。谢谢了~
2009-10-11 11:57
Aion
Rank: 2
等 级:论坛游民
帖 子:19
专家分:52
注 册:2009-10-10
收藏
得分:0 
你自己好好看看以下三行有什么问题

        p = head;
        free(head);
        head = p->link;


Admin

专门做题
2009-10-11 12:01
viky2003
Rank: 5Rank: 5
等 级:职业侠客
帖 子:375
专家分:383
注 册:2007-4-11
收藏
得分:3 
AME *creat_link_list(int n)
{
    NAME *p,*q;
    int i=1;
    printf("'We will creat a link for you \n");
    p = (NAME *)malloc(sizeof(NAME));
    head = p;
    for(;i<n;i++)
    {
        scanf("%s",p->name);
        q = (NAME *)malloc(sizeof(NAME));
        q->link = p;
        p = q;
    }

    scanf("%s",p->name);
    p->link = NULL;
    //getchar();
    return (head);
}

这段代码的逻辑有问题:
head指向第最后一个节点,经过循环p指向第一个节点,最后p->link又置为NULL,
这样除了保存了第一个节点p和最后一个节点head外,第二个节点一q开始,最后一个问题,head作为最后的节点,head->link没有置为NULL,这样不好。


要练习算法就来http:///!!有挑战哦!!
2009-10-11 12:29
晨风柳影
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2009-9-14
收藏
得分:0 
谢谢viky2003 了
2009-10-11 12:42
无诲今生
Rank: 8Rank: 8
来 自:桂林理工大学
等 级:蝙蝠侠
威 望:2
帖 子:373
专家分:726
注 册:2009-5-11
收藏
得分:3 
首先我发现要加#include<malloc.h>头文

顺境逆境切莫止境,得意失意切莫在意。
2009-10-11 13:05
快速回复:链表操作,问题在哪里呢?
数据加载中...
 
   



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

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