注册 登录
编程论坛 数据结构与算法

关于单链表的插入问题,很急!!!

摇晃昨天 发布于 2013-01-01 21:07, 809 次点击
程序代码:
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分,我都给了,希望各位大神能帮帮忙,十分感谢!!
10 回复
#2
不玩虚的2013-01-02 15:53
写的太麻烦了,楼主。结构体都弄了一堆,看着都头晕。要不楼主问题描述好点我给你写一个,链表或数组实现都可以。
#3
摇晃昨天2013-01-03 16:19
回复 2楼 不玩虚的
这是数据结构的课程设计,我想用链表做个管理系统,但是插入出现了错误,我就是想请教如何将数据插入链表
#4
wengege2013-01-04 12:03
链表的插入写的比较繁琐, 有那么复杂么?
#5
摇晃昨天2013-01-04 13:24
回复 4楼 wengege
没感觉很繁琐啊,就List结构体中多了几个参数而已,其实还省略了几个封装函数的指针,这用不到没有写出来。
#6
tpyangqing2013-01-04 18:20
我也是觉得比较复杂 我写了一个比较简单的,你看参考一下,相应的修改是可以的
#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;
   
     }
    }
}
#7
cl8758218042013-01-04 21:48
额,好长的代码!
#8
摇晃昨天2013-01-04 23:38
回复 6楼 tpyangqing
但是你用的不是链表啊,而且我们数据结构是有要求
#9
不玩虚的2013-01-07 09:04
我觉得也是,忘了看这贴了,还以为都结贴了。不好意思,我给你弄个链表的,是不是头插法,和尾插法都可以?还有你需要些什么结构体啊。还有要达到什么功能?
说具体点,我就动手应该很快搞定。
#10
摇晃昨天2013-01-07 19:58
回复 9楼 不玩虚的
刚刚问了老师,已经搞定了,还是很感谢你!
#11
不玩虚的2013-01-08 00:18
不客气,同学习同进步啦,不过确实没有帮到你啦。
1