数据结构 单链表的插入详解 例子

最近看了郝斌老师讲的数据结构的单链表插入的视频,觉得视频中链表插入的算法写的很经典,所以就把代码敲了一下分享给大家

#include <stdio.h>  
#include <malloc.h>  
#include <time.h>
  
typedef struct list  
{  
    int vaule; //数据域  
    struct list *PNext; //指针域  
}TNODE, *TPNODE;  
  
TPNODE Creat_list();  
void Trave_list(TPNODE _PHead);  
int Insert_List(TPNODE _pHead, int _pos, int _iVal);

int main()  
{  
    int iRet = 0;
    int iVal = 0;
    int pos = 0;
    TPNODE PHead;
    srand((int)time(NULL));
    
    PHead = Creat_list();   //创建链表
    printf("please input insert pos\n");
    scanf("%d", &pos);
    
    printf("please input Val\n");
    scanf("%d", &iVal);
    iRet = Insert_List(PHead, pos, iVal);
    if(1 == iRet)
    {
        printf("Insert fail\n");
    }
    Trave_list(PHead);   //遍历链表
  
    return 0;  
}  
  
//创建链表  
TPNODE Creat_list()  
{  
    int i = 0;  
    int len = 0;  
    int iVaule = 0;  
  
    TPNODE pHead;  
    pHead = (TPNODE)malloc(sizeof(TNODE));  //创建一个头结点  
    if(NULL == pHead)   //创建失败
    {  
        printf("create list fail\n");  
    }  
  
    TPNODE PTail = pHead;  
    pHead->PNext = NULL;  
      
    printf("please input len of list\n");  
    scanf("%d", &len);  //输入想要的个数
    for(i = 0; i < len; i++)  
    {  
        iVaule = rand()%100+1;
  
        TPNODE pNew = (TPNODE)malloc(sizeof(TNODE)); //分配内存
          
        pNew->vaule = iVaule;  //将数据域赋予数据  
        PTail->PNext = pNew;  
        pNew->PNext = NULL;  
        PTail = pNew;  
    }  
      
    return  pHead;  
}  
      
//链表输出  
void Trave_list(TPNODE _PHead)  
{  
    int i = 0;
    TPNODE P = _PHead->PNext;  
  
    while(NULL != P)  
    {  
        i = 1;
        printf("%d ", P->vaule);  
        P = P->PNext;  
    }  
    if(1 == i)
    {
        printf("\n");
    }
}  

//链表插入
int Insert_List(TPNODE _pHead, int _pos, int _iVal)
{
    int i = 0;
    TPNODE p = _pHead;
    while(NULL != p && i < _pos-1)
    {
        p = p->PNext;
        i++;
    }

   if(i > _pos -1 || NULL == p)
   {
        return 1; 
   }

    TPNODE pNew = (TPNODE)malloc(sizeof(TNODE));
    if(NULL == pNew)
    {
        return 1;
    }

    pNew->vaule = _iVal; //(第一行)将待插入的数据赋值到新的节点数据域中
    TPNODE q = p->PNext; //(第二行)结构体指针q指向p的下一个节点
    p->PNext = pNew; // (第三行)p的下一个节点指向新节点
    pNew->PNext = q; //此时的q为第二行的p->pNext,不是第三行的pNew(指针思想)
    
    return 0;
}


此程序的用法:

1,首先输入待创建链表的长度,输入完毕后,程序会产生随机数对每个节点赋值,生成链表

2,然后输入待插入的位置

3,输入待插入的数值

4,遍历链表输出

比如创建长度为5的结点,在第三个位置插入数值为10的数据,运行结果


插入解析,执行完插入函数中的while循环后,此时的p指针指向的是第二个结点。

然后创建一个新结点,并分配内存,然后将待插入的数值赋值到新结点的数据域中pNew->vaule = _iVal;

然后新指针q指向p->PNext,此时的p->PNext为第三个结点。所以q的值为第三个结点。

p->PNext = pNew; 把p->PNext指向新结点PNew,说明第三个结点为pNew,此时PNew为第三个结点。

pNew->PNext = q,新结点的下一个结点指向q,此时的q为插入之前的第三个结点,执行完成后为第四个结点。所以就完成了插入的工作。


创建链表的详解:点击打开链接

发布了35 篇原创文章 · 获赞 18 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/Z_Dream_ST/article/details/77726255