简单的线性表2

今天就来讲一讲插入节点

  对我来说链表重要的是画图,有了图才能理解,所以我会根据自己的理解附上图解,便于理解。

  先跟增加节点对比

  尾增:先开辟空间,填充数据

      然后连接链表,把指针移动到最后一个节点再连接新的节点

                  

     

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;i<pos-1;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';
}

  

        带有空头结点的链表就到这了,事实上我们可以发现只要脑子里面有图,链表的增删查改插入我们都可以做到,方法也都大同小异

posted @ 2020-04-16 00:44  王舒婷  阅读(96)  评论(0编辑  收藏  举报