| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1302 人关注过本帖
标题:顺序链表问题,列表里面只有一个数据是怎么删不掉?
只看楼主 加入收藏
木下瞳
Rank: 1
等 级:新手上路
帖 子:37
专家分:6
注 册:2017-9-24
结帖率:88.89%
收藏
已结贴  问题点数:18 回复次数:5 
顺序链表问题,列表里面只有一个数据是怎么删不掉?
我在DEVc++上能运行了,有一个问题就是表里面还剩一个学生的时候删除不了,怎么办?
我在VS2017上也冷运行,但是有一个问题就是插入学生,在输入学生姓名后就出错了,就不能运行了,怎么回事啊?
程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define LEN 3
#define MAXSIZE 5

//定义datatype 
typedef struct
{
    int sno;
    char sname[LEN];
    int grade;
} datatype;

//比较datatype,返回0表示相等 
int compare(datatype *x, datatype *y)
{
    return x->sno - y->sno;
}

//打印datatype
void printDatatype(datatype *x)
{
    printf("%d\t%s\t%d\n", x->sno, x->sname, x->grade);
}

//定义顺序表 
typedef struct
{
    datatype data[MAXSIZE];
    int last;
}SeqList;

/*******************线性表的基本操作**************************/
//初始化 
SeqList *Init_SeqList()
{
    SeqList *L;
    L = (SeqList *)malloc(sizeof(SeqList));
    L->last = -1;
    return L;
}

//销毁 
void Destroy_SeqList(SeqList **L)
{
    if (*L)
    {
        free(*L);
        *L = NULL;
    }
}

//求表长
int Length_SeqList(SeqList *L)
{
    return L->last;
}

//判断是否为空
int isEmpty_SeqList(SeqList *L)
{
    return (L->last == 0);
}

//查找(按值)
int Locate_SeqList(SeqList *L, datatype x)
{
    int i = 0;
    while (i <= L->last && L->data[i].sno != x.sno)
        i++;
    if (i > L->last)
        return -1;
    else
        return i;
}

//插入
int Insert_SeqList(SeqList *L, int i, datatype x)
{
    int j, k;
    if (L->last == MAXSIZE - 1)
    {
        printf("表满,空间已满!!!\n\n");
        return 0;
    }
    if (i < 1 || i > L->last + 2)
    {
        printf("位置错!!\n\n");
        return 0;
    }
    for (j = L->last; j >= i - 1; j--)
        L->data[j + 1] = L->data[j];
    L->data[i - 1] = x;
    L->last++;
    return 1;
}

//删除
int Delete_SeqList(SeqList *L, int i)
{
    int j;
    if (i < 1 || i > L->last + 1)
    {
        printf("无此学生");
        return 0;
    }
    for (j = i; j <= L->last; j++)
        L->data[j - 1] = L->data[j];
    L->last--;
    return 1;
}


/*******************程序的功能函数**************************/
//打印 
void Print(SeqList *L)
{
    printf("学生信息:(学号/t姓名/t成绩)\n");
    for (int i = 0; i <= L->last; i++)
        printDatatype(&L->data[i]);
    printf("\n");
}

//查找 
void Search(SeqList *L)
{
    int id, p;
    printf("请输入要查找的学生的学号:");
    scanf("%d", &id);
    datatype std;
    std.sno = id;
    p = Locate_SeqList(L, std);
    if (p == -1)
        printf("没有此学生!\n");
    else
    {
        printf("学生信息如下:\n");
        printDatatype(&L->data[p]);
    }
    printf("\n");
}

