初学数据结构——练习有序链表的插入

初学数据结构——练习有序链表的插入

有一串已经从小到大排好序的数字,现在需要往这串数字中插入一个数字,使得得到的新序列仍然符合从小到大的序列。

在储存一大波数字的时候,我们通常使用的是数组,但是数组有时候显得不够灵活,比如:

向2 3 5 8 9 10 18 26 32 中插入6,如果用数组来实现这一操作,则需要将8和8后面的数字都依次往后挪一位。

而链表操作,只需要将5的后继指针从8指向6,同时让6的后继指针指向8即可。

malloc函数:

从内存中申请分配指定字节大小的内存空间,比如malloc(sizeof(int));申请了4个字节的空间来准备存放一个整数。我们要使用这个空间的话,就需要用一个指针来指向这个空间,即这个空间的地址。

 1 //数据结构联系 链表实现数据插入有序表
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<iostream>
 5 using namespace std;
 6 
 7 struct node//创建结构体用来表示链表的结点类型
 8 {
 9     int data;
10     struct node *next;
11 };
12 
13 int main()
14 {
15     struct node *head,*p,*q,*t;
16     int n,a;
17     cin>>n;
18     head=NULL;//头指针初始为空
19     for(int i=1;i<=n;i++)
20     {
21         cin>>a;
22         //动态申请一个空间,用来存放一个结点,并用临时指针p指向这个结点
23         p=(struct node *)malloc(sizeof(struct node));    
24         p->data=a;//将数据存储到当前结点的data域中
25         //设置当前结点的后继指针指向空,也就是当前结点的下一个结点为空
26         p->next=NULL;
27         if(head==NULL)    
28             head=p;//如果这是第一个创建的结点,则将头指针指向这个结点
29         else   
30             q->next=p;//如果不是第一个创建的结点,则将上一个结点的后继指针指向当前结点
31         
32         //指针q也指向当前结点
33         q=p;
34     }
35     
36  
37     cin>>a;//读入待插入的数
38     t=head;//从链表头部开始遍历
39     while(t!=NULL)
40     {
41         if(t->next==NULL||t->next->data>a)
42         //如果当前结点是最后一个结点或者下一个结点的值大于待插入数的时候插入
43         {
44             //动态申请一个空间,用来存放一个结点,并用临时指针p指向这个结点
45             p=(struct node *)malloc(sizeof(struct node));
46             p->data=a;
47             p->next=t->next;//新增结点的后继指针指向当前结点的后继指针所指向的结点
48             t->next=p;//当前结点的后继指针指向新增结点
49             break;
50         }
51         t=t->next;//继续下一个结点
52     }
53     t=head;//从链表头部开始输出
54     while(t!=NULL)
55     {
56         cout<<t->data<<" ";//输出结点
57         t=t->next;//继续下一个结点
58     }
59     return 0;
60 }