1 /* 2 链表节点的插入与删除 3 4 编译环境:VC++ 6.0||VC++2008||...... 5 编译系统:windows 6 */ 7 8 #include <stdio.h> 9 #include <stdlib.h> 10 #include <malloc.h> 11 12 // 定义链表中的节点 13 typedef struct node 14 { 15 int member; // 节点中的成员 16 struct node *pNext; // 指向下一个节点的指针 17 }Node,*pNode; 18 19 // 函数声明 20 pNode CreateList(); // 创建链表函数 21 void TraverseList(pNode ); // 遍历链表函数 22 bool Insert_Node(pNode ,int ,int); // 链表节点插入函数,第一个参数是头节点,第二个参数是要在第几个节点前插入,第三个参数是要插入的数据 23 int Del_Node(pNode,int ); // 删除链表节点,第一个参数是头节点,第二个参数是删除第几个节点,第三个作为 24 int main() 25 { 26 pNode pHead = NULL; // 定义初始化头节点,等价于 struct Node *pHead == NULL 27 int data; // 作为Insert_Node函数的第三个参数 28 int num; // 作为Inset_Node函数第二个参数 29 int choose; 30 int return_val; 31 pHead = CreateList(); // 创建一个非循环单链表,并将该链表的头结点的地址付给pHead 32 printf("你输入的数据是:"); 33 TraverseList(pHead); // 调用遍历链表函数 34 printf("是否还要进行如下操作:\n"); 35 printf("1.插入数据 2.删除数据\n"); 36 printf("请输入:"); 37 scanf("%d",&choose); 38 switch (choose) 39 { 40 case 1: 41 { 42 printf("请输入要在第几个节点前插入数据:"); 43 scanf("%d",&num); 44 printf("请输入要插入的数据:"); 45 scanf("%d",&data); 46 if(Insert_Node(pHead,num,data) == true) 47 { 48 printf("插入成功\n插入后的数据是:\n"); 49 TraverseList(pHead); 50 } 51 else 52 { 53 printf("插入失败\n"); 54 } 55 printf("操作完成后的数据是:"); 56 TraverseList(pHead); 57 break; 58 } 59 case 2: 60 { 61 printf("请输入要删除第几个节点的数据:"); 62 scanf("%d",&num); 63 return_val = Del_Node(pHead,num); 64 if (return_val == 0) 65 { 66 printf("删除失败。\n"); 67 } 68 else 69 { 70 printf("删除成功。删除的元素是:%d\n",return_val); 71 } 72 printf("操作完成后的数据是:"); 73 TraverseList(pHead); 74 } 75 } 76 return 0; 77 } 78 79 // 创建链表函数 80 pNode CreateList() 81 { 82 int i; // 用于下面循环 83 int len; // 用来存放有效节点的字数 84 int val; // 用于临时存放用户输入的数据 85 pNode pHead = (pNode)malloc(sizeof(Node)); // 分配一个不存放有效数据的头结点 86 pNode pTail = pHead; // 链表的最后一个节点 87 pTail->pNext = NULL; // 最后一个节点的指针置为空 88 printf("请输入节点个数:"); 89 scanf("%d",&len); 90 for(i = 0; i < len; i++) 91 { 92 printf("第 %d 个节点的数值:",i+1); 93 scanf("%d",&val); 94 pNode pNew = (pNode)malloc(sizeof(Node)); // 为节点分配空间 95 pNew->member = val; //将用户输入的数据赋给节点的成员 96 pTail->pNext = pNew; //将最后一个节点的指针指向下一个新的节点 97 pNew->pNext = NULL; //将新节点中的指针置为空 98 pTail = pNew; //将新节点赋给最后的一个节点 99 } 100 return pHead; //返回头节点 101 102 } 103 104 // 遍历链表函数 105 void TraverseList(pNode pHead) 106 { 107 pNode p = pHead->pNext; //将头节点的指针给予临时节点p 108 while(NULL != p) //节点p不为空,循环 109 { 110 printf("%d ",p->member); 111 p = p->pNext; 112 } 113 printf("\n"); 114 return ; 115 } 116 117 // 链表节点插入函数 118 // 第一个参数是头节点,第二个参数是要在第几个节点前插入,第三个参数是要插入的数据 119 bool Insert_Node(pNode pHead, int front,int data) 120 { 121 int i = 0; 122 pNode _node = pHead; 123 pNode pSwap; // 用于交换 124 if ((front < 1) && (NULL != _node)) //判断用户输入的数据是否大于等于1,及_node是否为空 125 { 126 return false; 127 } 128 while (i < front - 1) //通过循环使指针指向要插入哪个节点前的节点。说的自己都不懂了,还是看下面的图吧。 129 { 130 _node = _node->pNext; 131 ++i; 132 } 133 pNode pNew = (pNode)malloc(sizeof(Node)); 134 135 pNew->member = data; // 把输入的数据赋给要插入的节点 136 pSwap = _node->pNext; // 把下一个节点的地址,给用于交换的pSwap 137 _node->pNext = pNew; // 把要插入的节点的地址,给上个节点的指针域 138 pNew->pNext = pSwap; // 把插入节点的下一个节点的地址,给插入节点的指针域 139 return true; 140 141 } 142 143 // 删除链表节点函数 144 // 第一个参数是头节点,第二个参数是要删除第几个节点·······和上面的插入函数是不是很像 145 int Del_Node(pNode pHead,int back) 146 { 147 int i = 0; 148 int data; 149 pNode _node = pHead; 150 pNode pSwap; 151 if ((back < 1) && (NULL == _node->pNext)) 152 { 153 printf("删除失败!\n"); 154 return 0; 155 } 156 while(i < back-1) 157 { 158 _node = _node->pNext; 159 ++i; 160 } 161 pSwap = _node->pNext; 162 data = pSwap->member; 163 _node->pNext = _node->pNext->pNext; 164 free(pSwap); 165 return data; 166 }
时间: 2024-10-26 13:43:18