使用结构和指针(单/双链表)
2017-07-08 22:47
295 查看
单链表
为了记住链表的起始位置,可以使用一个根指针。根指针指向链表的第一个节点。 注意,根指针只是一个指针,它不包含任何数据,它指向链表的第一个节点。插入数据到链表中,对于无序单链表,新值可以插入到任何位置。 把一个新节点插入到链表需要两个步骤。首先,新节点的link字段必须设置为指向它的目标后续节点。其次,前一个节点的link字段必须设置为指向这个新节点。
例:
链表结构
typedef struct NODE{ struct NODE *link; int value; }Node;
创建一个头节点
Node *root = (Node *)malloc(sizeof(Node)); if(root == NULL) { printf("malloc error!\n"); return; }
初始化链表
Node *q = (Node *)malloc(sizeof(Node)); q->value = 3; root->link = q; q->link = NULL;
升序插入一个节点的方法
int insertNode(Node *root,int value) { Node *current,*new; new = (Node *)malloc(sizeof(Node)); while((current = root->link) != NULL && current->value < value) { root = current; } new->value = value; new->link = current; root->link = new; return TRUE; }
双链表
双链表中的每个节点包含两个link字段:其中一个指向链表的下一个节点,另一个指向链表的前一个节点。双链表有两个根指针,分别指向第一个节点和最后一个节点。因此,遍历双链表可以从任何一端开始,而且在遍历过程中可以改变方向。为了把一个新节点插入到双链表中,我们必须修改四个指针。新节点的前向和后向link字段必须被设置,前一个节点的后向link字段和后一个节点的前向link字段也必须进行修改,使它们指向这个新节点。
当我们把一个节点插入到一个链表时,可能出现四种情况:
1.新值可能插入到链表的中间位置
2.新值可能插入到链表的起始位置
3.新值可能插入到链表的结束位置
4.新值可能即插入到起始位置也插入到结束位置(原链表为空)
例:
链表结构:
typedef struct doubleNode{ struct doubleNode *fwrd; struct doubleNode *bwrd; int value; }DoubleNode;
初始化
root = (DoubleNode *)malloc(sizeof(DoubleNode)); q = (DoubleNode *)malloc(sizeof(DoubleNode)); root->fwrd = q; root->bwrd = q; q->value = 5;
根据四种情况升序插入链表的结构
/*如果链表已经有该值,则返回0,如果插入正常,返回1*/ int doubleinsert(DoubleNode *link,int value) { DoubleNode *this,*next,*newnode; this = link; for(;(next = this->fwrd) != NULL;this = next) { if(next->value == value) { printf("The insert value again"); return FALSE; } if(next->value > value) { break; } } newnode = (DoubleNode *)malloc(sizeof(DoubleNode)); newnode->value = value; if(newnode == NULL) { printf("Malloc newnode error!\n"); return FALSE; } /*head and middle insert*/ if(next != NULL) { if(next->bwrd == NULL) { printf("head insert!\n"); newnode->fwrd = next; next->bwrd = newnode; this->fwrd = newnode; } else { printf("middle insert!\n"); newnode->fwrd = next; next->bwrd = newnode; this->fwrd = newnode; newnode->bwrd = this; } } /*tail and headandtail insert*/ else { if(this->bwrd != NULL) { printf("tail insert!\n"); this->fwrd = newnode; newnode->bwrd = this; link->bwrd = newnode; newnode->fwrd = NULL; } else { printf("headandtail insert!\n"); this->fwrd = newnode; link->bwrd = newnode; newnode->fwrd = NULL; } } return TRUE; }
相关文章推荐
- C和指针 第十二章 使用结构和指针 双链表和语句提炼
- 使用结构指针实现链表
- 链表--结构与指针使用
- 双向链表 只使用一个指针
- 结构体指针的定义和使用
- 链表的Java实现(使用内部类作为指针的引用)
- C primer plus:在结构中使用指针,使用malloc分配指针空间以及free
- 结构之美:单链表的头结点与头指针
- 使用LINUX C实现一个链表,要求:链表节点构成:姓名、分数、下一个节点指针...
- 结构成员指针的使用
- .net 数据结构与算法基础:泛型链表使用
- bo2-4.cpp设立尾指针的单循环链表(存储结构由c2-2.h定义)的12个基本操作
- 使用指针P,Q使链表反转
- 链表操作(从尾到头打印链表,使用栈结构实现)
- 使用链表实现环结构以解决约瑟夫环问题
- 指针在数组和链表中的访问使用误区
- (摘)面向对象c++数据结构之基本数据结构-链表-使用链表管理器(连载中)
- 练习指针构造链表,及链表的使用 ———寒星
- 使用指针链表解决约瑟夫环问题
- C++指向结构体变量的指针与链表结构的关系应用