今天就来讲一讲插入节点
对我来说链表重要的是画图,有了图才能理解,所以我会根据自己的理解附上图解,便于理解。
先跟增加节点对比
然后连接链表,把指针移动到最后一个节点再连接新的节点
void AddListNode(Pt_Stu plist) { Pt_Stu pnode = (Pt_Stu)malloc(sizeof(STU));
printf("input number:"); scanf("%d", &pnode->number); printf("input name:"); scanf("%s", pnode->name); printf("input score:"); scanf("%f", &pnode->math); pnode->pnext = NULL; while (plist->pnext != NULL) { plist = plist->pnext; } plist ->pnext = pnode; }
头增:同样的开辟空间,填充数据,但是是从头部增加,也就是空头节点的下一个节点
显然头增法的代码会简单一点,速度也更快,不需要把指针一直往后移动 ,但是顺序与你输入的顺序是相反的
pnode->pnext = plist->pnext;
plist->pnext = pnode;
而插入节点与增加类似,只不过是在链表给定位置的地方增加一个节点罢了
看样子同样是开辟空间,填充数据,连接链表
void InsertNode(Pt_Stu plist,int pos)//pos代表节点在链表中的位置 { Pt_Stu pnode = (Pt_Stu)malloc(sizeof(STU)); printf("input number:"); scanf("%d", &pnode->number); printf("input name:"); scanf("%s", pnode->name); printf("input score:"); scanf("%f", &pnode->math); pnode->pnext = NULL; for(int i=0;i1;i++){ plist=plist->pnext;//pos-1是为了到插入位置的前一个节点 pnode->pnext=plist->pnext;//新节点的下一个节点指向原先插入位置的节点 plist->next=pnode;//前一个位置的节点指向新的节点 } }
而修改节点就和删除类似了,找到指定位置的节点,可以把数据重新赋值,也可利用拷贝字符串来解决。
ps:说起拷贝字符串,我在VS2019里直接用会因为没有加'\0'运行会报错,我会选择自己写一个拷贝字符串来解决。
代码如下
void StrCpy(char* strOld, char const* strNew) { int i; for (i = 0; i < strlen(strNew); i++) { strOld[i] = strNew[i]; } strOld[strlen(strNew)] = '\0'; }
带有空头结点的链表就到这了,事实上我们可以发现只要脑子里面有图,链表的增删查改插入我们都可以做到,方法也都大同小异