这里介绍两种代码最简单(emmm 应该是最简单的)的单链表和双链表的插入操作
- 单链表
#include <stdlib.h>
#include <stdio.h>
#define FALSE 0
#define TRUE 1
struct Node
{
Node *link;
int value
}
/* linkp在作为参数传递时指示的是指向根指针的指针 */
int sll_insert(register Node **linkp,int new_value)
{
register Node *current;
register Node *new;
// 遍历链表,知道新的值大于或等于节点的值
while((current=*linkp)!=NULL && current->value<new_value)
linkp=¤t->link;
new=(Node *)malloc(sizeof(Node));
if(new==NULL)
return FALSE;
new->value=new_value;
// 插入新节点
new->link=current;
*linkp=new;
return TRUE;
}
- 双链表
#include <stdlib.h>
#include <stdio.h>
struct Node
{
Node *fwd;
Node *bwd;
int value
}
/* rootp在作为参数传递时指示的是根指针 */
int dll_insert(register Node *rootp,int new_value)
{
register Node *this;
register Node *next;
register Node *newnode;
/*
遍历链表,查看new_value是否已经存在与链表中,
是就返回知道新的值大于或等于节点的值,
否就新建一个节点存储新的值,
this指向新节点之前的节点,
next指向新节点之后的节点。
*/
for(this=rootp;(next=this->fwd)!NULL;this=next)
{
if(next->value==new_value)
return 0;
if(next->value>new_value)
break;
}
newnode=(Node *)malloc(sizeof(Node));
if(new_value==NULL)
return -1;
newnode->value=new_value;
newnode->fwd=next;
this->fwd=newnode;
// 如果插入的节点不是在起始位置
if(this!=rootp)
newnode->bwd=this;
else
newnode->bwd=NULL;
// 如果插入的节点不是在末尾位置
if(next!==NULL)
next->bwd=newnode;
else
rootp->bwd=newnode;
return 1;
}