标签:序号 mamicode 约瑟夫环问题 静态 取值 需要 动态分配 固定 循环
1. 用结构体数组的方式声明,所占的存储空间是固定的,例如:
struct StructName{
int a;
long b;
char c[size];
struct StructName *next; //静态链表区别于数组的地方,包含了一个指向同类型结构体的指针
}List[LEN]; //一条长度固定的链表
2. 链表访问其中一个结点的数据不能像结构体数组那样用点运算符取值,需要用"->"来访问其中的数据
例如:
struct Node a,*p=&a; //同时定义了一个结构体a和一个结构体指针p;
a.next = &a;
p -> next = p; //两者区别
3. 代码练习,用静态链表解决约瑟夫环问题
#include <stdio.h> #include <stdlib.h> int main() { struct List{ int no; struct List *next; }list[13]; //建立静态链表 int i,n=1; struct List *p = list; //遍历指针 for(i=0;i<12;i++) { list[i].no = i+1; list[i].next = &list[i+1]; //初始化 } list[12].no = 13; list[12].next = list; //循环链表 while(1) { if(p->next == p) break; if(n+1 == 3) //下一个结点是3 { n = 1; p->next = (p->next)->next; //将下一个结点删除 } else n++; p = p->next; } printf("最后留下来的人最初的序号为 %d\n",p->no); return 0; }
1. 动态分配存储空间,会用到malloc和free函数,值得注意的一点是调用malloc()之后返回的指针不是结构体类型的指针,需要强制类型转换
动态建立链表的过程中需要三个结构体指针标定位置:
头指针head指向链表第一个结点,p1指向当前结点,p2指向下一个结点
如图所示
2. 动态链表的插入和删除就是在修改对应结点的指针指向,程序结束要遍历所有结点用free函数释放分配的存储空间
3. 在C++和Java中几乎不使用结构体来构造链表,你可以使用Vector和ArrayList动态数组满足你的要求,这些数据结构隐去了实现细节,你只需要知道怎么用就好
1.单向链表
一个结点只包含一个指向的链表,只具备顺推功能,不具备回溯能力
2.双向链表
一个结点包含prev和next两个指向的指针,既可以顺推也可以回溯
3.循环链表
循环链表也有单项和双向之分,图中描述的是单向循环链表
最后,链表是一类复杂的数据结构,光理解它是远远不够的,运用并掌握它才是难点。
标签:序号 mamicode 约瑟夫环问题 静态 取值 需要 动态分配 固定 循环
原文地址:https://www.cnblogs.com/lemon-567/p/14155091.html