本人C语言现已全部学习完啦
本篇章节为自由发挥(我也不想,但真的有点难度)
因为链表的内容涉及到一点数据结构(单链)。且下学期的课程也涉及到数据结构,所有老师并没有太过于严的要求我们,安慰我们说期末考试的题也涉及的很少。可现在不会的下学期都是要还的呀。所以不能松懈!!!
题目一
1,创建一个链表并输出。
我的答案如下:
#include <stdio.h>
#include <stdlib.h>
#define LEN sizeof(struct student)
#define NULL 0
struct student *creat();
void print(struct student *head);
typedef struct student
{
int num;
float score;
struct student *next;
}xiao;
int n;
main()
{
xiao*head;
head=creat();
print(head);
}
struct student *creat()
{
xiao *head,*q1,*q2;
printf("请输入同学们的学号和成绩\n");
printf("输入完毕后输入双'0'\n");
q1=q2=(xiao*)malloc(LEN);
scanf("%d",&q1->num);
scanf("%f",&q1->score);
head=NULL;
n=0;
while(q1->num)
{
n++;
if(n==1)
head=q1;
else
q2->next=q1;
q2=q1;
q1=(xiao*)malloc(LEN);
scanf("%d",&q1->num);
scanf("%f",&q1->score);
}
putchar('\n');
q2->next=NULL;
return head;
}
void print(struct student *head)
{
xiao*p;
p=head;
do
{
printf("第%d号同学的成绩为%.2f\n",p->num,p->score);
p=p->next;
}while(p);
}
链表的创建我们需要三个结构体指针,一个是头指针,一个是尾指针,一个创指针。对应上面的head,q2,q1。首先一个新的节点,需要所有人都指向它,第二个节点时,我们的头指针就可以指着第一个节点不用动了,而尾指针和创指针就继续指着第二个节点,等第三个节点由创指针创立后,就可判断我们是否需要这么多节点了,需要的话,就可使尾指针指向三节点,再由创指针创立新的节点…当我们的节点够之后就可使尾指针指向NULL。而同时创指针也被抛弃了。所以总的来说创指针就是一个开路先锋,而尾指针就是记录领地的人员。头指针就是占守首都的人员。如此如此,一个链表就创建好啦。
题目二
2,删除一个节点。
我的答案如下:
struct student *del(struct student *head,int a)
{
xiao *q1,*q2;
q1=head;
while(q1->num!=a&&q1->next!=NULL)
{
q2=q1;
q1=q1->next;
}
if(a==q1->num)
{
if(q1==head)
head=q1->next;
else
q2->next=q1->next;
}
else
printf("there are no point which you want \n");
return head;
}
删除一个结点,我们需要两个结构体指针,一个用来测试是否为自己想删除的值,一个用来记录上一个节点的地址。因为假设有3个结点,p1.p2.p3。如果我们要删除p2,则只需要将p2->next=p1->next。这样我们的p2兄弟就被抛弃了。所以,我们需要两个指针,一个当p1,一个当p2。就像上面的子函数的 *q1.*q2。
题目三
3,插入一个节点。
我的答案如下:
struct student *insert(struct student *head,struct student *one)
{
xiao *q0,*q1,*q2;
q1=head;
q0=one;
while((q0->num>q1->num)&&(q1->next!=NULL))
{
q2=q1;
q1=q1->next;
}
if(q0->num<=q1->num)
{
if(head==q1)
head=q0;
else
q2->next=q0;
q0->next=q1;
}
else
{
q1->next=q0;
q0->next=NULL;
}
return head;
}
插入一个节点,我们需要事先将此节点创建出来,并使子函数的q0指向它。插入一个函数,我们是需要一定的理由的,比如序号的大小,如果没有顺序的插入,那也没有任何的意义,是吧。这里我们就是以num的大小顺序作为依据,来插入我们的新节点。我们的试探指针q1就用来确定q0应放入的位置了,同时q2指针也紧随q1(原理和删除节点类似)。当我们找到了q0的位置后,只需要将 q2->next=q0同时q0->next=q1,那么一条链表就建立好了。