头插法建立单链表图示过程(其中an表示时间上第n个建立的节点,L为头指针,箭头表指向,sn代表an的地址)
结构体代码与主函数如下:
struct Link //创建一个结构体类型
{int data; //数据域struct Link* p; //指针域
};
struct Link* Creat_link(void); //建立单链表函数
void print(struct Link*); //输出单链表函数
int main(void)
{struct Link * L;L = Creat_link();print(L);return 0;
}
单链表建立函数如下:
struct Link* Creat_link(void)
{struct Link* L, * s;//L是头指针int i, n, size;size = sizeof(struct Link);L = (struct Link*)malloc(size);//首先建立头结点L->p = NULL; //将头节点指针域赋值为空同时也为尾结点指针域置空做铺垫scanf("%d", &n); //输入想要建立的单链表长度if (n == 0){return L;}scanf("%d", &L->data);for (i = 1; i < n; i++){s = (struct Link*)malloc(size);//建立新的节点scanf("%d", &s->data);s->p = L->p;//把新的节点与后面的节点接上L->p = s;//把新的节点与头结点接上}return L;
}
/*
这两行的代码是头插法的核心:
s->p = L->p;
L->p = s;
要细细品味,这两行代码如果从逻辑上看第一次执行和第n(n>=2)次执行是不一样的
第一次执行是把新建立的节点作为尾结点并且37行使其指针域为空,第n次执行时是把
新建立的节点插入到头结点的下一个,37行使其与后面接上,38行使其与头结点接上
*/
输出函数如下:
void print(struct Link* L)
{if (L->p == NULL){printf("此链表为空");}else{while (1){printf("%d ", L->data);if (L->p == NULL) break;L = L->p;}}
}
注:本人小白,如有错误还望指教