我今天实现的是插入链表节点,删除链表节点。
看看代码。如果注释写得不好,请原谅我·················
/* 插入和删除链表节点 编译环境:VC++ 6.0 编译系统:windows XP SP3 */ #include <stdio.h> #include <stdlib.h> #include <malloc.h> // 在链表中定义节点 typedef struct node { int member; // 节点成员 struct node *pNext; // 指向下一个节点的指针 }Node,*pNode; // 函数声明 pNode CreateList(); // 创建链表函数 void TraverseList(pNode ); // 链表函数遍历 bool Insert_Node(pNode , int , int); // 链表节点插入函数,第一个参数是第一个节点,第二个参数是在第几个节点之前插入,第三个参数是插入数据 int Del_Node(pNode, int ); // 删除链表节点,第一个参数是第一个节点,第二个参数是删除第三个节点 int main() { pNode pHead = NULL; // 定义初始化头节点,等价于 struct Node *pHead == NULL int data; // 作为Insert_Node函数的第三个参数 int num; // 作为Inset_Node函数的第二个参数 int choose; int return_val; pHead = CreateList(); // 创建非循环单链表,并将链表头结点的地址支付给pHead printf( " 您输入的数据是: "); TraverseList(pHead); // 调用遍历链表函数 printf( " 以下操作是否必须进行?n "); printf( " 1.插入数据 2.删除数据\n "); printf( " 请输入: "); scanf( " %d ",&choose); switch (choose) { case 1: { printf( " 在第几个节点之前,请输入数据: "); scanf( " %d ",&num); printf( " 请输入要插入的数据: "); scanf( " %d ",&data); if(Insert_Node(pHead,num,data) == true) { printf( " 插入成功\n后的数据是:\n "); TraverseList(pHead); } else { printf( " 插入失败\n "); } printf( " 操作完成后的数据如下: "); TraverseList(pHead); break; } case 2: { printf( " 请输入要删除第几个节点的数据: "); scanf( " %d ",&num); return_val = Del_Node(pHead,num); if (return_val == 0) { printf( " 删除失败。\n "); } else { printf( " 删除成功。删除的元素为:%d\n ",return_val); } printf( " 操作完成后的数据如下: "); TraverseList(pHead); } } return 0; } // 创建链表函数 pNode CreateList() { int i; // 用于下面的循环 int len; // 用于存储有效节点的字数 int val; // 用于临时存储用户输入的数据 pNode pHead = (pNode)malloc( sizeof(Node)); // 分配不存储有效数据的头结点 pNode pTail = pHead; // 链表最后一个节点 pTail->pNext = NULL; // 最后一节点的指针是空的 printf( " 请输入节点数: "); scanf( " %d ",&len); for(i = 0; i < len; i++) { printf( " 第 %d 节点值: ",i+ 1); scanf( " %d ",&val); pNode pNew = (pNode)malloc( sizeof(Node)); // 为节点分配空间 pNew->member = val; // 将用户输入的数据赋予节点成员 pTail->pNext = pNew; // 将最后一个节点的指针指向下一个新节点 pNew->pNext = NULL; // 将新节点中的指针放在空中 pTail = pNew; // 将新节点赋予最后一个节点 } return pHead; // 返回头节点 } // 链表函数遍历 void TraverseList(pNode pHead) { pNode p = pHead->pNext; // 将头节点的指针给临时节点p while(NULL != p) // 节点p不空,循环 { printf( " %d ",p->member); p = p->pNext; } printf( " \n "); return ; } // 链表节点插入函数 // 第一个参数是头节点,第二个参数是在第几个节点之前插入,第三个参数是插入数据 bool Insert_Node(pNode pHead, int front, int data) { int i = 0; pNode _node = pHead; pNode pSwap; // 用于交换 if ((front < 1) && (NULL != _node)) // 判断用户输入的数据是否大于或等于1,_node是否空? { return false; } while (i < front - 1) // 将指针指向要插入哪个节点之前的节点。我不明白我说的话。让我们看看下面的图片。 { _node = _node->pNext; ++i; } pNode pNew = (pNode)malloc( sizeof(Node)); pNew->member = data; // 将输入的数据赋予要插入的节点 pSwap = _node->pNext; // 下一个节点的地址,PSwapp用于交换 _node->pNext = pNew; // 将要插入的节点地址,给上节点的指针域 pNew->pNext = pSwap; // 将下一个节点插入节点的地址,插入节点的指针域 return true; } // 删除链表节点函数 // 第一个参数是头节点,第二个参数是删除第几个节点,与上面的插入函数非常相似吗? int Del_Node(pNode pHead, int back) { int i = 0; int data; pNode _node = pHead; pNode pSwap; if ((back < 1) && (NULL == _node->pNext)) { printf( " 删除失败!\n "); return 0; } while(i < back- 1) { _node = _node->pNext; ++i; } pSwap = _node->pNext; data = pSwap->member; _node->pNext = _node->pNext->pNext; free(pSwap); return }
我自己画了两张照片来帮助理解。不管怎样,我是这么理解的。欢迎指出错误
在下向链表中插入节点
以下是链表节点的删除