有空头链表

    xiaoxiao2022-07-14  183

    #include <stdio.h> #include <stdlib.h> //节点结构体 struct Node { int a; struct Node *pNext; } ; //头尾指针定义 struct Node *g_pHead=NULL; struct Node *g_pEnd=NULL; //空头链表初始化 void LianBiaoChuShi(); //尾添加 void WeiTianJia(int a); //头添加 void TouTianJia(int a); //任意位置添加 void RenYiTianJia(int index,int a); //在index后添加a // 查找指定节点位置,返回地址 struct Node *SelectNode(int a); //删除头 void ShanChuTou(); //删除尾 void ShanChuWei(); //删除中间任意节点 void ShanChuRenYi(int a); //释放链表 //遍历链表 void BianLi(); int main() { LianBiaoChuShi();//空头链表初始化 //操作 WeiTianJia(1); WeiTianJia(2); WeiTianJia(3); WeiTianJia(4); BianLi();//遍历 printf("\n"); RenYiTianJia(3,6); BianLi();//遍历 printf("\n"); ShanChuTou();//删除头 BianLi();//遍历 printf("\n"); ShanChuWei(); BianLi();//遍历 printf("\n"); ShanChuRenYi(2); BianLi();//遍历 printf("\n"); system("pause"); return 0; } //空头链表初始化 void LianBiaoChuShi() { //链表空头 g_pHead=(struct Node *)malloc(sizeof(struct Node)); g_pHead->pNext=NULL; g_pEnd= g_pHead;//头尾都是一个节点 } //尾添加 void WeiTianJia(int a) { //创建一个节点 struct Node *pTemp= (struct Node *)malloc(sizeof(struct Node)); //节点成员赋值 pTemp->a=a; pTemp->pNext=NULL; if(NULL==pTemp) { printf("内存不足\n"); //return NULL; } //链接 g_pEnd->pNext=pTemp; g_pEnd=pTemp; } //头添加 void TouTianJia(int a) { //创建一个节点 struct Node *pTemp= (struct Node *)malloc(sizeof(struct Node)); //节点成员赋值 pTemp->a=a; pTemp->pNext=NULL; if(NULL==pTemp) { printf("内存不足\n"); // return NULL; } //链接 pTemp->pNext=g_pHead->pNext; g_pHead->pNext=pTemp; } //任意位置添加 void RenYiTianJia(int index,int a) { //判断链表为空 if(g_pHead->pNext==NULL) { printf("链表无节点\n"); } //找插入位置 struct Node *pTemp=SelectNode(index); if(NULL==pTemp) { printf("查无此节点\n"); } //找到了,链接 //1.创建节点,把a装进去 //创建一个节点 struct Node *pT= (struct Node *)malloc(sizeof(struct Node)); //节点成员赋值 pT->a=a; pT->pNext=NULL; //2.链接 if(pTemp==g_pEnd)//如果插入的位置是尾部,调用尾添加 { WeiTianJia(a); } else { pT->pNext=pTemp->pNext; pTemp->pNext=pT; } } // 查找指定节点位置,返回地址 struct Node *SelectNode(int a) { struct Node *pTemp=g_pHead->pNext; while(pTemp!=NULL) { if(a==pTemp->a) { return pTemp; } printf("%d\n",pTemp->a); pTemp=pTemp->pNext; } return NULL; } //遍历链表 void BianLi() { struct Node *pTemp=g_pHead->pNext; while(pTemp!=NULL) { printf("%d\n",pTemp->a); pTemp=pTemp->pNext; } } //删除头 void ShanChuTou() { //判断链表为空 if(g_pHead->pNext==NULL) { printf("链表无节点\n"); } //1记录这个点 struct Node *pTemp=g_pHead->pNext; //2指向下一个 g_pHead->pNext=g_pHead->pNext->pNext; //3释放 free(pTemp); } //删除尾 void ShanChuWei() { //判断链表为空 if(g_pHead->pNext==NULL) { printf("链表无节点\n"); } if(g_pHead==g_pEnd) { free(g_pEnd); g_pHead->pNext=NULL; g_pEnd=g_pHead; } //有多个节点 else { struct Node *pTemp=g_pHead->pNext; while(pTemp!=NULL) { if(pTemp->pNext==g_pEnd)//找到尾的前一个 { break; } pTemp=pTemp->pNext; } //1释放尾巴 free(g_pEnd); g_pEnd=pTemp; //尾巴下一个赋值为空 g_pEnd->pNext=NULL; } } void ShanChuRenYi(int a) { struct Node *pTemp=SelectNode(a); if(NULL==pTemp) { printf("查无此节点\n"); } //如果只有一个节点 if(g_pHead->pNext==g_pEnd) { ShanChuWei(); } if(g_pHead==pTemp) { ShanChuWei(); } else { //找位置 //找到删除点pTemp的前一个 struct Node *pT=g_pHead; while(pT!=NULL) { if(pT->pNext==pTemp) { break; } pT=pT->pNext; } //先连 pT->pNext=pTemp->pNext; //后删除 free(pTemp); } }
    最新回复(0)