单向链表的简单操作

我是一个新手,原谅我不懂得如何给变量命易懂的名字,刚开始我觉得链表很高大上,但是,我觉得链表这个东西只要明白指针是一个地址就可以了。地址就是指内存中特定的存储空间,存储着代码,数据等(内存是分段管理的,分为数据段,代码段,堆栈段等’)。节点什么的,刚开始真心不懂。所以,我就抛开了这个问题,只是要考虑如何把一个个结构体链接起来。那么结构体就应该分为数据区和指针区。指针区储存着下一个结构体的首地址,然后通过这种方式就能把一个个结构体连接起来了。我觉得链表可以大大提高内存利用率,而且拥有多样化数据,然而,我又想到了什么树,于是,我就猜想那什么树不就是相当于一个结构体中有多个指针区吗?这样一个结构体不就储存着多个结构体的首地址,这样的话,如果用一张图来表示他们之间的关系话,那不就是高中所学的树状图啊。目前就是这样想的。但不知道对不对。

#include<stdio.h>
#include<stdlib.h>
#define NULL 0
#define LEN sizeof(struct student)
struct student {
        int math,chinese;
        struct student *next;
     };
     struct student *create(int m)//链表的创建
     {
         struct student *head,*p1,*p2;
         int n=1;
         p1=p2=(struct student*)malloc(LEN);
         scanf("%d%d",&p1->math,&p1->chinese);
         head=p1;
         while(n<m)
         {
            n=n+1;
           p2=p1;
           p1=(struct student*)malloc(LEN);
           scanf("%d%d",&p1->math,&p1->chinese);
           p2->next=p1;
         }
     p1->next=NULL;
    return head;
     }
     void print(struct student *s)//链表的遍历
     {
         struct student *p;
         p=s;
         while(p!=NULL)
         {
             printf("%d %d\n",p->math,p->chinese);
             p=p->next;

         }
     }
     void charu(int which,struct student *head)//链表节点的插入
     {
         int w=1;
         struct student *c,*p,*x;
         c=head;
         while(w!=which)
         {
          w=w+1;
          c=c->next;
          x=c->next;
         } 
         p=(struct student*)malloc(LEN);
         scanf("%d%d",&p->math,&p->chinese);
         c->next=p;
         p->next=x;
     }
     void dele(int n,struct student *head)//链表节点的删除
     {
         int w=1;
         struct student *c,*p,*x;
         c=head;
         x=head->next;
         while(w!=(n-1))
         {

             c=c->next;
             x=c->next;
             w=w+1;
         }
         c->next=(c->next)->next;
         free(x); 
         x=NULL;
     }


 int main()
{
    struct student *d;
    d=create(5);
    print(d);
    charu(2,d);
    print(d);
    dele(2,d);
    print(d);
    return 0;
}


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值