自学第一天 深深感觉到数据结构与算法深深的恶意。。。(对于头结点,头指针,首元结点,就被搞蒙了)
接下来说说自己对头结点 头指针 首元结点的认识吧。(自己想的,也有可能有错误,希望大家指出本菜鸟的错误,一起学习交流!)
1 对于头指针与头结点 我们可以这么想:头结点就是头指针指向的结点
*head 是一个头指针 头指针指向的结点(头结点)中没有存数据,但是存了下一个结点(首元结点)的指针。
我们可以这样简单的认为:*head指向的是头结点,*(head->next)指向的是首元结点。
自己画的一个示意图:
这是自己的一些理解,下面是按着参考书在linux环境下写的一个单向链表创建与插入的小程序。
#include <stdio.h>
#include <stdlib.h>typedef struct Node
{
int data;
struct Node *next;
}LNode;
LNode *create(int n) //创建带头结点的n个结点的链表
{
LNode *head,*p1,*p2;
int a;
int i = 1;
head = (LNode *)malloc(sizeof(LNode)); //申请一个头节点
head->next = NULL; //初始化建一个空表
for(; n > 0 ; n--)
{
p1 = (LNode*)malloc(sizeof(LNode)); //申请一个新结点
printf("请输入你要放进链表中的第%d个数据(整数)\n",i);
scanf("%d",&a);
p1->data = a; //新结点赋值
if(head->next == NULL) //判断是否为空表
{
head->next = p1; //是空表就将链表首元结点赋值p1
p2 = p1;
}
else
{
p2 -> next = p1; //将新结点一个个接到链表尾部
p2 = p1;
}
i ++;
}
p2 -> next = NULL; //结束创建,尾指针为空
return head;
}
int ListInsert(LNode *head ,int i,int x) //第i个结点前插入数据元素
{
LNode *p2,*p1;
int j = 0;
p2 = head;
while(p2 != NULL && j < i-1) //遍历链表 找到i-1的结点
{
p2 = p2->next;
j++;
}
if(j != i-1)
{
printf("error..\n");
exit(1);
}
p1 = (LNode*)malloc(sizeof(LNode)); //申请新结点
p1->data = x; //新结点赋值
p1->next = p2->next; //插入
p2->next = p1;
return 1;
}
void main()
{
LNode *q,*q1;
int n,i,x;
printf("请输入你要创建链表的结点个数 (整数): \n");
scanf("%d",&n);
q = create(n); //创建链表
q1 = q;
printf("您输入的链表为: \n");
while(q->next != NULL)
{
q = q->next;
printf("%d\t",q->data);
}
printf("\n");
printf("请输入结点插入位置\n");
scanf("%d",&i);
printf("请输入插入的数据\n");
scanf("%d",&x);
ListInsert(q1,i,x); //插入数据
printf("您插入后的链表为: \n");
while(q1->next != NULL)
{
q1 = q1->next;
printf("%d\t",q1->data);
}
printf("\n");
}
下面是运行结果: