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