链表——学生信息——C语言

#include <stdio.h>
#include <stdlib.h>

typedef struct{
    char number[20];
    char name[20];
    int grade;
}student; 

typedef struct LinkNode{
    student student;
    struct LinkNode *next;
}LinkNode;

void input(student *p){
    printf("请输入学号!\n"); 
    scanf("%s",&p->number);
    printf("请输入姓名!\n"); 
    scanf("%s",&p->name);
    printf("请输入成绩!\n"); 
    scanf("%d",&p->grade);
}
void output(student p){
    printf("学号为:%s\n",p.number);
    printf("姓名为:%s\n",p.name);
    printf("成绩为:%d\n",p.grade);
}

int length(LinkNode *first){
    int count=0;
    LinkNode* q = first->next;
    while(q!=NULL){
        q=q->next;
        count++;
    }
    return count; 
}

void create(LinkNode** first){
    *first = (LinkNode*)malloc(sizeof(LinkNode));//创建首节点 
} 

int insert(LinkNode** first,student stu,int i){//向链表中的指定位置添加学生信息 
    LinkNode *per,*nxt;
    nxt=(LinkNode*)malloc(sizeof(LinkNode));
    per=*first;
    int L=length(*first);
    if(i<1||i>L+1){
        printf("输入的范围有误!\n");
        return 0;
    }
    int count=0;
    while(count<i-1){
        per=per->next;
        count++;
    }
        nxt->next=per->next;
        nxt->student=stu;
        per->next=nxt;
}

void add(LinkNode** first,student stu) {
    LinkNode *per,*nxt;
    nxt=(LinkNode*)malloc(sizeof(LinkNode));
    per=*first;
    int L=length(*first);
    int count=0;
    while(count<L){
        per=per->next;
        count++;
    }
    per->next=nxt;
    nxt->student=stu;
    nxt->next=NULL;
}
void display(LinkNode *first){//输出链表中的所有元素 
    LinkNode *L;
    L=first;
    L=L->next;
    while(L){
        output(L->student);
        L=L->next;
    }
}

void del(LinkNode** first,int i){
    LinkNode *per,*nxt;
    int L=length(*first);
    per=*first;
    per=per->next;
    if(i<=0||i>L){
        printf("输入的范围错误!\n"); 
    }
    int count=1;
    while(count<i-1){
        per=per->next;
        count++;
    }
    nxt=per->next;
    per->next=nxt->next;
    free(nxt);
} 

int main(int argc, char *argv[]) {
    LinkNode *L;
    student s;
    int i; 
    printf("1.创建头指针\n");
    printf("2.添加学生信息\n");
    printf("3.在指定位置插入学生信息\n");
    printf("4.获得学生表的长度\n");
    printf("5.删除指定位置的学生信息\n");
    printf("6.显示学生表中所有的学生信息\n");
    printf("******************请输入您要进行的操作编号********************\n");
    while(1){
        scanf("%d",&i);
        switch(i){
            case 1:
                create(&L);
                printf("初始化成功!\n");
                break;
            case 2:
                input(&s);
                add(&L,s);
                printf("学生信息添加成功!\n");
                break;
            case 3:
                input(&s);
                int a;
                printf("请输入您想插入学生的位置!\n");
                scanf("%d",&a);
                insert(&L,s,a);
                printf("学生信息插入成功!\n");  
                break;
            case 4:
                printf("当前学生表的长度为%d\n",length(L));
                break;
            case 5:
                printf("请输入您要删除的位置!\n");
                ;
                int b;
                scanf("%d",&b);
                del(&L,b);
                printf("学生信息删除成功!\n");  
                break;
            case 6:
                display(L);
                break;                  
        }
    }
}

注意:

1.LinkNodeL 指针的指针 L存储着一个地址,L指向该地址,被指向的地址中又存储着一个地址,*L指向LinkNode。
2.在case 中定义变量时候,如果报错,可以在定义变量的语句前面添加一个空语句。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 指针是C语言中广泛使用的一种数据类型。 运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构; ...
    朱森阅读 8,794评论 3 44
  • C语言是面向过程的,而C++是面向对象的 第一章概述 1. C语言的特点 语言简洁、紧凑,使用方便、灵活。共有32...
    小辰带你看世界阅读 5,244评论 0 1
  • C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程...
    小辰带你看世界阅读 4,243评论 0 1
  • 注:这是第三遍读《C语言深度解剖》,想想好像自从大学开始就没读完过几本书,其中谭浩强的那本《C语言程序设计(第四版...
    HavenXie阅读 5,737评论 1 6
  • 这是16年5月份编辑的一份比较杂乱适合自己观看的学习记录文档,今天18年5月份再次想写文章,发现简书还为我保存起的...
    Jenaral阅读 7,876评论 2 9