C语言链表相关问题:

mac2024-03-10  27

文章目录

链表简述计算与指定数字相同的数的个数

链表简述

链表是通过指向结构的指针把自定义的结构类型结点串连起来,形成复杂数据存储模式。下图给出了链表的图形模拟:

head的值为第一个结点的地址,链表以结点为单位进行连接,在C语言中,我们用一个结构体类型表示这个结点

typedef struct node { int data;//数据域 struct node* next;//指针域 }

链表中的的结点与结点之间的相连,取决于结点的结构体类型包含一个指向同种结构的指针next。在单链表中,结点由两部分组成,一个是存储数据的数据域,一个是存储下一个结点地址的指针域。

计算与指定数字相同的数的个数

问题分析: 可能首先想到用数组存放n个整数,也就是先把n个整数存储在数组中,之后读入整数m,循环遍历数组,查看有多少个与m相同的整数。我们此处使用链表代替数组存储数据,遍历链表的关键语句是:

while(p)//当p指针不为空时,p指向链表中的某个结点 { if(p->data==m) { c++; } p=p->next;//获得下一个结点的地址,直到遇到tail->next=NULL;结束循环 }

整体代码

#include <stdio.h> #include <stdlib.h> typedef struct node { int data; struct node *next; }Node; int count(Node* head,int m);//统计单链表head中结点数据域值与m相等的个数 void destroy(Node* head);//释放链表所占空间 int main(void) { int n,x,m;//n为链表结点个数、x为存放链表结点每个数据域的值以及m为待查找数 Node *head = NULL,*s,*tail; //head为头指针,tail为尾指针 ,s为动态分配的每个结点 printf("请输入链表结点的个数:"); scanf("%d",&n); for(int i=1;i<=n;i++)//读入n个数 { printf("请输入第%d个结点的数据域的值:",i); scanf("%d",&x); s=(Node*)malloc(sizeof(Node));//为读入的整数动态分配一个链表结点,s指向这个结点 s->data=x;//链表结点的数据域赋值为x if(i==1) { head=s;//头指针指向第一个结点 } else { tail->next=s;//将当前结点(最后结点)的指针域指向下一个结点 } tail=s;//每循环一次,都会执行一次该语句,将新结点赋值为最后结点 } tail->next=NULL;//尾结点的指针域为NULL printf("请输入待查找的数:"); scanf("%d",&m); printf("链表数据中有%d个与%d相同的数据!",count(head,m),m); destroy(head); head=NULL; return 0; } int count(Node* head,int m) { int c=0;//计数器 Node *p=head;//p指向链表的第一个结点 while(p)//当p指针不为空时,p指向链表中的某个结点 { if(p->data==m) { c++; } p=p->next;//获得下一个结点的地址,直到遇到tail->next=NULL;结束循环 } return c; } void destroy(Node* head) { Node *p=head;//p指向第一个结点 Node *q; while(p) { q=p; p=p->next; free(q);//释放q所指向的空间 } }

输出: 代码释疑:

for(int i=1;i<=n;i++)//读入n个数 { printf("请输入第%d个结点的数据域的值:",i); scanf("%d",&x); s=(Node*)malloc(sizeof(Node));//为读入的整数动态分配一个链表结点,s指向这个结点 s->data=x;//链表结点的数据域赋值为x if(i==1) { head=s;//头指针指向第一个结点 } else { tail->next=s;//将当前结点(最后结点)的指针域指向下一个结点 } tail=s;//每循环一次,都会执行一次该语句,将新结点赋值为最后结点 }

构造一个循环n次的for循环,每循环一次读取一个整数,为这个整数动态分配内存空间,用s指针变量指向这个新创建的结点,之后把该结点链接到链表的尾部。当插入的是第一个结点时,由于原来链表尾NULL,也就是head值为NULL,这时需要让head指向第一个结点,每插入一个结点到链表表尾后,指向链表表尾的指针都会指向这个新插入的结点,这里用tail指针变量指向表尾结点。这种方法称为尾插法建立链表。下面演示用头插法建立链表:将代码22~30行修改为:

最新回复(0)