这两天有点累,博客的更新的速度有点慢,准确的来说是自己有点精力分散在其他方面,话不多说,进入正题:
再数据结构中,链表算是比较初级的东西,所谓链表,可以看做数组的变形,我们可以利用数组先来模拟链表,首先我们需要先理解下链表的结构,链表可以理解下面这样
我们首先开辟出一块空间来存储一系列的数字,但是这些数字存储的地方含有指向下一个数的指针,这些在c语言中可以用结构体来完成;代码部分如下
struct node { int data; struct node * next; };
上述代码定义了一个结构体,用来完成链表的连接;
struct node *head,*p,*q,*t; //定义一些指针来完成的链表的连接
关于这些参数的使用,我们可以参照下面的例子
for(i=1;i<=n;i++) { scanf("%d",&a); p=(struct node *)malloc(sizeof(struct node)); //开辟动态空间完成存储 p->data=a; p->next=NULL; ///设置当前头指针为空 if(head==NULL) head=p; //头指针为空指向p; else q->next=p; //头指针非空,q->next指向链表的下一个节点 q=p; }
链表中常用有插入和删除操作,我们在这里介绍下插入操作,关于删除,大家可以自己思考下,我的链表的事按照正序来输入的,所以在比较非常简单,我们需要查找比输入的数字大的数,然后在这个节点位置进行插入和移动操作就行了
scanf("%d",&a); //需要插入的 t=head; while(t!=NULL) //while 循环进行遍历 { if(t->next->data>a) { p=(struct node *)malloc(sizeof(struct node)); p->data=a; //查找出节点后当前节点赋值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 n,i,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; p->next=NULL; ///设置当前头指针为空 if(head==NULL) head=p; //头指针为空指向p; else q->next=p; q=p; } scanf("%d",&a); t=head; while(t!=NULL) { if(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); t=t->next; } return 0; }
上面的代码已经完成了链表的基本操作,下面我们考虑用数组来完成,用数组完成我们就需要两个数组来分别存储当前节点值和节点连接信息,由于二者原理大同小异,我在这里不多做赘述,直接贴代码
#include<stdio.h> int main() { int data[101],right[101]; int i,n,len,t; scanf("%d",&n); for(i=1;i<=n;i++) scanf("%d",&data[i]); len=n; for(i=1;i<=n;i++) { if(i!=n) right[i]=i+1; else right[i]=0; } len++; scanf("%d",&data[len]); t=1; while(t!=0) { if(data[right[t]]>data[len]) { right[len]=right[t]; //新插入插入节点的标号等于的当前节点的下一个节点编号 right[t]=len; //当前节点的的下一个节点就是插入数的编号 break; //插入完成退出循环 } t=right[t]; } t=1; while(t!=0) { printf("%d",data[t]); t=right[t]; } return 0; }