每天一道数据结构-单链表

很久没有写c了,都已经忘的差不多了。下决心从今天开始每天用c练习下数据结构。现在感觉底层的东西太重要。下面是我写的c:希望csdn的高手们能够指点指点,哪里算法可以改进改进的。谢谢了!
#include "stdio.h"
#define TYPE struct student
#define LEN sizeof(struct student)
#define NULL 0
struct student{
    int no;
    TYPE *next;
};

TYPE *create(int n){
    TYPE *header,*ps,*p;
    int i;
    p = (TYPE *) malloc(LEN);
    for(i=0;i<n;i++) {
        p = (TYPE *) malloc(LEN);
        printf("please input the no:");
        scanf("%d",&p->no);
        if(i==0) {
            header = ps = p;
        }
        ps->next = p;
        p->next = NULL;
        ps=p;
    }
    return header;

}

int getLength(TYPE *list) {
    TYPE *ps;
    int length=0;
    ps=list;
    while(ps->next != NULL) {
        length++;
        ps=ps->next;
    }
    return length +1;
}

TYPE *insert(TYPE *list, int n) {
    TYPE *header,*ps,*p;
    header=ps=list;
    while(ps!=NULL) {
        n--;
        if(n==0) {
             p=(TYPE *) malloc(LEN);
             printf("please input the no:");
             scanf("%d",&p->no);
             p->next=ps->next;
             ps->next=p;
        }
        ps=ps->next;
    }
    return header;
}

TYPE *removeByPosition(TYPE *list,int n) {
    TYPE *header,*ps;
    int i= 0;
    header = ps = list;
    if(n>getLength(ps) || n<=0) {
        printf("the wrong position!");
        getch();
        exit(0);
    }
    while(ps!=NULL) {
        i++;
        if(i==n) {
            ps->next=ps->next->next;
        }
        ps=ps->next;
    }
    return header;
}

TYPE *removeByPositionAndValue(TYPE *list,int n,int value) {
    TYPE *header,*ps;
    int i= 0;
    header = ps = list;
    if(n>getLength(ps) || n<=0) {
        printf("the wrong position!");
        getch();
        exit(0);
    }
    while(ps!=NULL) {
        i++;
        if(i==n && ps->no == value) {
            ps->next=ps->next->next;
        }
        ps=ps->next;
    }
    return header;
}

TYPE *print(TYPE *list) {
    while(list!=NULL) {
        printf("%-4d",list->no);
        list=list->next;
    }
}

main() {
    TYPE *list = create(4);
   /*printf("%d",getLength(list));
    printf("%d",getLength(insert(list,2)));
    printf("%d",getLength(removeByPosition(insert(list,2),1)));*/
    printf("%d",getLength(removeByPositionAndValue(insert(list,2),1,3)));
    print(list);
    getch();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值