大一的时候用c语言学的链表,学的懵懵懂懂,模模糊糊;大二的时候重新回顾链表的相关知识,有了一个更为宏观的概念。(这里只讲单向链表)
- 链表是一系列存储数据元素的单元通过指针联系起来的,因此每个单元都至少包含了两个区域,一个是存储数据元素的区域,一个是存储指针的区域。这些存储数据元素的单元我们统称为节点(node)。
单向链表中数据域是存储数据用的,指针域是用来指向下一个有同样结构的单元。
和数组类似,单向链表的节点也是一个线性次序,比如 a0的next只想a1,则a0是a1的前驱,可以用一个指针找到某个单元的后驱,同时,也可以用两个指针来找出某个单元的前驱。 - 链表是逻辑意义上的相连,但实际意义上并非如此,是由指针来替代数组的数据结构的。
- 相对于数组来说,数组查找更为方便,因为链表的查找需要从头到尾依次进行,但链表的插入和删除操作更为简单,因为正如上面所说,链表并不是实际上的链式结构,其链式结构是由指针体现的,故插入和删除只考虑指针就可以了,而不用考虑把数据元素给移位。
下面我们用c语言实现以下基本的创建链表和删除,增加,查找功能
创建链表
- 创建一个结构体
typedef struct link
{
int x;
struct link *next;
}student;
- 创建一个链表
student *head,*h,*node;
int n,i;
head=(student*)malloc(sizeof(student));
h=head;
printf("how many number do you want to creat\n");
scanf("%d",&n);
for(i=0;i<n;i++)
{
h->next=(student*)malloc(sizeof(student));
h=h->next;
printf("put in your number ");
scanf("%d",&h->x);
}
h->next=NULL;
h=head->next;
while(h!=NULL){
printf("%d\n",h->x);
h=h->next;
}
- 修改链表中的某个值(查找)
void change(student *list,int n)
{
student *t=list,*h;
int i=0,m;
while(i<n && t!=NULL)
{
t=t->next;
i++;
}
if(t!=NULL)
{
printf("put into the changable number\n");
scanf("%d",&t-