C语言基础之——链表的基本操作
上节我们介绍了链表的创建以及初始化等操作实现,本节我们一起来学习链表的一些基本操作,包括对链表中数据的增加、删除、查找、遍历、修改等。
链表的增加
链表的增加,即向链表中插入一个结点,以位置为单位,插入的位置如果是1,则将此新增结点作为首元结点插入。
步骤:
1、将新增结点的next指针指向插入位置后的结点。
2、将插入位置前结点的next指针指向插入结点。
代码如下:
link_t *InsertElem(link_t *p,int elem,int add_location) //p--original link;elem--insert elem;add_location---insert location
{
//create temp node
link_t *temp = p;
//find the insert location node's previous node temp.
for(int i=1;i<add_location;i++)
{
if(temp == NULL)
{
printf("err insert location\r\n");
return p;
}
//move temp node
temp = temp->next;
}
//create insert node
link_t *c = (link_t *)malloc(sizeof(link_t));
c->data = elem;
c->next = temp->next;
temp->next = c;
return p;
}
链表插入元素的操作必须是先步骤 1,再步骤 2;反之,若先执行步骤 2,会导致插入位置后续的部分链表丢失,无法再实现步骤 1。
链表的删除
链表的删除,即将链表中指定位置的结点删除,由于结点在创建时,动态申请了内存,因此删除位置上的结点后,需要将此部分的内存回收,避免发生内存泄漏。
删除的步骤如下:
1、找到要删除结点的直接前驱结点temp,执行操作:
next = temp->next->next
2、free删除结点申请的内存空间。
代码如下:
link_t *DelElem(link_t *p,int del_location)
{
link_t *temp = p;
//find the del node's previous node temp.
for(int i=1;i<del_location;i++)
{
temp = temp->next;
}
link_t *del_node = temp->next; //set one node point to the del node to avoid it lost.
temp->next = temp->next->next; //move the del node's next node to the previous node.
free(del_node); //remember free memory
return p;
}
链表元素的查找
链表元素的查找,即在链表中查找该元素所处的位置。
在链表中查找指定数据元素,最常用的方法是:从表头依次遍历表中结点,用被查找元素与各结点数据域中存储的数据元素进行比对,直至比对成功或遍历至链表最末端的 NULL(比对失败的标志)。
代码如下:
int SelectElem(link_t *p,int elem)
{
//create a point ,init as the header point;
link_t *t = p;
int i = 1;
//because of header_point exist,use while(t->next).
while(t->next)
{
t = t->next; //set t as first node.
if(t->data == elem)
{
return i;
}
i++;
}
return -1;
}
链表元素的更新
更新链表元素,即将链表中指定位置的元素,替换成想要的元素。
步骤:
1、遍历链表,找到结点位置。
2、替换结点数据。
代码如下:
link_t *update_link(link_t *p,int del,int NewElem)
{
link_t *temp = p;
temp = temp->next; //temp point to the first node.
for(int i=1;i<del;i++) //temp point to the del node.
{
temp = temp->next;
}
temp->data = NewElem;
return p;
}
完整代码
typedef struct _link_t
{
int data;
struct _link_t *next;
}link_t;
link_t *link_init()
{
//create a header pointer
link_t *header_p = NULL;
//create a header node
link_t *header_node = (link_t *)malloc(sizeof(link_t));
header_p = header_node;
for(int i=1;i<5;i++)
{
//create other nodes
link_t *temp = (link_t *)malloc(sizeof(link_t));
temp->data = i;
temp->next = NULL;
//establish contact with previous node.
header_node->next = temp; //do not write header_p->next = temp!because header_p should always point to the header_node.
//move the precursor node to the next
header_node = header_node->next;
}
return header_p;
}
link_t *InsertElem(link_t *p,int elem,int add_location) //p--original link;elem--insert elem;add_location---insert location
{
//create temp node
link_t *temp = p;
//find the insert location node's previous node temp.
for(int i=1;i<add_location;i++)
{
if(temp == NULL)
{
printf("err insert location\r\n");
return p;
}
//move temp node
temp = temp->next;
}
//create insert node
link_t *c = (link_t *)malloc(sizeof(link_t));
c->data = elem;
c->next = temp->next;
temp->next = c;
return p;
}
link_t *DelElem(link_t *p,int del_location)
{
link_t *temp = p;
//find the del node's previous node temp.
for(int i=1;i<del_location;i++)
{
temp = temp->next;
}
link_t *del_node = temp->next; //set one node point to the del node to avoid it lost.
temp->next = temp->next->next; //move the del node's next node to the previous node.
free(del_node); //remember free memory
return p;
}
int SelectElem(link_t *p,int elem)
{
//create a point ,init as the header point;
link_t *t = p;
int i = 1;
//because of header_point exist,use while(t->next).
while(t->next)
{
t = t->next; //set t as first node.
if(t->data == elem)
{
return i;
}
i++;
}
return -1;
}
link_t *update_link(link_t *p,int del,int NewElem)
{
link_t *temp = p;
temp = temp->next; //temp point to the first node.
for(int i=1;i<del;i++) //temp point to the del node.
{
temp = temp->next;
}
temp->data = NewElem;
return p;
}
void display(link_t *node)
{
while(node->next) //if the first node is not empty
{
node = node->next;
printf("%d",node->data);
}
printf("\r\n");
}
int main(void)
{
int i = 0;
link_t *p = NULL;
p = link_init();
printf("Link elem is:\r\n");
display(p);
InsertElem(p,6,1);
display(p);
DelElem(p,1);
display(p);
i = SelectElem(p,3);
printf("%d\r\n",i);
display(p);
update_link(p,3,8);
display(p);
return 0;
}
运行
小结
QQ交流群:906015840 (备注:物联网项目交流)
静晨出品:静之所想,晨之所计