C语言单向链表:创建&&打印#ShadowFox个人作品

本文详细介绍了如何使用C语言创建并打印单向链表,包括定义链表节点、头指针及创建和打印链表的具体步骤。

链表是很多人学习c语言的一个难点,本人刚好学到这一点,花了一些时间弄懂之后,想把它分享出来,以造福后来人。

由于水平实在有限,知识体系也不完全,如果有错误,请联系我,我会尽快改正。

*****************************************************************************************************************

链表是一种能够动态存储数据的一种数据结构。它能够跳跃式存储数据,可以方便数据的操作。

 

1.定义链表节点

 

struct note{

    char name[20];

    int heartlevel;

    struct note *next;

};

我们定义一个名为note的结构。结构内有我们想要存储的数据类型与一个结构指针。这个指针是对链表操作的关键。这里,我想要存储数据生物名称【name】与生物血量【heartlevel】两种数据。

 

2.头指针

根据我的理解,对一个链表操作的入口就是链表的头指针。对头指针的操作我们就可以对整个链表操作。我们在主函数内定义剪标的头指针head,并把它赋值为空值。

    struct note *head;

    head=NULL;

 

3.链表创建函数

这是一个形参为链表头指针,返回值为处理过的链表头指针的函数。先把代码放上来,我会一一说明。

struct note *create(struct note *head){

    struct note *p1=NULL,*p2=NULL;

    char name[20];

    int n;

    while(scanf("%s",name)!=EOF){

        p1=(struct note*)malloc(sizeof(struct note));

        strcpy(p1->name,name);

        scanf("%d",&n);

        p1->heartlevel=n;

        p1->next=NULL;

        if(head==NULL)

            head=p1;

        else

            p2->next=p1;

        p2=p1;

    }

    return head;

}

这里的关键是指针p1与p2,我的理解是p2更像是一个记录者,而p1是操作者。

先把p1与p2赋值为空。

 用

    char name[20];

    int n;

来承载输入的数据。

  当输入不为EOF时,即有输入时,p1来申请一个新的节点(malloc为内存申请函数,返回申请空间的头指针)。请注意:最后有一句p2=p1;,这意味着这里p1指向新节点后p2仍保存着p1原来的值,这是一个关键。

我们继续,将输入的数据放在p1申请的新节点后,p1->next赋值为NULL,因为我们不知道p1是不是最后一个节点,如果是最后一个节点,那么其不应该存在指向其他地方的指针。

  最后这个if语句是个关键,它分了两种情况:头指针是NULL或不是NULL。如果头指针是NULL,那么证明这一遍while循环是创建第一个节点的循环,头指针应该指向第一个节点的位置,即head=p1;。如果头指针不是NULL,那么这是一个创建中间节点的过程。大家是否记得上文:“p1指向新节点后p2仍保存着p1原来的值”。p2仍保存着上一个节点的值,上一个节点的next通过p2->next指向p1,即实现了本个节点与上一个节点的链接。最后p2=p1,p2存储了p1的值,然后p1进行下一个节点的操作。

  本函数返回值是创建好的链表第一个节点的指针,即此链表的头指针。

 

4.链表的打印

  单向链表只要知道其头指针即可对整个链表进行操作。我们创建一个形参为头指针,返回值为空的函数print

先放代码:

void print(struct note *head){

    struct note *temp;

    temp=head;

    while(temp!=NULL){

        printf("name=%s ,heartlevel=%d\n",temp->name,temp->heartlevel);

        temp=temp->next;

    }

}

为了改变头指针,我们创建一个临时指针temp来操作

  因为链表最后一个节点的next是NULL,我们只要让temp==NULL时停止循环即可

temp不断读取当前节点数据,然后指向下一节点,即可完成对整个链表的输出。

 

因为水平问题,可能有一些错误或短视的地方,请谅解。

 

附上全部代码

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

struct note{

    char name[20];

    int heartlevel;

    struct note *next;

};

 

struct note *create(struct note *head){

    struct note *p1=NULL,*p2=NULL;

    char name[20];

    int n;

    while(scanf("%s",name)!=EOF){

        p1=(struct note*)malloc(sizeof(struct note));

        strcpy(p1->name,name);

        scanf("%d",&n);

        p1->heartlevel=n;

        p1->next=NULL;

        if(head==NULL)

            head=p1;

        else

            p2->next=p1;

        p2=p1;

    }

    return head;

}

 

void print(struct note *head){

    struct note *temp;

    temp=head;

    while(temp!=NULL){

        printf("name=%s ,heartlevel=%d\n",temp->name,temp->heartlevel);

        temp=temp->next;

    }

}

 

int main(int argc, const char * argv[]) {

    struct note *head;

    head=NULL;

    head=create(head);

    print(head);

    return 0;

}

 

#include<stdio.h> #include<stdlib.h> //#include"hpoly.h" #define NULL 0 typedef struct pnode { float coef; int exp; struct pnode *next; } PolyList; void PrintPoly(PolyList*head) {PolyList*p; int m=0; p=head->next; while(p!=NULL) {printf("\t%5d%5d",p->coef,p->exp); p=p->next;m++; if(m%4==0) printf("\n\t");} printf("\n\n\t多项式项数m=%d\n",m); system("pause"); } PolyList*CreatePoly() {PolyList*head,*p,*tail; int ic,ie; head=(PolyList * )malloc(sizeof(PolyList)); head->next=NULL; tail=head; printf("请输入系数和指数(ic,ie),直到输入0为止:\n"); scanf("%d,%d",&amp;ic,&amp;ie); while(ic!=0) {p=(PolyList * )malloc(sizeof(PolyList)); p->coef=ic;p->exp=ie; tail->next=p; tail=p; tail->next=NULL; scanf("%d,%d",&amp;ic,&amp;ie); } return(head); } void PolyAdd(PolyList *PLA, PolyList *PLB) { PolyList *pa,*pb,*tail,*s; int sum; pa = PLA->next; pb = PLB->next; tail = PLA; PLB->next = NULL; while (pa != NULL &amp;&amp; pb != NULL ) { if ( pa->exp < pb->exp ) { tail->next = pa; tail = pa; pa = pa->next; } else if ( pa->exp > pb->exp ) { tail->next = pb; tail = pb; pb = pb->next; } else { sum = pa->coef + pb->coef; if ( sum != 0 ) { pa->coef = sum; tail->next = pa;tail = pa; pa = pa->next; s = pb; pb = pb->next; free(s); } else { s = pa; pa = pa->next; free(s); s = pb; pb = pb->next; free(s); } } } if(!pa&amp;&amp;!pb) tail->next=NULL; else if ( pa != NULL ) tail->next = pa; else tail->next = pb; } void main() {PolyList *PLA,*PLB; PLA=CreatePoly(); PLB=CreatePoly(); system("cls"); printf("多项式A:\n"); PrintPoly(PLA); printf("多项式B:\n"); PrintPoly(PLB); PolyAdd(PLA,PLB); printf("和多项式:\n"); PrintPoly(PLA); } 设计算法实现两个一元多项式的建立、相加操作,要求利用原有空间求其和多项式,并且按指数从小到大排列输出这两个多项式及其和多项式,其输出形式为多项式的系数、指数。
最新发布
03-29
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值