名单(两)——基本操作单向链表(创、删、印、节点统计数)
1.指针联动
通过两个指针指向前任和后继节点,而移动一个单向链表,当被处理的指针的节点,节点的前体也有一个指针。
2.有一种无序单向链表。和数据字段值不一样。指针pmin最小点值节点,和指针prem最小点值结点的前驱结点:
代码片段:
for(p = head; p; q = p, p = p->next)
{
if(pmin->data > p->data)
{
pmin = p;
prem = q;
}
}
3.单向链表的删除算法
注:使用malloc函数分配的结点单元必须使用free函数来释放。free(p)之后,p所指向的单元被释放。p被系统又一次赋值为随机值,p仅仅能在程序执行完毕之后自己主动清除。
头结点的删除:head = head->next;free(pdel);
非头结点的删除:ppre->next = pdel->next;free(pdel);
4.样例
注:单向链表的最主要的操作,新建一个链表、删除一个元素、打印链表、统计链表的个数、删除链表。
通过两个指针指向前任和后继节点,而移动一个单向链表,当被处理的指针的节点,节点的前体也有一个指针。
2.有一种无序单向链表。和数据字段值不一样。指针pmin最小点值节点,和指针prem最小点值结点的前驱结点:
代码片段:
for(p = head; p; q = p, p = p->next)
{
if(pmin->data > p->data)
{
pmin = p;
prem = q;
}
}
3.单向链表的删除算法
注:使用malloc函数分配的结点单元必须使用free函数来释放。free(p)之后,p所指向的单元被释放。p被系统又一次赋值为随机值,p仅仅能在程序执行完毕之后自己主动清除。
头结点的删除:head = head->next;free(pdel);
非头结点的删除:ppre->next = pdel->next;free(pdel);
4.样例
注:单向链表的最主要的操作,新建一个链表、删除一个元素、打印链表、统计链表的个数、删除链表。
#include <stdio.h>
#include <malloc.h>
#define NULL 0
typedef struct node {
int data;
struct node *next;
}ElemSN;
ElemSN * creat_link(int ms); //逆向创建一个链表
void print_link(ElemSN *head); //输出单向链表
ElemSN * delete_node(ElemSN *head, int x); //删除链表中的一个结点
int count_link(ElemSN *head); //统计单向链表结点的个数
ElemSN * clear_link(ElemSN *head); //删除链表
int main()
{
ElemSN *head;
int ms, x;
printf("Please input node number:");
scanf("%d", &ms);
head = creat_link(ms);
print_link(head);
printf("Please input delete node:");
scanf("%d", &x);
head = delete_node(head, x);
print_link(head);
printf("link member is :%d\n", count_link(head));
head = clear_link(head);
}
ElemSN * creat_link(int ms)
{
ElemSN *h = NULL, *p;
int i, x;
for(i = 0; i < ms; i++)
{
printf("Please input data:");
scanf("%d", &x);
p = (ElemSN *)malloc(sizeof(ElemSN));
p->data = x;
p->next = h;
h = p;
}
return h;
}
void print_link(ElemSN *head)
{
for(; head; head = head->next)
{
printf("%d ", head->data);
}
printf("\n");
}
ElemSN * delete_node(ElemSN *head, int x)
{
ElemSN *p = NULL, *q = NULL;
if(NULL == head)
{
return NULL;
}
for(p = head; p && p->data != x; q = p, p = p->next); //p && p->data != x不能交换位置
if(NULL == p) //没有找到要删除的结点
{
return head;
}
if(NULL == q) //要删除的是头结点
{
head = head->next;
}
else
{
q->next = p->next;
}
free(p);
return head;
}
int count_link(ElemSN *head)
{
int count = 0;
for(; head; count++, head = head->next);
return count;
}
ElemSN * clear_link(ElemSN *head)
{
ElemSN *p;
while(head)
{
p = head->next;
free(head);
head = p;
}
return head;
}版权声明:本文博主原创文章,博客,未经同意不得转载。

浙公网安备 33010602011771号