动态链表之尾插法

动态链表的实现

动态链表尾插法
#include
#include<malloc.h>
#include<time.h>
using namespace std;

static int length=0;
typedef struct List{
int data;
List* next;
}List;

void listInit(List *l)
{
l->data=0;
l->next=NULL;
}

void insertByTail(List **l,int data)
{
List temp=(List)malloc(sizeof(List));

temp->data = data;
temp->next=NULL;


(*l)->next = temp;	
(*l)=(*l)->next;

}

void printList(List *l)
{

while(l)
{
	cout<<l->data<<endl;
	l=l->next;
}
//不能直接用l来进行遍历,否则会在l=l->next这个地方每一次产生一个尾部根本不存在的指向,导致程序崩溃
/*for(int i=0;i<len;i++)
{
	cout<<l->data<<endl;
	l=l->next;
}*/

}

int main(int argc , char* argv[])
{
//对于要操作的链表,要首先通过申请开辟堆空间来获得链表的首地址
//刚开始我把List list=(List)malloc(sizeof(List));这一句放到void listInit(List *l)中,企图通过初始化函数来开辟,结果会运行时报错
//那是因为,我在初始化函数中没有返回初始化后链表的地址,导致,再回到主函数时,初始化函数释放内存空间,连着开辟的链表地址也被释放了,而主函数中的链表还没得到地址数据
List list=(List)malloc(sizeof(List));
listInit(list);
List *p=NULL;

// insertByHead(&list,5);
// cout<data<<endl;
// cout<next->data<<endl;
p=list;
// p=list->next;
for(int i=0;i<5;i++)
{
insertByTail(&list,i);

//	List *tmp=(List*)malloc(sizeof(List));
//	tmp->data=i;
//	list->next = tmp;
/*	list->data = i;
	list->next=(List*)malloc(sizeof(List));
	list=list->next;*/
	length++;
//	list=list->next;
}
//list=p;
printList(p);

cout<<"hello world"<<endl;
return 0;

}

链表尾插法是指在链表的末尾插入一个新的节点。在C语言中,实现链表尾插法通常需要维护一个指向链表最后一个节点的指针,这样可以方便地将新节点添加到链表的末尾。以下是使用C语言实现的链表尾插法的示例代码: ```c #include <stdio.h> #include <stdlib.h> // 定义链表节点结构体 typedef struct Node { int data; // 节点数据 struct Node* next; // 指向下一个节点的指针 } Node; // 创建一个新节点 Node* createNode(int data) { Node* newNode = (Node*)malloc(sizeof(Node)); if (newNode == NULL) { exit(-1); // 内存分配失败,退出程序 } newNode->data = data; // 设置节点数据 newNode->next = NULL; // 新节点的next指针设为NULL return newNode; } // 尾插法插入节点 void insertNodeAtTail(Node** head, int data) { Node* newNode = createNode(data); // 创建新节点 // 如果链表为空,新节点即为头节点 if (*head == NULL) { *head = newNode; return; } // 否则,找到链表的最后一个节点 Node* temp = *head; while (temp->next != NULL) { temp = temp->next; } // 将最后一个节点的next指针指向新节点 temp->next = newNode; } // 打印链表 void printList(Node* head) { Node* temp = head; while (temp != NULL) { printf("%d -> ", temp->data); temp = temp->next; } printf("NULL\n"); } int main() { Node* head = NULL; // 初始化链表头指针为空 // 使用尾插法插入节点 insertNodeAtTail(&head, 1); insertNodeAtTail(&head, 2); insertNodeAtTail(&head, 3); // 打印链表 printList(head); // 释放链表内存(略) return 0; } ``` 在这段代码中,首先定义了链表节点的结构体`Node`,然后定义了一个创建新节点的函数`createNode`,以及实现尾插法的函数`insertNodeAtTail`。在`insertNodeAtTail`函数中,首先创建一个新的节点,然后判断链表是否为空,如果为空则直接将新节点设置为头节点,否则遍历链表找到最后一个节点,并将其`next`指针指向新创建的节点。最后,在`main`函数中演示了如何使用尾插法插入节点并打印链表
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值