线性表:指的是零个或多个数据元素的有限数列。
链式储存结构的优点
我们知道线性表的顺序结构对于查找某一个元素十分方便,根据下标可以快速找出,但是如果要删除某个元素,或者插入某个元素却十分复杂,插入一个元素需要将要插入的地方后面的所有元素往后移动一位,留出一个位置才能插入,而删除就需要从要删除的位置后面所有元素往前移动一位,如果数据较大,这样操作是十分浪费时间的,而链式储存结构却可以很快的完成插入和删除的操作。
在链式结构中,每个数据元素要储存元素信息和后继元素的地址,因此可以使用结构体。
struct node
{
int data;//元素信息
struct node* next;//下一个元素的地址
};
构建链表
#include<stdio.h>
#include<stdlib.h>
struct node
{
int data;//元素信息
struct node* next;//下一个元素的地址
};
int main()
{
struct node* head, * p, * q, * t;//定义结构
int i, n, a;
scanf("%d", &n);
head = NULL;
for (i = 1; i <= n; i++)
{
scanf("%d", &a);
p = (struct node*)malloc(sizeof(struct node));//动态申请内存
p->data = a;
if (head == NULL)
head = p;
else
q->next = p;
q = p;
}
t = head;
while (t != NULL)
{
printf("%d ", t->data);
struct node* s;
s = t;
t = t->next;//指向下一个结点
free(s);//释放内存
}
return 0;
}
上面代码构建了一个单链表,每个结点有这个元素的信息和下一个结点的位置,其中每两个结点不像线性储存结构那样每两个元素之间紧挨着,而是只告诉你下一个元素在哪里。实现输入n,然后输入n个元素输出n个元素,
5
1 2 3 5 6
1 2 3 5 6
链表插入元素
插入和删除其实就是改变指针的指向。如上代码如果想要插入一个元素使链表任然保持升序,就只需要找到其中一个元素指向的下一个元素大于要插入的元素然后改变其指向就行。
while (t != NULL)
{
if (t->next == NULL ||t->next->data > a)//如果当前结点是最后一个或大于待插入的数的时候
{
p = (struct node*)malloc(sizeof(struct node));//动态申请内存
p->data = a;
p->next = t->next;//新增的结点的后继指针指向当前结点的后继指针所指向的结点
t->next = p;//当前结点的指针指向新增结点
break;//插入完毕提前结束
}
t = t->next;
}
完整代码
#include<stdio.h>
#include<stdlib.h>
struct node
{
int data;//元素信息
struct node* next;//下一个元素的地址
};
int main()
{
struct node* head, * p, * q, * t;//定义结构体指针
int i, n, a;
scanf("%d", &n);
head = NULL;
for (i = 1; i <= n; i++)
{
scanf("%d", &a);
p = (struct node*)malloc(sizeof(struct node));//动态申请内存
p->data = a;
if (head == NULL)
head = p;
else
q->next = p;
q = p;
}
t = head;//从头开始
scanf("%d", &a);//输入要插入的元素
while (t != NULL)
{
if (t->next == NULL ||t->next->data > a)//如果当前结点是最后一个或大于待插入的数的时候
{
p = (struct node*)malloc(sizeof(struct node));//动态申请内存
p->data = a;
p->next = t->next;//新增的结点的后继指针指向当前结点的后继指针所指向的结点
t->next = p;//当前结点的指针指向新增结点
break;//插入完毕提前结束
}
t = t->next;
}
t = head;
while (t != NULL)
{
printf("%d ", t->data);
struct node* s;
s = t;
t = t->next;//指向下一个结点
free(s);//释放内存
}
return 0;
}
上面代码就是输入原来的链表,然后输入一个要插入的元素,然后输出。
5
1 2 3 5 6
4
1 2 3 4 5 6