//插入 
void Insert(SeqList *L)
{
    int id, k, position, grade;
    char name[LEN];
    if (L->last == MAXSIZE - 1)
        printf("表满,空间已满!!!\n\n");
    else {
        printf("请输入你要插入的学号:");
        scanf("%d", &id);
        for (k = 0; k <= L->last; k++)
        {
            if (L->data[k].sno == id)
            {
                printf("学号有重复的!!\n\n");
                goto p;
            }
        }
        printf("请输入你要插入的姓名:");
        scanf("%s", &name);
        printf("请输入你要插入的成绩:");
        scanf("%d", &grade);
        datatype *std = (datatype *)malloc(sizeof(datatype));
        std->sno = id;
        strcpy(std->sname, name);
        std->grade = grade;
        printf("请输入插入的位置:");
        scanf("%d", &position);
        int a = Insert_SeqList(L, position, *std);
        if (a == 1)
            printf("插入成功!\n\n");
    }
p:;
}




//删除 
void Delete(SeqList *L)
{
    int id, i, k;
    printf("请输入要删除的学生的学号:");
    scanf("%d", &id);
    datatype std;
    std.sno = id;
    int y = Locate_SeqList(L, std);
    if (y == -1)
        printf("无此学生!\n\n");
    else {
        for (i = 0; i < L->last; i++)
            if (id == L->data[i].sno)
                break;
        k = Delete_SeqList(L, id);
    }
    if (k == 0)
        printf("删除失败!\n\n");
    if (k == 1)
        printf("删除成功!\n\n");
}

//更新
void Update(SeqList *L)
{
    int i, id, grade;
    printf("请输入要更新的学生学号:");
    scanf("%d", &id);
    if (id < 1 || id > L->last + 1)
    {
        printf("无此学生!!!\n\n");
        goto x;
    }
    for (i = 0; i <= L->last; i++)
    {
        if (id == L->data[i].sno)
        {
            printf("请输入要更新的成绩:");
            scanf("%d", &grade);
            L->data[i].grade = grade;
            printf("更新成功!\n\n");
            break;
        }
    }
x:;
}

/*******************main函数**************************/

void printChoice()
{
    printf("please select a number:\n");
    printf("*****1:打印成绩单\n");
    printf("*****2:插入成绩\n");
    printf("*****3:按学号查找成绩\n");
    printf("*****4:修改成绩\n");
    printf("*****5:按学号删除成绩\n");
    printf("*****0:退出系统\n");
    printf("请选择:");
}


int main()
{
    SeqList *L = Init_SeqList();
    if (!L)
    {
        printf("分配内存失败!");
        return 0;
        system("pause");
    }
    int number;
    while (1)
    {
        printChoice();
        scanf("%d", &number);
        switch (number)
        {
        case 1:
            Print(L);
            break;
        case 2:
            Insert(L);
            break;
        case 3:
            Search(L);
            break;
        case 4:
            Update(L);
            break;
        case 5:
            Delete(L);
            break;
        case 0:
            Destroy_SeqList(&L);
            return 0;
            system("pause");
        default:
            printf("输入错误!!!\n");
        }
    }
}


[此贴子已经被作者于2018-3-18 19:03编辑过]

搜索更多相关主题的帖子: 学生 data int return printf 
2018-03-16 16:18
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10527
专家分:42899
注 册:2014-5-20
收藏
得分:9 
自己动手先写 插入成绩 看看
2018-03-17 09:07
lanke711
Rank: 9Rank: 9Rank: 9
来 自:流浪在天国之路
等 级:蜘蛛侠
威 望:7
帖 子:317
专家分:1437
注 册:2015-7-16
收藏
得分:9 
你这啥都没写呢?连起码的链表创建添加等功能都不写?

普通人之所以普通,是因为他们普遍有一个通病,那就是认为自己永远普通。
千夫所指,我亦坚持。就算被所有人误解,我也照样守护这一切。
我们总是觉得,这些灵魂的表情,傲慢自大,目中无人,其实,真正目中无人的是我们。它们傲慢的不过是表情,而我们傲慢的却是行为!
记得,是为了忘记!
只要想着有那么一天,我就能忍受现在的每一天!
灾难并不可怕,可怕的是心中没有了希望。
你以为我在天堂,其实我正在路上。
当你觉得自己走不到终点的时候,请不要放弃。或许你的对手也是这种感觉。
2018-03-17 13:20
木下瞳
Rank: 1
等 级:新手上路
帖 子:37
专家分:6
注 册:2017-9-24
收藏
得分:0 
我在DEVc++上能运行了,有一个问题就是表里面还剩一个学生的时候删除不了,怎么办?
我在VS2017上也冷运行,但是有一个问题就是插入学生,在输入学生姓名后就出错了,就不能运行了,怎么回事啊?
程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define LEN 3
#define MAXSIZE 5

