您的位置:首页 > 其它

学习 单链表 总结二

2015-09-14 23:40 232 查看

学习 单链表 总结二

—-单链表的头结点、头指针及单链表的初始化等

头结点与头指针



头结点即第一个结点,头指针是指向第一个结点的指针. 在单链表中,可以没有头结点,但是不能没有头指针.

下面是头结点与头指针的关系:

// 定义结点的结构体
typedef struct Node
{
int data;
struct Node* next;
}Node, *LinkList;


那么若定义:

LinkList L;


则L为链表的头指针.

// 创建一个结点
L = (LinkList)malloc(sizeof(struct Node));


这时,L返回一个指针,并且赋给了头指针.

单链表的初始化

带头结点初始化

用上面的结构体定义. 直接代码如下:

// 声明头结点
Node* head;

// 带头结点初始化
void InitList(Node** head)
{
*head = (Node*)malloc(sizeof(Node));
(*head)->next = NULL;
}


不带头结点初始化

方法一:

// 声明头结点
Node* head;

void InitList(Node** head)
{
*head = NULL;
}


方法二:

// 声明头结点
Node* head;

void InitList(Node* head)
{
head = NULL;
}


为什么带头结点单链表的初始化只有一种方式?

因为不带头结点声明Node *head 时,C编译器将其自动初始化为NULL,于是根本不需要调用InitList(head); 也即不带头结点的初始化是个伪操作。而带头结点的初始化在堆开辟了一段内存,需要修改head指针变量指向的地址(即head的值),所以要修改head的值,必须传保存head变量的地址(即二维指针)。而直接调用CreatList(head);相当于传head变量的值,函数修改的是head的副本,无法真正改变head的值。

这其实本质上还是传值,传址的问题,只不过指针本身保存的地址,让这个过程变得有点纠结。在函数调用需要修改指针变量的指向(value)时,应该传递指针变量的地址(address)。

单链表的创建

带头结点的创建

void CreatList(Node** head)
{
Node* phead = *head;
Node* CurrentNode;
int InputValue;

while (scanf("%d", &a))
{
if (0 != a)
{
CurrentNode = (Node*)malloc(sizeof(Node));
CurrentNode->value = a;
phead->next = CurrentNode;

phead = CurrentNode;
}
}

}


不带头结点的创建

不带头结点的初始化,第一个结点与其他结点的处理要分开!

void CreatList(Node** head)
{
Node* phead;
Node* CurrentHead;
int InputValue;
int i = 1;

while(scanf("%d", &a))
{
if (0 != a)
{
CurrentHead = (Node*)malloc(sizeof(Node));
CurrentHead->value = a;
// 第一个结点的处理操作
if (1 == i)
{
*head = CurrentHead;
}
else
{
phead->next = CurrentHead;
}

phead = CurrentHead;
}
else
{
phead->next = NULL;
break;
}

i++;
}
}


参考文档

/article/1307880.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: