C语言程序设计

  1. 设计内容

建立一个动态链表,链表中每一结点包括:学号、姓名、性别、年龄、成绩。程序能实现以下功能:

  • 建立链表
  • 显示链表
  • 查找链表中是否存在某个元素,并显示这个元素的所有信息,若没有这个元素则显示"无此记录!"的信息。
  • 删除链表中指定学号的结点。
  • 在链表中指定的位置插入一个新结点(学号不能和其他结点重复)。

    2.  具体代码

#include<stdio.h>

#include<stdlib.h>

#include<malloc.h>

#include<string.h>/*头文件*/

 

 

struct Node

{

    char name[20];

    long id;

    char gender[10];

    int age;

    int score;

    struct Node *next;

};/*创建结构体*/

 

 

typedef struct Node ListNode;/*声明*/

ListNode *build(int n) /*创建链表*/

{

    ListNode *head;

    ListNode *p,*pre;

    int i;

    head=(ListNode *)malloc(sizeof(ListNode));/*为头节点分配内存空间*/

    head->next=NULL;

    pre=head;

    for(i=1;i<=n;i++)/*通过for循环不断加入新的结点*/

    {

        printf("请输入第 %d 个学生的信息:\n",i);

        p=(ListNode *)malloc(sizeof(ListNode));

        printf("请输入姓名:\n");/*输入数据*/

        scanf("%s",&p->name);

        printf("请输入学号:\n");

        scanf("%ld",&p->id);

        printf("请输入性别:\n");

        scanf("%s",&p->gender);

        printf("请输入年龄:\n");

        scanf("%d",&p->age);

        printf("请输入分数:\n");

        scanf("%d",&p->score);

        pre->next=p;

        pre=p;

    }

    p->next=NULL;

    return head;/*返回这个链表的首地址*/

}

 

void output(ListNode *h) /*输出链表*/

{

    ListNode *p;

    if(h==NULL)

        printf("无数据\n");

    else

    {

        p=h->next;

        while(p)

        {

            printf("%s,%ld,%s,%d,%d",p->name,p->id,p->gender,p->age,p->score);

            p=p->next;

            printf("\n");

        }

    }

}

 

void Insert(ListNode *h,int n) /*插入链表结点*/

{

    ListNode *q,*p;

    int j,i;

    printf("插入数据的位置:\n");

    scanf("%d",&i);

    if(i<1 || i>n+1)

        printf("错误,请重新输入.\n");

    else

    {

        j=0;

        p=h;

        while(j<i-1)

        {

            p=p->next;

            j++;

        }

        q=(ListNode *)malloc(sizeof(ListNode));/*为要插入的结点分配内存空间*/

        printf("请输入姓名:\n");/*赋值操作*/

        scanf("%s",&q->name);

        printf("请输入学号:\n");

        scanf("%ld",&q->id);

        printf("请输入性别:\n");

        scanf("%s",&q->gender);

        printf("请输入年龄:\n");

        scanf("%d",&q->age);

        printf("请输入分数:\n");

        scanf("%d",&q->score);

        q->next = p->next; /*调整指针域*/

        p->next=q;

    }

}

 

void deletes(ListNode *h,int n) /*函数功能:删除链表结点*/

{

    ListNode *p,*q;

    int j,i;

    printf("请输入要删除的数据的位置:");

    scanf("%d",&i);

    if(i<1 || i>n)/*如果位置超出了1和n的范围的话则打印出错误信息*/

        printf("错误,请重新输入.\n");

    else

    {

        j=0;

        p=h;

        while(j<i-1)

        {

            p=p->next;

            j++;

        }

        q=p->next;

        p->next=q->next;

        free(q);//释放q指向的结点

        printf("第%d个数据已删除:\n",i);

    }

}

 

find(ListNode *h)/*按序号查找链表*/

{

    int ii,ij;

    printf("请输入要查询的序号:\n");

    scanf("%d",&ii);

    ListNode *p;

    p=h->next;

    if(p==NULL)

        printf("未找到\n");

    else

        ij=1;

    while(p!=NULL&&ij<ii)

    {

        p=p->next;

        ij++;

    }

    if(ii==ij)

        output(p);

    else

        printf("未找到:\n");

}

 

 

void txtleletters() /*主标题*/

{

    printf("1.建立 \n");

    printf("2.显示 \n");

    printf("3.查找 \n");

    printf("4.插入 \n");

    printf("5.删除 \n");

    printf("6.退出 \n");

    printf("请输入要选择功能的序号:");

}

 

 

 

void main() /*主函数*/

{

    ListNode *h;

    ListNode *f;

    h=NULL;

    int i, n;

    txtleletters();

    while (1)

    {

        printf("\n");

        scanf("%d",&i);

        switch(i)

        {

        case 1:

            printf("请输入创建链表节点的个数:\n"); /*输入创建链表结点的个数*/

            scanf("%d",&n);

            h=build(n);

            printf("现有成员的信息:\n");

            output(h);

            txtleletters();

            break;

        case 2:

            printf("现有成员信息: \n");

            output(h);

            txtleletters();

            break;

        case 3:

find(h);

            txtleletters();

            break;

        case 4:

            Insert(h,n);

            printf("现有成员信息:\n");

            output(h);

            txtleletters();    

            break;

        case 5:

            deletes(h,n);

            printf("现有成员信息: \n");

            output(h);

            txtleletters();

            break;

        case 6:

            return;

            break;

        default:

            printf("错误的选项,请重新选择:\n");

        }

    }

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值