//定义datatype 
typedef struct
{
    int sno;
    char sname[LEN];
    int grade;
} datatype;

//比较datatype,返回0表示相等 
int compare(datatype *x, datatype *y)
{
    return x->sno - y->sno;
}

//打印datatype
void printDatatype(datatype *x)
{
    printf("%d\t%s\t%d\n", x->sno, x->sname, x->grade);
}

//定义顺序表 
typedef struct
{
    datatype data[MAXSIZE];
    int last;
}SeqList;

/*******************线性表的基本操作**************************/
//初始化 
SeqList *Init_SeqList()
{
    SeqList *L;
    L = (SeqList *)malloc(sizeof(SeqList));
    L->last = -1;
    return L;
}

//销毁 
void Destroy_SeqList(SeqList **L)
{
    if (*L)
    {
        free(*L);
        *L = NULL;
    }
}

//求表长
int Length_SeqList(SeqList *L)
{
    return L->last;
}

//判断是否为空
int isEmpty_SeqList(SeqList *L)
{
    return (L->last == 0);
}

//查找(按值)
int Locate_SeqList(SeqList *L, datatype x)
{
    int i = 0;
    while (i <= L->last && L->data[i].sno != x.sno)
        i++;
    if (i > L->last)
        return -1;
    else
        return i;
}

//插入
int Insert_SeqList(SeqList *L, int i, datatype x)
{
    int j,k;
    if (L->last == MAXSIZE - 1)
    {
        printf("表满,空间已满!!!\n\n");
        return 0;
    }
    if (i < 1 || i > L->last + 2)
    {
        printf("位置错!!\n\n");
        return 0;
    }
    for (j = L->last; j >= i - 1; j--)
        L->data[j + 1] = L->data[j];
    L->data[i - 1] = x;
    L->last++;
    return 1;
}

//删除
int Delete_SeqList(SeqList *L, int i)
{
    int j;
    if (i < 1 || i > L->last + 1)
    {
        printf("无此学生");
        return 0;
    }
    for (j = i; j <= L->last; j++)
        L->data[j - 1] = L->data[j];
    L->last--;
    return 1;
}


/*******************程序的功能函数**************************/
//打印 
void Print(SeqList *L)
{
    printf("学生信息:(学号/t姓名/t成绩)\n");
    for (int i = 0; i <= L->last; i++)
        printDatatype(&L->data[i]);
    printf("\n");
}

//查找 
void Search(SeqList *L)
{
    int id,p;
    printf("请输入要查找的学生的学号:");
    scanf("%d", &id);
    datatype std;
    std.sno = id;
    p = Locate_SeqList(L,std); 
    if (p == -1)
        printf("没有此学生!\n");
    else
    {
        printf("学生信息如下:\n");
        printDatatype(&L->data[p]);
    }
    printf("\n");
}

//插入 
void Insert(SeqList *L)
{
    int id,k,position, grade;
    char name[LEN];
    if (L->last == MAXSIZE - 1)
        printf("表满,空间已满!!!\n\n");
    else{
        printf("请输入你要插入的学号:");
        scanf("%d", &id);
        for(k = 0;k <= L->last;k++)
        {
            if(L->data[k].sno == id)
            {
                printf("学号有重复的!!\n\n");
                goto p;        
            }
        }
        printf("请输入你要插入的姓名:");
        scanf("%s", &name);
        printf("请输入你要插入的成绩:");
        scanf("%d", &grade);
        datatype *std = (datatype *)malloc(sizeof(datatype));
        std->sno = id;
        strcpy(std->sname, name);
        std->grade = grade;
        printf("请输入插入的位置:");
        scanf("%d", &position);
        int a = Insert_SeqList(L, position, *std);
        if (a == 1)
            printf("插入成功!\n\n");    
    }
    p:;
}




