首页 > 编程语言 > 详细

C语言链表

时间:2020-02-21 11:29:42      阅读:43      评论:0      收藏:0      [点我收藏+]

链表

链表:一系列结构连在一起,每一个结构体变量里面都有一个指针pNext,pNext指向下一个结构体变量,尾节点的pNext指向NULL。

静态链表:

技术分享图片

 struct students stu1 = { 1, "a", NULL };
? struct students stu2 = { 2, "b", NULL };
? struct students stu3 = { 3, "c", NULL };
? stu3.pNext = &stu2;
? stu2.pNext = &stu1;

动态内存分配:

Malloc();

? void *malloc(unsigned int size)

? 这个函数在内存中动态开辟一块内存,unsigned int size决定内存的大小,void *空指针可以强制转换为任何类型的指针。

这个函数返回一个指针,这个指针就是开辟的内存地址。

pHead = (struct students*)malloc(sizeof(struct students));

free();

? void free(void *ptr)

? free:释放内存。

? free(pHead);

技术分享图片

怎样来创建一个链表

创建一块内存:

  struct students *pHead = NULL; //头指针
? struct students *pEnd = NULL; //尾指针     
? pHead = (struct students *)malloc(sizeof(struct students)); //开辟头结点
? printf("请输入一个学生的学号和姓名:\n");
? scanf("%d%s", &pHead->number, pHead->name);
? pHead->pNext = NULL;
  printf("%d\n", pHead->number);
1. 增:

1、头部增加:头结点会变 需要返回一个pHead。

2、新节点的pNext指向pHead。

3、pHead指向pNew。

注意:2和3不能逆序。

//在头部插入一个节点

struct students *InsertAtHead(struct students *pHead)
{
?     //新建一个节点
?     printf("\n\n在头部插入一个节点\n");
?     struct students *pNew;
?     pNew = (struct students*)malloc(sizeof(struct students));
?     printf("请输入新学生的信息!\n");
?     scanf("%d%s", &pNew->number, pNew->name); 
?     pNew->pNext = pHead; //让新节点的pNext-》原来的头结点。
?     pHead = pNew;     //把pHead指向新节点  
?     count++;      //节点数+1
?     return pHead;
}

技术分享图片

2.在尾部插入一个节点

1、创建一个节点pNew

2、顶一个中间的指针pTemp 通过循环(条件为pTemp->pNext!=null).得到尾节点。

3、pTemp->pNext=pNew;

pNew->pNext=NULL;

在尾部插入一个节点

void InsertAtEnd(struct students *pHead)
{
?     //新建一个节点
?     printf("\n\n在尾部插入一个节点\n");
?     struct students *pNew;
?     pNew = (struct students*)malloc(sizeof(struct students));
?     printf("请输入新学生的信息!\n");
?     scanf("%d%s", &pNew->number, pNew->name);
?     struct students *pTemp;
?     pTemp = pHead;
?     //for (int i = 1; i < count; i++) //节点数的值
?     //{
?     //    pTemp = pTemp->pNext;
?     //}
?     //for (; pTemp->pNext != NULL; pTemp = pTemp->pNext);
?     while (pTemp->pNext != NULL)
?     {
?         pTemp = pTemp->pNext;
?     }
?     pNew->pNext = NULL;
?     pTemp->pNext = pNew;
?     count++; //节点数
}

技术分享图片

3. 在中间插入

//在中间(第几个节点之后)插入节点

void InsertAtMid(struct students *pHead, int index)
{
?     //新建一个节点
?     printf("\n\n在第%d个节点后插入一个节点\n",index);
?     struct students *pNew;
?     pNew = (struct students*)malloc(sizeof(struct students));
?     printf("请输入新学生的信息!\n");
?     scanf("%d%s", &pNew->number, pNew->name);
?     struct students *pTemp;
?     struct students *pPre;
?     pTemp = pHead;
?     pPre = pHead; 
?     for (int i = 1; i < index+1; i++) //假设index=2 需要循环2次
?     {
?         pPre = pTemp;
?         pTemp = pTemp->pNext;
?     }
?     pPre->pNext = pNew;
?     pNew->pNext = pTemp;
?     count++;
}

技术分享图片

C语言链表

原文:https://www.cnblogs.com/qzdd/p/12340473.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!