标签:表示 实现 技术分享 校园 数据 相同 邻居 color new
这里的表只的是一个个节点(一个个校区),节点中有内存可以用爱存储数据(所以叫表,数据表)。
这里的锁链指的是锁链各个表的方法,C语言中用来连接2块表
(1)目标:构建一个链表,将一个数据(譬如1,2,3三个数字)存储在链表中。
#include <stdio.h> #include <stdlib.h> #include <strings.h> struct node { int data; struct node * pNext; }; struct node * creat_node(int data) { struct node * p = (struct node *)malloc(sizeof(struct node)); if(NULL == p) { printf("malloc error"); return NULL; } bzero(p, sizeof(struct node)); p->data = data; p->pNext = NULL; return p; } int main(void) { struct node * pHeader = NULL; pHeader = creat_node(1); pHeader->pNext = creat_node(2); pHeader->pNext->pNext = creat_node(3); printf("pHeadef->data = %d.\n", pHeader->data); printf("pHeader->pNext.data = %d.\n", pHeader->pNext->data); printf("pHeader->pNext->pNext.data = %d.\n", pHeader->pNext->pNext->data); return 0; }
4.9.3.3、从链表头部插入新节点
4.9.3.4、从链表尾部插入新节点
(1)尾部插入链表简单,因为前面已经建立的
struct node { int data; struct node * pNext; }; //创建节点 struct node * creat_node(int data) { struct node * p = (struct node *)malloc(sizeof(struct node)); if(NULL == p) { printf("malloc error"); return NULL; } memset(p, 0, sizeof(struct node)); //给申请的堆内存清0 //bzero(p, sizeof(struct node)); p->data = data; p->pNext = NULL; return p; } //从尾部插入 int insert_tail(struct node * pHeader, struct node * new) { struct node * p = pHeader; if(NULL != p->pNext) { p = p->pNext; } p->pNext = new; } int main(void) { struct node * pHeader = creat_node(1); insert_tail(pHeader, creat_node(2)); insert_tail(pHeader, creat_node(3)); printf("pHeader->data = %d.\n", pHeader->data); printf("pHeader->pNext->data = %d.\n", pHeader->pNext->data); printf("pHeader->pNext->pNext->data = %d.\n", pHeader->pNext->pNext->data); return 0; }
#include <stdio.h> #include <stdlib.h> #include <string.h> struct node { int data; struct node * pNext; }; //创建节点 struct node * creat_node(int data) { struct node * p = (struct node *)malloc(sizeof(struct node)); if(NULL == p) { printf("malloc error"); return NULL; } memset(p, 0, sizeof(struct node)); //给申请的堆内存清0 //bzero(p, sizeof(struct node)); p->data = data; p->pNext = NULL; return p; } //从尾部插入 int insert_tail(struct node * pHeader, struct node * new) { int cnt = 0; struct node * p = pHeader; while(NULL != p->pNext) { p = p->pNext; cnt++; } p->pNext = new; pHeader->data = cnt + 1; } int main(void) { struct node * pHeader = creat_node(0); insert_tail(pHeader, creat_node(1)); insert_tail(pHeader, creat_node(2)); insert_tail(pHeader, creat_node(3)); printf("beader node data = %d.\n", pHeader->data); printf("node1 data = %d.\n", pHeader->pNext->data); printf("node2 data = %d.\n", pHeader->pNext->pNext->data); printf("node3 data = %d.\n", pHeader->pNext->pNext->pNext->data); return 0; }
(1)问题:因为我们在insert_tail中直接默认了头指针指向的有一个节点,因此如果程序中定义了头指针后就直接insert_tail后会出现段错误。我们不得不在定义头指针之后先creat_node后创建一个新节点给头指针初始化,否则不能避免这个错误,但是这样解决让程序看起来逻辑有点不太顺,看起来第一个节点和其他的节点有点不同,显得有些另类。
(2)链表还有另外一种用法,就是把头指针指向的第一个节点当作头结点使用。头结点的特点是:第一,他紧跟在头指针的后面。第二,头结点的数据部分是空的(有时候不是空的,而是存储整个链表的节点数目 )。指针部分指向下一个节点也就是第一个节点。
(3)这样看来头结点和其他节点确实不太一样。我们在创建链表时添加节点的方法也不同。头结点在创建头指针时一并创建并且和头指针关联起来,后面的真正的存储数据的节点用节点添加的函数来完成,譬如insert_node
(4)链表有没有头结点是不同的,体现在链表的插入节点、删除节点、遍历节点、解析链表的各个算法函数都不太。所以如果一个链表设计的时候有头结点,那么后面所有的算法都应该这样来处理。如果设计的时候没有头结点,那么后面所有算法都应该按照没有头结点来做,实际编程中,两种节点都有人用,所以在实际编程中,一应要看别人有没有使用头结点。
标签:表示 实现 技术分享 校园 数据 相同 邻居 color new
原文地址:http://www.cnblogs.com/jxjl/p/7257626.html