下图是一个创建好的链表
下面我们需要在链表中插入一个结点,例如我们需要在第3个结点后插入一个结点
首先定义一个指针p,并且将p移动到第3个结点处
创建一个新结点pNew并且初始化pNew
pNew->data = 20
然后定义一个指针q将q指向p第4个结点
最后将p指向pNew,pNew指向q即可实现在链表中第3个结点后插入一个新结点
即:
p->pNext = pNew;
pNew->pNext = q;
插入后的效果:
程序代码:
#include <stdio.h> #include <stdlib.h> typedef struct Node//结点结构 { int data;//数据域 struct Node *pNext;//指针域 }NODE, *PNODE; //创建链表 PNODE Create_list(void); //遍历链表 void Traverse_list(PNODE pHead); //在链表中插入一个结点 void Insert_list(PNODE pHead, int pos, int val); void main() { PNODE pHead = NULL; pHead = Create_list();//创建一个非循环单链表 Traverse_list(pHead);//遍历链表 Insert_list(pHead, 4, 20); Traverse_list(pHead);//遍历输出链表中的数据 system("pause"); } //创建链表 PNODE Create_list(void) { int len;//结点的个数 int val;//临时保存结点的值 //分配一个不存放有效数据的头结点 PNODE pHead = (PNODE)malloc(sizeof(NODE)); if(NULL == pHead) { printf("内存分配失败,程序终止!"); exit(-1); } //定义一个永远指向尾结点的结点 PNODE pTail = pHead; pTail->pNext = NULL; printf("请输入您需要生成的链表的结点的个数:"); scanf("%d",&len); for(int i=0; i<len; i++) { printf("请输入第%d个结点的值:", i+1); scanf("%d",&val); //创建一个临时结点 PNODE pNew = (PNODE)malloc(sizeof(NODE)); if(NULL == pNew) { printf("内存分配失败,程序终止!"); exit(-1); } pNew->data = val; pTail->pNext = pNew; pNew->pNext = NULL; pTail = pNew; } return pHead; } //遍历链表 void Traverse_list(PNODE pHead) { PNODE p = pHead->pNext; while(NULL != p) { printf("%d ", p->data); p = p->pNext; } printf("\n"); return; } //在链表中插入一个结点 void Insert_list(PNODE pHead, int pos, int val) { PNODE p = pHead;//定义一个指向头结点的指针p用于查找插入结点的位置 int i = 0;//定义一个变量i用于查找插入结点的位置 //寻找插入结点的位置 while(NULL != p && i<pos-1) { p = p->pNext; i++; } //判断是否找到了插入结点的位置 if(NULL == p || i>pos-1) { printf("没找到插入结点的位置!\n"); return; } //为新结点分配内存 PNODE pNew = (PNODE)malloc(sizeof(NODE)); if(NULL == pNew) { printf("动态内存分配失败,程序终止!\n"); exit(-1); } pNew->data = val;//对新结点的数据域赋值 PNODE q = p->pNext;//将q指向插入的新结点的后一个结点 p->pNext = pNew;//链表和新结点相连 pNew->pNext = q;//链表和新结点相连 }
执行结果:
链表《3》在链表中插入新的结点
时间: 2024-10-08 03:17:06