#include#include #include //枚举 typedef enum{ false =0, true =1 }bool; //如果函数传参类型为结构体类型则需要结构体创建声明在前,函数声明在后。 typedef struct{ int id; int val; }Data; typedef struct LinkList{ //数据域 Data data; //结构体变量作为数据域 对后期扩展数据域成员--简单 //指针域 struct LinkList* nextNodeAddress; //下一个节点地址 }LINKLIST; LINKLIST *createNewLinkListNode(Data data) { //在堆区开辟一块大小为sizeof(LINKLIST)字节空间 LINKLIST * newP = (LINKLIST *)malloc(sizeof(LINKLIST)); if(newP == NULL) { printf("创建节点失败n"); return NULL; } else { newP->data = data; newP->nextNodeAddress = NULL; return newP; } } bool appendLinkListNode(LINKLIST *headPtr,Data data) { //辅助指针 如果对指针进行偏移时需要使用辅助指针 LINKLIST *tempP = headPtr; //进行遍历---到哪个节点它的指针域为空啊 如果对应为空,需要将其赋于新节点地址 while(tempP->nextNodeAddress != NULL) { tempP = tempP->nextNodeAddress; } //创建新节点 LINKLIST * newNodePtr = createNewLinkListNode(data); if(newNodePtr != NULL) { //将新节点地址赋值至表中指针域---进行穿串操作 tempP->nextNodeAddress = newNodePtr; return true; } else { return false; } } bool insertSpecifyLocationLinkListNode(LINKLIST *headPtr,int nodeNum,Data data) { int currNodeNum =1; //记录节点个数 //辅助指针 如果对指针进行偏移时需要使用辅助指针 LINKLIST *tempP = headPtr->nextNodeAddress; //进行遍历---到哪个节点它的指针域为空啊 如果对应为空,需要将其赋于新节点地址 while(tempP!= NULL) { currNodeNum++; //检验tempP中数据域 if(currNodeNum == nodeNum)//直接插入到第nodeNum位置 { //创建新节点 LINKLIST *newPtr = createNewLinkListNode(data); //第一步先对新节点指针域赋值---赋当前tempP中指针域中的数值 newPtr->nextNodeAddress = tempP->nextNodeAddress; //第二步对于位置前一个节点指针域进行赋值 tempP->nextNodeAddress = newPtr; return true; } tempP= tempP->nextNodeAddress; } return false; //插入失败 } bool insertSpecifyIDLinkListNode(LINKLIST *headPtr,Data data) { //辅助指针 如果对指针进行偏移时需要使用辅助指针 LINKLIST *tempP = headPtr->nextNodeAddress; //修补漏洞 如果只有表头 需要单独做 if(tempP ==NULL) return appendLinkListNode(headPtr,data); while(tempP!= NULL) { LINKLIST * cmpNextP = tempP->nextNodeAddress; //学号11号 要插到10与12号之间 但是12号没有10就是终止 if((cmpNextP == NULL) && (tempP->data.id <= data.id) ) { //创建新节点 LINKLIST *newPtr = createNewLinkListNode(data); tempP->nextNodeAddress = newPtr; return true; } //学号11 要插到10号与12号之间 10号与12都必须存在 else if((tempP->data.id <= data.id) && (data.id <= cmpNextP->data.id)) { //创建新节点 LINKLIST *newPtr = createNewLinkListNode(data); newPtr->nextNodeAddress = tempP->nextNodeAddress; tempP->nextNodeAddress = newPtr; return true; } tempP = tempP->nextNodeAddress; } return false; } void lookAllLinkListNode(LINKLIST *headPtr) { //辅助指针 如果对指针进行偏移时需要使用辅助指针 LINKLIST *tempP = headPtr->nextNodeAddress; while(tempP!= NULL) { printf("学号:%d 数值:%dn",tempP->data.id,tempP->data.val); tempP = tempP->nextNodeAddress; } } bool specifyIdFromLinkList(LINKLIST *headPtr,int id) { //辅助指针 LINKLIST * tempP = headPtr->nextNodeAddress; while(tempP != NULL) { if(id == tempP->data.id) { printf("学号:%d 数值:%dn",tempP->data.id,tempP->data.val); return true; } tempP = tempP->nextNodeAddress;//遍历下一个节点 } return false; } bool updateSpecifyIdFromLinkListNode(LINKLIST *headPtr,Data data) { LINKLIST * tempP= headPtr->nextNodeAddress; while(tempP != NULL) { if(data.id == tempP->data.id) { tempP->data = data; //数据更新 return true; } tempP = tempP->nextNodeAddress; } return false; } bool deleteSpecifyIdFromLinkListNode(LINKLIST *headPtr,int id) { LINKLIST * tempP= headPtr; //应该指向表头 while(tempP != NULL) { //站在node2中看node3中内容 需要将node3进行删除 LINKLIST * delNodeAddress = tempP->nextNodeAddress; if((delNodeAddress != NULL)&&(delNodeAddress->data.id == id)) { //将3号指针域数据赋值给2号指针域 2号与4号即可联系 3号抛在一遍 tempP->nextNodeAddress = delNodeAddress->nextNodeAddress; //将3号节点指针域置为NULL 将数据域进行清空操作 delNodeAddress->nextNodeAddress = NULL; memset(&delNodeAddress->data,0,sizeof(Data));//清空 return true; } tempP = tempP->nextNodeAddress; } return false; } int main() { Data input; LINKLIST *headNodePtr=createNewLinkListNode(input);//创建头指针或者头节点都是OK的可根据字节情况编写 Data node1={1,100}; Data node2={2,200}; Data node3={3,300}; Data node5={5,500}; Data node7={7,700}; //追加插入节点 appendLinkListNode(headNodePtr,node1); appendLinkListNode(headNodePtr,node2); appendLinkListNode(headNodePtr,node3); appendLinkListNode(headNodePtr,node5); appendLinkListNode(headNodePtr,node7); lookAllLinkListNode(headNodePtr); printf("**************************************************n"); //指定节点位置进行插入 Data node4={4,300}; insertSpecifyLocationLinkListNode(headNodePtr,4,node4); lookAllLinkListNode(headNodePtr); printf("**************************************************n"); //根据内容id进行插入 Data node6={6,600}; insertSpecifyIDLinkListNode(headNodePtr,node6); lookAllLinkListNode(headNodePtr); printf("**************************************************n"); Data node8={8,800}; insertSpecifyIDLinkListNode(headNodePtr,node8); lookAllLinkListNode(headNodePtr); printf("**************************************************n"); specifyIdFromLinkList(headNodePtr,6); printf("**************************************************n"); node6.id=6; node6.val = 1200; updateSpecifyIdFromLinkListNode(headNodePtr,node6); lookAllLinkListNode(headNodePtr); printf("**************************************************n"); deleteSpecifyIdFromLinkListNode(headNodePtr,6); deleteSpecifyIdFromLinkListNode(headNodePtr,5); deleteSpecifyIdFromLinkListNode(headNodePtr,8); deleteSpecifyIdFromLinkListNode(headNodePtr,1); lookAllLinkListNode(headNodePtr); return 0; }



