逐个代码行讲解最简单链表,并画出链表代码示意图。这个需要多画画图才能理解。
一、先定义一个结构体
typedef struct { int data; //数据域 struct LNODE *next; // 指向下一个结构体的指针域 } LNODE,*LinkList; // 结构体的别名
二、前插法
LinkList creat(LinkList L,int NUM) { int i; LinkList p,q; L = (LinkList)malloc(sizeof(LNODE)); // 赋予节点空间 (LinkList)为L的类型 malloc (sizeof(LNODE))为赋予LNODE大小的指针 L->next =NULL; // 初始化链表 先建立一个带头结点的空链表 for(i=0; i<NUM; i++) { p= (LinkList)malloc(sizeof(LNODE)); // 每插入一个节点都需要分配空间 if(!p) { exit(0); // 判断分配空间成功与否 } printf("Please input the data of Car\n"); scanf("%d",p->data); p->next=L->next; // L的下一个节点与p的下一个节点连接,即P后面放置L的下一个节点 L->next=p; // L的下一个节点被p覆盖掉,p成了L的下一个节点,且p的下一个节点是L之前的下一个节点 } return L; }
三、后插法
LinkList creat(LinkList L,int NUM) { int i; LinkList p,q; //创建q的原因是因为,q在下面会不断变为尾节点,故不可以用L,L不变才能正常顺序输出 L = (LinkList)malloc(sizeof(LNODE)); // 赋予节点空间 (LinkList)为L的类型 malloc (sizeof(LNODE))为赋予LNODE大小的指针 L->next =NULL; // 初始化链表 先建立一个带头结点的空链表 q= (LinkList)malloc(sizeof(LNODE)); // q 本身是一个节点 (important) q=L; //将L赋予q for(i=0; i<NUM; i++) { p= (LinkList)malloc(sizeof(LNODE)); // 每插入一个节点都需要分配空间 if(!p) { exit(0); // 判断分配空间成功与否 } printf("Please input the data of Car\n"); scanf("%d",p->data); p->next=NULL; q->next=p; //将P放置在q(L)后面 q=p; //q指向新节点*P ( p(节点)向右移一位,为尾节点)便于插入新数据 } return L; }