c语言的链表怎么写,写一个C语言的链表记录一下

这篇博客介绍了如何使用C语言实现链表的基本操作,包括在链表尾部添加元素、头部添加元素、删除头部元素、删除尾部元素、遍历链表、查找指定节点、删除指定节点以及在链表中插入节点。通过示例代码展示了这些操作的具体实现过程。
摘要由CSDN通过智能技术生成

#include #include

//节点结构体

structNode

{int a; //数据位

struct Node* pNext; //地址位

};//全局和局部的区别

struct Node* g_pHead = NULL; //头指针

struct Node* g_pEnd = NULL; //尾指针//函数声明

void AddListTill(int a); //创建一个链表,在链表中添加数据(尾添加)可以用于队列

void AddListHead(int a); //创建一个链表,在链表中添加数据(头添加)可以用于栈

void DeleteHead(); //头删除

void DeleteTill(); //尾删除

void ScanList(); //遍历链表(查1个 或者全查)

struct Node* SelectNode(int a); //查询指定节点

void FreeList(); //链表清空

void FreeRandNode(int a); //删除指定节点

void AddListRand(int index, int a); //指定位置插入节点

int main(void) {

g_pHead;

AddListTill(1);

AddListTill(2);

AddListTill(3);

AddListTill(4);

AddListHead(0);

ScanList();//01234

AddListRand(1,1);

ScanList();//011234

DeleteHead();

ScanList();//11234

DeleteTill();//ScanList();//1123

struct Node*pFind;

pFind= SelectNode(2);if (pFind !=NULL) {

printf("find num : %d\n", pFind->a);

}else{

printf("find nothing\n");

}

FreeRandNode(2);

ScanList();//1134

system("pause");return 0;

}void AddListTill(inta) {//创建一个节点

struct Node* pTmep = (struct Node*)malloc(sizeof(structNode));//节点数据赋值

pTmep->a =a;

pTmep->pNext =NULL;//将节点链接到我的链表中

if (NULL == g_pEnd || NULL ==g_pHead) {

g_pHead=pTmep;

}else{

g_pEnd->pNext =pTmep;

}

g_pEnd=pTmep;

}void AddListHead(inta) {//创建一个节点

struct Node* pTmep = (struct Node*)malloc(sizeof(structNode));//节点数据赋值

pTmep->a =a;

pTmep->pNext =NULL;//将节点链接到我的链表中

if (NULL == g_pEnd || NULL ==g_pHead) {

g_pHead=pTmep;

g_pEnd=pTmep;

}else{

pTmep->pNext =g_pHead;

g_pHead=pTmep;

}

}voidScanList() {struct Node* pTemp = g_pHead; //定义一个中间变量指向头部为了防止改变原来的链表//bool类型 !pTemp

while (pTemp !=NULL) {

printf("%d", pTemp->a);

pTemp= pTemp->pNext;

}

printf("\n");

}struct Node* SelectNode(inta)

{struct Node* pTemp =g_pHead;while (pTemp !=NULL) {if (a == pTemp->a) {returnpTemp;

}

pTemp= pTemp->pNext;

}returnNULL;

}voidFreeList() {struct Node* pTemp =g_pHead;while (pTemp !=NULL) {struct Node* pt =pTemp;

pTemp= pTemp->pNext;free(pt);

}//一定记得要初始化方便下次操作

g_pHead =NULL;

g_pEnd=NULL;

}void FreeRandNode(inta) {if (NULL ==g_pHead) {

printf("链表为空,无需释放!!\n");

}struct Node* pTemp =SelectNode(a);if (NULL ==pTemp) {

printf("没有这个节点\n");return;

}//一个节点

if (g_pEnd ==g_pHead) {

DeleteHead();

}//两个节点

else if (g_pHead->pNext ==g_pEnd) {if (g_pHead ==pTemp) {

DeleteHead();

}else if (g_pEnd ==pTemp) {

DeleteTill();

}

}//多个节点

else{if (g_pHead ==pTemp) {

DeleteHead();

}else if (g_pEnd ==pTemp) {

DeleteTill();

}else{//找到要删除的前一个节点

struct Node* pt=g_pHead;while (pt->pNext !=pTemp)

{

pt= pt->pNext;

}//链接

pt->pNext = pTemp->pNext;//释放

free(pTemp);

}

}

}voidDeleteHead() {if (NULL ==g_pHead){

printf("链表为空,无需释放!!\n");

}//记住旧的头

struct Node* pTemp =g_pHead;//下一个节点变成新的头

g_pHead = g_pHead->pNext;//释放旧的头

free(pTemp);

}voidDeleteTill() {if (NULL ==g_pEnd) {

printf("链表为空,无需释放!!\n");return;

}if (g_pHead ==g_pEnd) {free(g_pHead);

g_pEnd=NULL;

g_pHead=NULL;

}else{//找尾巴前一个节点

struct Node* pTemp =g_pHead;while (pTemp->pNext !=g_pEnd) {

pTemp= pTemp->pNext;

}//释放尾巴

free(g_pEnd);//尾巴前移

g_pEnd =pTemp;//尾巴下一个为空

g_pEnd->pNext =NULL;

}

}void AddListRand(int index, inta) {if (NULL ==g_pHead) {

printf("链表为空,无需释放!!\n");return;

}struct Node* pt =SelectNode(index);if (NULL ==pt) {

printf("没有指定节点\n");return;

}//有节点创建新节点

struct Node* pTmep = (struct Node*)malloc(sizeof(structNode));

pTmep->a =a;

pTmep->pNext =NULL;//链接到链表

if (pt ==g_pEnd) {

g_pEnd->pNext =pTmep;

g_pEnd=pTmep;

}else{//先连

pTmep->pNext = pt->pNext;//后断

pt->pNext =pTmep;

}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值