//删除 
void Delete(SeqList *L)
{
    int id, i, k;
    printf("请输入要删除的学生的学号:");
    scanf("%d", &id);
    datatype std;
    std.sno = id;
    int y = Locate_SeqList(L, std);
    if (y == -1)
        printf("无此学生!\n\n");
    else {
        for (i = 0; i < L->last; i++)
            if (id == L->data[i].sno)
                break;
        k = Delete_SeqList(L, id);
    }
    if (k == 0)
        printf("删除失败!\n\n");
    if(k == 1)
        printf("删除成功!\n\n");
}

//更新
void Update(SeqList *L)
{
    int i, id, grade;
    printf("请输入要更新的学生学号:");
    scanf("%d", &id);
    if(id < 1 || id > L->last + 1)
    {
        printf("无此学生!!!\n\n");
        goto x;
    }
    for (i = 0; i <= L->last; i++)
    {
        if (id == L->data[i].sno)
        {
            printf("请输入要更新的成绩:");
            scanf("%d", &grade);
            L->data[i].grade = grade;
            printf("更新成功!\n\n");
            break;
        }
    }
    x:;
}

/*******************main函数**************************/

void printChoice()
{
    printf("please select a number:\n");
    printf("*****1:打印成绩单\n");
    printf("*****2:插入成绩\n");
    printf("*****3:按学号查找成绩\n");
    printf("*****4:修改成绩\n");
    printf("*****5:按学号删除成绩\n");
    printf("*****0:退出系统\n");
    printf("请选择:");
}


int main()
{
    SeqList *L = Init_SeqList();
    if (!L)
    {
        printf("分配内存失败!");
        return 0;
        system("pause");
    }
    int number;
    while (1)
    {
        printChoice();
        scanf("%d", &number);
        switch (number)
        {
        case 1:
            Print(L);
            break;
        case 2:
            Insert(L);
            break;
        case 3:
            Search(L);
            break;
        case 4:
            Update(L);
            break;
        case 5:
            Delete(L);
            break;
        case 0:
            Destroy_SeqList(&L);
            return 0;
            system("pause");
        default:
            printf("输入错误!!!\n");
        }
    }
}
2018-03-18 17:46
lanke711
Rank: 9Rank: 9Rank: 9
来 自:流浪在天国之路
等 级:蜘蛛侠
威 望:7
帖 子:317
专家分:1437
注 册:2015-7-16
收藏
得分:0 
回复 楼主 木下瞳
结构体中,成员姓名的数组变量长度过小。

普通人之所以普通,是因为他们普遍有一个通病,那就是认为自己永远普通。
千夫所指,我亦坚持。就算被所有人误解,我也照样守护这一切。
我们总是觉得,这些灵魂的表情,傲慢自大,目中无人,其实,真正目中无人的是我们。它们傲慢的不过是表情,而我们傲慢的却是行为!
记得,是为了忘记!
只要想着有那么一天,我就能忍受现在的每一天!
灾难并不可怕,可怕的是心中没有了希望。
你以为我在天堂,其实我正在路上。
当你觉得自己走不到终点的时候,请不要放弃。或许你的对手也是这种感觉。
2018-03-18 20:41
木下瞳
Rank: 1
等 级:新手上路
帖 子:37
专家分:6
注 册:2017-9-24
收藏
得分:0 
回复 5楼 lanke711
不不,我每次都是只输入3个字符,没有多,DEvc++上没问题,vs2017就不知道了
2018-03-18 21:17
快速回复:顺序链表问题,列表里面只有一个数据是怎么删不掉?
数据加载中...
 
   



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

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