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

来源:互联网 发布:环球期货交易软件 编辑:程序博客网 时间:2024/06/02 07:07

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

#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为插入之前的第三个结点,执行完成后为第四个结点。所以就完成了插入的工作。


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

原创粉丝点击