C语言实现动态链表的创建、删除、插入、输出(CentOS6.5上调试成功)

该代码是基于网上其他代码修改而来,原来的代码有错误,以下是我修改后并在CentOS上调试成功的代码:

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

#define LEN sizeof(struct student)

struct student{

    int num;
    char name[10];
    float score;
    struct student *next;
};

static unsigned inode = 1;
void fill(char c[], int n, char ch);//填充数组
void del(struct student *ph, int n);//删除指定序号的节点
void insert(struct student *ph, int n);//在指定序号后插入节点
void output(struct student *ph);//输出所有节点
struct student *input(void);//输入新节点
void clearline(int n);//分割线

int main(){
    
    struct student *head,*ps,*pa,*pb;
    int u;
    char flag = 'y';
    head = ps = pa = (struct student *)malloc(LEN);
    fill(pa->name,10,'\0');
    //输入数据,建立链表
    while(flag != 'n'){
        
        printf("please input student informations: \n");
        printf("Num\tName\tScore\n");
        scanf("%d %s %f", &pa->num, pa->name, &pa->score);
        flag = getchar();
        printf("Press any key input data continue, otherwise press n quit:");
        flag = getchar();
        if(flag != 'n'){

            clearline(60);
            pa->next = (struct student *)malloc(LEN);
            pa = pa->next;
            fill(pa->name,10,'\0');
            inode++;
        }
    }    
    
    pa->next = NULL;
    output(ps);
          //删除节点
    printf("which student's num do you want to del?\n");
    printf("please input the num that you want to del:");
    scanf("%d", &u);
    if(u > inode){

        printf("input error!\n");
        exit(1);
    }

    if(u == 1){

        pb = head;
        ps = head->next;
        free(pb);
        head = pb = pa = ps;
    }else
        del(ps,u);

    output(ps);

    //插入节点
    printf("which student's num do you want to insert after:");
    scanf("%d",&u);
    if(u>inode){

        printf("input error!\n");
        exit(1);
    }

    if(u == 0){

        pb = head;
        head = ps = pa = input();
        pa->next = pb;
        inode++;
    }else{

        insert(ps, u);
    }
    output(ps);
    return 0;

}


void fill(char c[], int n, char ch){

    int i;
    for(i=0;i<=n;i++){

        *(c+i) = ch;
    }

}

void del(struct student *ph, int n){

    int i;
    struct student *pb,*pf;
    pb = pf = ph;
    for(i=1;i<=n-2;i++){

        ph = ph->next;
    }

    if(n == inode){

        pb = ph->next;
        ph->next = NULL;
        free(pb);

    }else{

        pb = ph->next;
        ph->next = (ph->next)->next;
        free(pb);
    }

    inode--;
}

void insert(struct student *ph, int n){

    int i;
    struct student *pa,*pb,*p_new,*ps;
    ps = pa = ph;
    p_new = (struct student *)malloc(LEN);
    fill(p_new->name,10,'\0');
    printf("please input the new student informations:\n");
    printf("Num\tName\tScore:\n");
    scanf("%d %s %f",&p_new->num,p_new->name,&p_new->score);
    for(i=1;i<n;i++){

        pa = pa->next;
    }

    pb = pa->next;
    pa->next = p_new;
    p_new->next = pb;
    inode++;
    
}

void output(struct student *ph){

    int i;
    struct student *pa;
    printf("\n*****students list*****\n");
    printf("Order\tNum\tName\tScore\n");
    
    pa = ph;
    for(i=1;pa!=NULL;i++){

        printf("%d\t%d\t%s\t%.2f\n", i,pa->num,pa->name,pa->score);
        pa=pa->next;
    }

    printf("totol %d \n",inode);
   
}

struct student *input(void){

    struct student *pa;
    pa = (struct student *)malloc(LEN);
    printf("please the new student information\n");
    printf("Num\tName\tScore\n");
    scanf("%d %s %f", &pa->num, pa->name, &pa->score);
    return pa;
}

void clearline(int n){

    int space;
    printf("\r");
    for(space=0;space<n;space++){

        printf("-");
    }
    printf("\r");
}

运行过程及结果:

please input student informations: 
Num     Name    Score
1       aa      10
Press any key input data continue, otherwise press n quit:y
please input student informations: -------------------------
Num     Name    Score
2       bb      20
Press any key input data continue, otherwise press n quit:y
please input student informations: -------------------------
Num     Name    Score
3       cc      30
Press any key input data continue, otherwise press n quit:n

*****students list*****
Order   Num     Name    Score
1       1       aa      10.00
2       2       bb      20.00
3       3       cc      30.00
totol 3 
which student's num do you want to del?
please input the num that you want to del:2

*****students list*****
Order   Num     Name    Score
1       1       aa      10.00
2       3       cc      30.00
totol 2 
which student's num do you want to insert after:1
please input the new student informations:
Num     Name    Score:
2       bb      20

*****students list*****
Order   Num     Name    Score
1       1       aa      10.00
2       2       bb      20.00
3       3       cc      30.00
totol 3 

结束

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值