c语言 动态链表,C语言的链表(篇章之二:动态链表)

本文详细介绍了链表的基本操作,包括如何使用C语言创建空链表、头插法和尾插法,以及如何遍历链表、查找特定节点。此外,还讲解了链表的插入、获取链表长度和删除节点的方法,为理解链表数据结构提供了清晰的步骤和示例。
摘要由CSDN通过智能技术生成

一、【链表的创建】:

【1】、空链表:

Node *createList()

{

Node *head = (Node*)malloc(sizeof(Node));

head->next = NULL;

return head;

}

【2】、头插法;

#include

typedef struct node

{

int data;

struct node *next; //next 是指针变量,指向结构体变量

}Node;

Node *createList()

{

Node *head = (Node *)malloc(sizeof(Node));//申请了堆空间

head->next = NULL;

Node *cur = NULL;

int tmp;

while (1)

{

scanf("%d", &tmp);

if (tmp == 1)

{

break;

}

cur = (Node *)malloc(sizeof(Node));

cur->data = tmp;

cur->next = head->next;

head->next = cur;

}

return head;

}

【3】、尾插法:

Node * createListByEnd(void)

{

//头节点

Node * head=(Node *)malloc(sizeof(Node));

if(NULL == head)

{

printf("mallo failer\n");

return NULL;

}

head->next=NULL;

Node * pre=head;

printf("please input data : ");

//输入数据

int data;

scanf("%d",&data);

while(data)

{

Node * cur=(Node *)malloc(sizeof(Node));

if(NULL == cur)

{

break;

}

cur->data=data;

//连接到链表的尾部

cur->next=pre->next;

pre->next=cur;

//更新前面节点

pre=cur;

//再次输入数据

scanf("%d",&data);

}

return head;

}

二、【链表的遍历和查找】:

链表的结构相对而言比较特殊,在对链表中的结点进行访问和查找的时候,必须从链表的头结点开始,按照链表结点指针域所指的顺序逐个查找结点,直到找到为止。和对数组元素的访问一样,利用循环结构对链表结点 进行遍历是一种常用的方法,中使用的就是while循环结构,循环的终止条件便是判断next指针是否为NULL(即是否已经到达了最终结点)。

【1】链表的遍历:

void traverseList(Node * head)

{

head = head->next;

while(head!=NULL)

{

printf("%d\n",head->data);

head = head->next;

}

}

【2】链表的查找:

Node *findNodeList(Node * head, int nfind)

{

while (head->next)

{

if (head->data == nfind)

return head;

head = head->next;

}

return head;

}

三、【链表的插入与求长度】:

/*

插入节点 暂时只是头插入法

*/

void insertLinkNode(Node * head,int insertData)

{

Node * curNode = (Node *)malloc(sizeof(Node));

if(NULL == curNode)

{

printf("malloc is error\n");

return NULL;

}

curNode->data=insertData;

//先保证新节点指向父节点的下一个节点

//然父节点指向新节点

//这样做的目的可以保证链表不被破坏

curNode->next=head->next;

head->next=curNode;

}

/*

获取链表长度

*/

int lengthLink(Node * head)

{

int len=0;

//首元节点

head=head->next;

while(head)

{

head=head->next;

len++;

}

return len;

}

四、【链表的删除】:

//删除链表

void deleteList(Node *head ,Node *find)

{

while (head->next != find) head = head->next;

head->next = find->next;

free(find);

find = NULL;

return ;

}

还有一些关于链表的深入,笔者将在以后继续讲。谢谢哈。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值