链表的动态建立,插入、删除节点学习记录

成都创新互联长期为上千家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为海湖新企业提供专业的成都网站建设、网站建设,海湖新网站改版等技术服务。拥有10年丰富建站经验和众多成功案例,为您定制开发。

(一)单向链表的动态建立

假设有如下情景:用一个函数实现创建3个学生的数据的动态链表,包含学生的学号num、成绩score;

思路

(1)先定义3个变量,head,p1,p2;然后用malloc函数开辟一个节点,让p1、p2两个指针指向这个节点。

(2)从键盘上读取一个学生的数据赋值给这个节点。在此约定学号不能为0,当输入学号为0时候,则代表建立链表结束。

(3)如果这个输入的p1->num!=0,则代表输入的是第一个节点把这个节点给头指针。即head=p1; 如上图所示

(4)然后再开辟另一个节点,并使得p1指向它,接着从键盘输入数据,如果从键盘的读取到数还是不为0,那么该节点有效。如上图所示

(5)把p1的值赋值给p2->next, 即p2->next=p1; 那么现在两个节点就连到一起了。如上图所示

(6)接着把p2=p1,这样p2就跟上了p1的步伐了,可以开始下一次同样的操作;如上图所示如上图所示

(7)再开辟一个新节点,并使得p1指向它,如果num不为0,那么就吧p1赋值给p2->next,这样3个节点就连接到一起了。如上图所示

(8)以此类推,知道最后输入的num 为0 ,建立结束。如上图所示

更为具体代码如下:

//动态链表的创建;
#include
#include
#define LEN sizeof(struct Student)
struct Student   //结构体声明
{
int num;
float score;
struct Student* next;
};
int n;
struct Student   *creat(void)
{
struct Student* head,*p1,*p2;                                    //定义三个指针;
    n = 0; head = NULL;                                             //头指针初始化为NULL;
    p1 = p2 = (struct Student*)malloc(LEN); //开辟一个节点,让p1 p2都指向它;
    scanf_s("%ld,%f", &p1->num, &p1->score); //给这个节点赋值;
    
    while (p1->num != 0)                 //当这个节点的num不为0的时候,说明此节点有效
    {
        n= n + 1;                       //节点数加1;
        if (n == 1) head = p1;           //如果这是第一个节点,那么就让头指针指向它;
        else p2->next = p1;              //如果不是第一个节点,就让p2指向它,此时的p2是上一个节点的指针;
        p2 = p1;                         //之后,让P2跟上P1的步伐,现在p1和p2都指向新的节点了;
        p1= (struct Student*)malloc(LEN);//开辟一个 新新的节点,让p1指向它,重复之前的步骤
        scanf_s("%ld,%f", &p1->num, &p1->score);//输入给新新节点的数据;
    }
    p2->next = NULL;                //退出while循环的条件是p1->num=0;说明链表建立结束了,之后把p2的后驱指为null即可;

    return head;     //返回头指针;
}
int main()
{
struct Student* pt;
    pt= creat();
    printf("\nnum:%ld\nscore:%5.1f\n", pt->num, pt->score);
return 0;
}

当前文章:链表的动态建立,插入、删除节点学习记录
网页网址:http://ybzwz.com/article/dsoijpp.html