C:编程练习7:链表的操作(复习)

本人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,那么一条链表就建立好了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值