链表接口的封装

来源:互联网 发布:杨闻萍审计 知乎 编辑:程序博客网 时间:2024/05/22 13:51

linkcode.h  //头文件名称#include<stdio.h>#include<stdlib.h>#define datatype int struct NODE{int num;datatype data;       //存储数据struct NODE *pNext;};typedef struct NODE Node; //简写//实现的功能  //增加, 删除 ,查询 修改 排序 逆序 void backAddNode(Node **ppNode, int num, datatype data);  //增加节点Node *backAddNodeA(Node *pNode, int num, datatype data);  //增加节点 ,不使用二级指针,使用返回值void showAllNode(Node *pNode);  //显示所有数据Node *searchFirst(Node *pNode, int num); //查找int change(Node *pNode, int oldNum, int newNum); //修改成功返回1,失败返回0Node *reLink(Node *pNode);  //链表逆转Node *deleteNode(Node *pNode, int num);//删除节点void deleteNodeA(Node **ppNode, int num); //使用二级指针Node *insertNode(Node *pNode, int findNum, int newNum, datatype data);void sortLink(Node *pNode, char ch);//ch == '>' ch == '<'likcode.c  // C文件#include"linkcode.h"Node *backAddNodeA(Node *pNode, int num, datatype data)  //增加节点{Node *pNewNode = (Node *)malloc(sizeof(Node));pNewNode->num = num;  //赋值pNewNode->data = data;  //赋值pNewNode->pNext = NULL;if (pNode == NULL) //传递过来的链表没有任何元素{//则让链表头指针等于pNewNode的值//让头指针指向pNewNodepNode = pNewNode;  //存储新点地址pNewNode->pNext = NULL;}else  //原链表有数据,则循环到链表末尾,在尾部插入数据{Node *p = pNode;  //头结点保存while (p->pNext != NULL){p = p->pNext; //一直循环到结尾}p->pNext = pNewNode; //尾插}return pNode;}void backAddNode(Node **ppNode, int num, datatype data){Node *pNewNode = (Node *)malloc(sizeof(Node));pNewNode->num = num;  //赋值pNewNode->data = data;  //赋值pNewNode->pNext = NULL;if (*ppNode == NULL) //传递过来的链表没有任何元素{//则让链表头指针等于pNewNode的值//让头指针指向pNewNode*ppNode = pNewNode;  //存储新点地址pNewNode->pNext = NULL;}else  //愿链表有数据,则循环到链表末尾,在尾部插入数据{Node *p = *ppNode;  //头结点保存while (p->pNext != NULL){p = p->pNext; //一直循环到结尾}p->pNext = pNewNode; //尾插}}void showAllNode(Node *pNode)  //显示所有数据{printf("\n打印链表——:\n");while (pNode != NULL){printf("%p, %p ", pNode, pNode->pNext);printf("%d, %d\n", pNode->num, pNode->data);pNode = pNode->pNext;}}Node *searchFirst(Node *pNode, int num){for (Node *p = pNode; p; p = p->pNext){if (num == p->num){return p;break;}}return NULL;}int change(Node *pNode, int oldNum, int newNum){//goto实现/*A: if (pNode != NULL){  if (oldNum == pNode->num) //找到oldNum.  {  pNode->num = newNum;  return 1; // 改变成功,函数结束  }  pNode = pNode->pNext;  //否则pNode向后移动,继续查找goto A;}   return 0;*///while实现/*while (pNode){if (oldNum == pNode->num){pNode->num = newNum;return 1;}pNode = pNode->pNext;}return 0;*/   for (; pNode; pNode = pNode->pNext)   {  if (oldNum == pNode->num)  {  pNode->num = newNum;  return 1;  }   }   return 0;}Node *reLink(Node *pNode) //逆转链表{Node *p1, *p2, *p3;p1 = p2 = p3 = NULL; //没有节点或只有一个节点if (pNode == NULL || pNode->pNext == NULL){return pNode; //返回节点}else{p1 = pNode;p2 = pNode->pNext;while (p2 != NULL) //p2 = NULL时,链表遍历完成{p3 = p2->pNext;p2->pNext = p1; //转向p1 = p2;p2 = p3; //循环向前移动}pNode->pNext = NULL;//原来的头结点现在是末节点,为空pNode = p1;return pNode;}}//删除节点Node *deleteNode(Node *pNode, int num){Node *p1 = NULL, *p2 = NULL;p1 = pNode;while (p1!= NULL) //找到要删除的点{if (num == p1->num){//p1保存要删除节点的地址,找到了break;}else  //否则继续找{p2 = p1; //p2保存上一个节点p1 = p1->pNext; //向前循环}}if (p1 == pNode) //如果要删除的节点是头结点{pNode = p1->pNext; //跳过这个节点free(p1);  //删除节点}else{p2->pNext = p1->pNext;free(p1);}return pNode;}void deleteNodeA(Node **ppNode, int num){Node *p1 = NULL, *p2 = NULL;p1 = *ppNode;while (p1 != NULL) //找到要删除的点{if (num == p1->num){//p1保存要删除节点的地址,找到了break;}else  //否则继续找{p2 = p1; //p2保存上一个节点p1 = p1->pNext; //向前循环}}if (p1 == *ppNode) //如果要删除的节点是头结点{*ppNode = p1->pNext; //跳过这个节点free(p1);  //删除节点p1 = NULL;}//else和下边的注释相同结果else {p2->pNext = p1->pNext;free(p1);p1 = NULL;   //防止出现野指针}/*else if (p1->pNext != NULL){p2->pNext = p1->pNext;free(p1);}else  //最后一个节点的删除,p2->pNext = p1->pNext;//此时,p1指向最后一个节点,那么这个节点的pNext = NULL;//刚好赋值给p2->pNext;{p2->pNext = NULL;free(p1);}*/}Node *insertNode(Node *pNode, int findNum, int newNum, datatype data){Node *p1 = NULL, *p2 = NULL;p1 = pNode;while (p1 != NULL) //找到要插入位置的点{if (findNum == p1->num){//p1保存要插入节点的地址,找到了break;}else  //否则继续找{p2 = p1; //p2保存上一个节点p1 = p1->pNext; //向前循环}}Node *pnewNode = (Node *)malloc(sizeof(Node));pnewNode->num = newNum;pnewNode->data = data;if (pNode == p1){pnewNode->pNext = pNode;pNode = pnewNode; //头插}else{pnewNode->pNext = p1;p2->pNext = pnewNode;}return pNode;}void sortLink(Node *pNode, char ch){if (ch == '<')  //升序排列{for (Node *p1 = pNode; p1; p1 = p1->pNext){for (Node *p2 = pNode; p2; p2 = p2->pNext){if (p1->num > p2->num){struct NODE tNode;tNode.num = p1->num;p1->num = p2->num;p2->num = tNode.num;tNode.data = p1->data;p1->data = p2->data;p2->data = tNode.data;}}}}else{if (ch == '>') //降序排列{for (Node *p1 = pNode; p1; p1 = p1->pNext){for (Node *p2 = pNode; p2; p2 = p2->pNext){if (p1->num < p2->num){struct NODE tNode;tNode.num = p1->num;p1->num = p2->num;p2->num = tNode.num;tNode.data = p1->data;p1->data = p2->data;p2->data = tNode.data;}}}}}}main.c   //主函数(测试)文件#include<stdio.h>#include<stdlib.h>#include"linkcode.h"void main(){Node *pNode = NULL;  //链表头结点pNode = backAddNodeA(pNode, 17, 12);pNode = backAddNodeA(pNode, 5, 1254);pNode = backAddNodeA(pNode, 9, 1244);pNode = backAddNodeA(pNode, 15, 12);pNode = backAddNodeA(pNode, 23, 1254);pNode = backAddNodeA(pNode, 1144, 1244);showAllNode(pNode);//查找测试代码//Node *pfind = searchFirst(pNode, 114);//if (pfind == NULL)//{// printf("没有找到\n");//}//else//{// printf("找到了:\n");// printf("%p, %d\n%p, %d", pfind, pfind->num, pfind->data, pfind->pNext);//}//改变测试代码/*change(pNode, 114, 999);showAllNode(pNode);*/////逆转测试代码//pNode = reLink(pNode);//showAllNode(pNode);////pNode = deleteNode(pNode, 114);//deleteNodeA(&pNode, 114);//deleteNodeA(&pNode, 1144);//deleteNodeA(&pNode, 11);//头插/*pNode = insertNode(pNode, 11, 8, 9);pNode = insertNode(pNode, 114, 888, 999);*///排序测试sortLink(pNode, '<');showAllNode(pNode);sortLink(pNode, '>');showAllNode(pNode);getchar();}


0 0
原创粉丝点击