十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
成都创新互联长期为上千家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为海湖新企业提供专业的成都网站建设、网站建设,海湖新网站改版等技术服务。拥有10年丰富建站经验和众多成功案例,为您定制开发。
(一)单向链表的动态建立
假设有如下情景:用一个函数实现创建3个学生的数据的动态链表,包含学生的学号num、成绩score;
思路:
(1)先定义3个变量,head,p1,p2;然后用malloc函数开辟一个节点,让p1、p2两个指针指向这个节点。
(2)从键盘上读取一个学生的数据赋值给这个节点。在此约定学号不能为0,当输入学号为0时候,则代表建立链表结束。
(3)如果这个输入的p1->num!=0,则代表输入的是第一个节点,把这个节点给头指针。即head=p1; 如上图所示
(4)然后再开辟另一个节点,并使得p1指向它,接着从键盘输入数据,如果从键盘的读取到数还是不为0,那么该节点有效。如上图所示
(5)把p1的值赋值给p2->next, 即p2->next=p1; 那么现在两个节点就连到一起了。如上图所示
(6)接着把p2=p1,这样p2就跟上了p1的步伐了,可以开始下一次同样的操作;如上图所示如上图所示
(7)再开辟一个新节点,并使得p1指向它,如果num不为0,那么就吧p1赋值给p2->next,这样3个节点就连接到一起了。如上图所示
(8)以此类推,知道最后输入的num 为0 ,建立结束。如上图所示
更为具体代码如下:
//动态链表的创建; #include#include #define LEN sizeof(struct Student) struct Student //结构体声明 { int num; float score; struct Student* next; }; int n; struct Student *creat(void) { struct Student* head,*p1,*p2; //定义三个指针; n = 0; head = NULL; //头指针初始化为NULL; p1 = p2 = (struct Student*)malloc(LEN); //开辟一个节点,让p1 p2都指向它; scanf_s("%ld,%f", &p1->num, &p1->score); //给这个节点赋值; while (p1->num != 0) //当这个节点的num不为0的时候,说明此节点有效 { n= n + 1; //节点数加1; if (n == 1) head = p1; //如果这是第一个节点,那么就让头指针指向它; else p2->next = p1; //如果不是第一个节点,就让p2指向它,此时的p2是上一个节点的指针; p2 = p1; //之后,让P2跟上P1的步伐,现在p1和p2都指向新的节点了; p1= (struct Student*)malloc(LEN);//开辟一个 新新的节点,让p1指向它,重复之前的步骤 scanf_s("%ld,%f", &p1->num, &p1->score);//输入给新新节点的数据; } p2->next = NULL; //退出while循环的条件是p1->num=0;说明链表建立结束了,之后把p2的后驱指为null即可; return head; //返回头指针; } int main() { struct Student* pt; pt= creat(); printf("\nnum:%ld\nscore:%5.1f\n", pt->num, pt->score); return 0; }