最近看了郝斌老师讲的数据结构的单链表插入的视频,觉得视频中链表插入的算法写的很经典,所以就把代码敲了一下分享给大家
#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为插入之前的第三个结点,执行完成后为第四个结点。所以就完成了插入的工作。
创建链表的详解:点击打开链接