采用单向链表建立一个学生信息表,每个节点包括学号(int型),姓名(字符型20位),成绩(int型),并输出。

要求要用动态链表
要求用户可以新建或者删除信息表里面的信息,另外是用C++语言编译

student.h 文件代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct student
{
char name[20];
int age;
int num;
};
//单链表的结构体
typedef struct SingleList
{
struct student mystudent;
//指针域
struct SingleList *next;
}LIST, *LPLIST;
/*
别名:习惯大写
起别名---小名
//好处:单词少,好看(含义更精简)
struct SingleList  换一种叫法:  LIST;
strcut SingleList *  换一种叫法: LPLIST
*/
//------->2.创建链表  ---任何结构都需要用一个东西去表示


LPLIST CreateList()
{
//创建过程就是初始化过程---初始化基本数据成员过程
//需要内存空间
LPLIST List = (LPLIST)malloc(sizeof(LIST));
if (List == nullptr)
{
printf("失败了\n");
system("pause");
exit(0);
}
//初始化基本数据成员----有表头的链表
List->next = nullptr;
return List;
}
//------->3.创建结点  
LPLIST CreateNode(struct student mystudent)
{
//1.需要内存
LPLIST Node = (LPLIST)malloc(sizeof(LIST));
//2.初始化基本数据成员
strcpy(Node->mystudent.name, mystudent.name);
Node->mystudent.age = mystudent.age;
Node->mystudent.num = mystudent.num;
Node->next = nullptr;
return Node;
}

//------->4.2 尾插法
void InsertListTailNode(LPLIST List, struct student mystudent)
{
//找到表尾--->定义一个移动的指针
LPLIST tailNode = List;
while (tailNode->next != nullptr)
{
tailNode = tailNode->next;
}
//创建插入的结点
LPLIST newNode = CreateNode(mystudent);
tailNode->next = newNode;
}



//------->5.判断是否为空
//和创建的时候比较
int  IsEmptyList(LPLIST List)
{
if (List->next == nullptr)
return 1; //返回1表示为空
return 0; //表示不为空
}
////------->6.打印数据
void PrintList(LPLIST List)
{
if (IsEmptyList(List))
{
printf("链表为空,无法打印");
system("pause");
exit(0);
}
LPLIST pNext = List->next;
while (pNext != nullptr)
{
printf("姓名:%s\t年龄:%d\t编号:%d\n", pNext->mystudent.name, pNext->mystudent.age, pNext->mystudent.num);
pNext = pNext->next;
}
}

//------->9.按照编号指定位置删除
void DeleteListAppoinNode_num(LPLIST List, int num)
{
//创建两个移动的指针:去找指定位置和指定位置的前面
LPLIST frontNode = List;
//frontNode->next==taiNode:判断相邻
LPLIST tailNode = List->next;
//判断是否为空
while (tailNode->mystudent.num != num)
{
/*
frontNode=frontNode->next;
tailNode=tailNode->next;
*/
frontNode = tailNode;
tailNode = frontNode->next;
if (tailNode == nullptr)
{
printf("未找到指定位置\n");
system("pause");
exit(0);
}
}
frontNode->next = tailNode->next;
free(tailNode);
}

//------->9.按照姓名指定位置删除
void DeleteListAppoinNode_name(LPLIST List, char *name)
{
//创建两个移动的指针:去找指定位置和指定位置的前面
LPLIST frontNode = List;
//frontNode->next==taiNode:判断相邻
LPLIST tailNode = List->next;
//判断是否为空
while (strcmp(tailNode->mystudent.name, name))
{
/*
frontNode=frontNode->next;
tailNode=tailNode->next;
*/
frontNode = tailNode;
tailNode = frontNode->next;
if (tailNode == nullptr)
{
printf("未找到指定位置\n");
system("pause");
exit(0);
}
}
frontNode->next = tailNode->next;
free(tailNode);
}

void Menu()
{
printf("\t\t\t1.录入信息\n");
printf("\t\t\t2.删除信息\n");
printf("\t\t\t3.浏览信息\n");
}
LPLIST List = CreateList(); //List创建成功

void key_down()
{
char name[20] = "";
int num = 0;
fflush(stdin);
char choice = getchar();
int DChoice = 1;
switch (choice)
{
case '1':
system("cls");
struct student mystudent;
printf("请输入:\t姓名:\t年龄:\t编号:\n");
scanf("%s%d%d", mystudent.name, &mystudent.age, &mystudent.num);
InsertListTailNode(List, mystudent);
break;
case '2':
system("cls");
fflush(stdin);
printf("\t\t\t1.按照姓名删除\n");
printf("\t\t\t2.按照编号\n");
DChoice = getchar();
switch (DChoice)
{
case '1':
printf("请输入要删除的姓名:\n");
scanf("%s", name);
DeleteListAppoinNode_name(List, name);
break;
case '2':

printf("请输入要删除的编号:\n");
scanf("%s", name);
DeleteListAppoinNode_num(List, num);
}
break;
case '3':
system("cls");
printf("学生信息:\n");
PrintList(List);
break;
default:
printf("输入错误\n");
system("pause");
}
}

student.cpp:

#include "student.h"
//更多精彩点击我头像,有惊喜
int main()
{
while (1)
{
Menu();
key_down();
}

system("pause");
return 0;
}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-12-24
感觉你应该是想用c语言
具体语法已经忘了,你自己补充。
typedef struct {
int id,

char[20] name,

int score,

student *next

} student;
//下面就用for建立一个链表,把next指向另一个strudent.
//输出就不说了,只要结构有了,你应该有思路了本回答被网友采纳
第2个回答  2017-10-11
#include<iostream>
using namespace std;
typedef struct node
{
    int num;
    char name[20];
}node;
//思路给出来了,其余的你应该会了吧,不懂得话私信我有偿(给多少随意)