| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 809 人关注过本帖
标题:关于单链表的插入问题,很急!!!
只看楼主 加入收藏
摇晃昨天
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2013-1-1
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:10 
关于单链表的插入问题,很急!!!
程序代码:
typedef struct Student
{
    char    num[15];
    char    name[10];
    char    dorm[10];
    char    major[20];
    char    tel[12];
}ST;

typedef struct ListElmt_
{
    void    *data;   //单链表数据域
    struct ListElmt_    *next;
}ListElmt;

typedef struct List_
{
    int        size;;
    ListElmt    *head;
    ListElmt    *tail;
}List
//插入函数
int        list_insert_next(List *list,ListElmt *element,const void *data){
   
        ListElmt        *new_element;

        /*Allocate storage for element */
        if ((new_element = (ListElmt *)malloc(sizeof(ListElmt))) == NULL)        return  -1;

        /* Insert the element to the list */
        new_element->data = (void *)data;
        if (element == NULL)    {//若element为NULL,则新元素插入链表头部

                if (list_size(list) == 0)    list->tail = new_element;

                new_element->next = list->head;
                list->head = new_element;

                }
        else{
                if (element->next == NULL)        list->tail = new_element;

                new_element->next = element->next;
                element->next = new_element;
        }

        list->size++;
        return 0;
}
我通过下面的插入方式插入,但是head和tail指向的都是最后一个插入的元素。
    struct Student        *stu;
    ListElmt            *p;
    char                yes_no = '\0';

    if ((stu = (struct Student *)malloc(sizeof(struct Student))) == NULL)        return  -1;

    do
    {
        printf("学号:");
        scanf("%s",&stu->num);
        printf("姓名:");
        scanf("%s",&stu->name);
        printf("宿舍:");
        scanf("%s",&stu->dorm);
        printf("专业:");
        scanf("%s",&stu->major);
        printf("联系方式:");
        scanf("%s",&stu->tel);
        p = list->tail;
        if (list_insert_next(list,p,(const void *)stu) == 0){
           
            printf("添加成功,还要继续吗(Y/N)?");
            getchar();
            scanf("%c",&yes_no);
           
        }else{
            printf("添加失败,请重试!");
            system("pause");
            yes_no = 'y';
        }       

    } while (yes_no == 'y' || yes_no == 'Y');

由于先前的一个号找不到了,又重新创了个,就20分,我都给了,希望各位大神能帮帮忙,十分感谢!!
2013-01-01 21:07
不玩虚的
Rank: 9Rank: 9Rank: 9
来 自:四川
等 级:贵宾
威 望:10
帖 子:331
专家分:1301
注 册:2012-12-9
收藏
得分:0 
写的太麻烦了,楼主。结构体都弄了一堆,看着都头晕。要不楼主问题描述好点我给你写一个,链表或数组实现都可以。

同学习......同进步....你帮我......我帮你.....上善若水.....
2013-01-02 15:53
摇晃昨天
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2013-1-1
收藏
得分:0 
回复 2楼 不玩虚的
这是数据结构的课程设计,我想用链表做个管理系统,但是插入出现了错误,我就是想请教如何将数据插入链表
2013-01-03 16:19
wengege
Rank: 2
等 级:论坛游民
帖 子:148
专家分:93
注 册:2012-7-23
收藏
得分:0 
链表的插入写的比较繁琐, 有那么复杂么?

打好基础,学会站在巨人的肩膀上!
2013-01-04 12:03
摇晃昨天
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2013-1-1
收藏
得分:0 
回复 4楼 wengege
没感觉很繁琐啊,就List结构体中多了几个参数而已,其实还省略了几个封装函数的指针,这用不到没有写出来。
2013-01-04 13:24
tpyangqing
Rank: 1
等 级:新手上路
帖 子:2
专家分:5
注 册:2013-1-4
收藏
得分:5 
我也是觉得比较复杂 我写了一个比较简单的,你看参考一下,相应的修改是可以的
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int N=1;
typedef struct
{
    int num;
    char name[20];
    float score;
}student;

int inser(student *p)
{
    student *q,t;
    int post;
    printf("请输入学生信息:\n");
    scanf("%d%s%f",&t.num,t.name,&t.score);
    printf("请输入要插入的位置:");
    scanf("%d",&post);
    for(q=p+post-1,p=p+N-1;p>=q;p--)
    {
        (p+1)->num=p->num;
        strcpy((p+1)->name,p->name);
        (p+1)->score=p->score;
    }
    q->num=t.num;
    strcpy(q->name,t.name);
    q->score=t.score;
    N++;
    return N;
}

void deleted(student *p)
{
    student *q,*t;
    int i;
    printf("请输入要删除的位置");
    scanf("%d",&i);
    if(i<=N){
    for(q=p+i-1,t=p+i;t<=p+N-1;t++)
    {
        q->num=t->num;
        q->score=t->score;
        strcpy(q->name,t->name);
    }
    N--;
    }
    else
    {
        printf("你的输入有误!");

    }

}

void output(student *p,int N)
{
    int i;
    printf("序号   学号     姓名    成绩\n ");
    for(i=0;i<N;i++)
    {
        printf("%d\t%d\t%s\t%.2f\n",i+1,p->num,p->name,p->score);
         p++;
    }
    system("pause");
}
int menu()
{   
    char c;
    do{
        system("cls");
       printf("1.插入学生\n");
       printf("2.删除学生\n");
       printf("3.显示所以学生\n");
       printf("4.退出系统\n");
       printf("请输入你的选择(1-4):  ");
       c=getchar();
      }while(c<'0'||c>'5');
     return c-'0';
}
   
void main()
{
    student stu[10];
    int i;
    printf("请输入学生的信息:\n");
    printf("学号  姓名  成绩\n");
    for(i=0;i<N;i++)
        scanf("%d%s%f",&stu[i].num,stu[i].name,&stu[i].score);
        for(;;)
{   
     switch(menu())
       {
         case 1:
        N=inser(stu);
        break;
         case 2:
          deleted(stu);
        break;
         case 3:
            output(stu,N);
            break;
         case 4:
             exit(0);
             break;
        default:
          printf("你的输入有误");
        break;
   
     }
    }
}
2013-01-04 18:20
cl875821804
Rank: 2
等 级:论坛游民
帖 子:25
专家分:10
注 册:2012-11-24
收藏
得分:0 
额,好长的代码!

just do it
2013-01-04 21:48
摇晃昨天
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2013-1-1
收藏
得分:0 
回复 6楼 tpyangqing
但是你用的不是链表啊,而且我们数据结构是有要求
2013-01-04 23:38
不玩虚的
Rank: 9Rank: 9Rank: 9
来 自:四川
等 级:贵宾
威 望:10
帖 子:331
专家分:1301
注 册:2012-12-9
收藏
得分:15 
我觉得也是,忘了看这贴了,还以为都结贴了。不好意思,我给你弄个链表的,是不是头插法,和尾插法都可以?还有你需要些什么结构体啊。还有要达到什么功能?
说具体点,我就动手应该很快搞定。

同学习......同进步....你帮我......我帮你.....上善若水.....
2013-01-07 09:04
摇晃昨天
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2013-1-1
收藏
得分:0 
回复 9楼 不玩虚的
刚刚问了老师,已经搞定了,还是很感谢你!
2013-01-07 19:58
快速回复:关于单链表的插入问题,很急!!!
数据加载中...
 
   



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

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