1.结点
链表中用来存储一个数据的存储单元。
一个链表至少需要由两部分组成,就是数据域和指针域,一般形式的结点定义为:
struct node
{
Elem data; //Elem类型泛指基本数据类型
struct node *next;
}
typedef struct node Elemsn;
以上两步等价于:
typedef struct node
{
Elem data;
struct node *next;
}Elemsn;
2.使用指针变量p表示结点的成员
*p.data //错误,正确为(*p).data
p->data //正确
p->next //正确
注:(.)、(->)、([])三种运算符的优先级依次递减(这三个是C语言中优先级最高的运算符)。
3.前驱结点;某个结点的前一个结点。
后继结点:某个结点的后一个结点。
单向链表的特点:
(1)有且只有一个结点无前驱,即头结点。头结点通过head指针指向。
(2)有且只有一个结点无后继,即尾结点。尾结点的next域值为NULL。
(3)除了头结点尾结点之外剩下的所有结点有且只有一个前驱,有且只有一个后继。
4.例子
链表中用来存储一个数据的存储单元。
一个链表至少需要由两部分组成,就是数据域和指针域,一般形式的结点定义为:
struct node
{
Elem data; //Elem类型泛指基本数据类型
struct node *next;
}
typedef struct node Elemsn;
以上两步等价于:
typedef struct node
{
Elem data;
struct node *next;
}Elemsn;
2.使用指针变量p表示结点的成员
*p.data //错误,正确为(*p).data
p->data //正确
p->next //正确
注:(.)、(->)、([])三种运算符的优先级依次递减(这三个是C语言中优先级最高的运算符)。
3.前驱结点;某个结点的前一个结点。
后继结点:某个结点的后一个结点。
单向链表的特点:
(1)有且只有一个结点无前驱,即头结点。头结点通过head指针指向。
(2)有且只有一个结点无后继,即尾结点。尾结点的next域值为NULL。
(3)除了头结点尾结点之外剩下的所有结点有且只有一个前驱,有且只有一个后继。
4.例子
example 1:创建单向链表,最基本的实现方式。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
#include <stdio.h>
#include <malloc.h>
#define NULL
0
typedef struct node{
int
data;
struct node *next;
//不能使用ElemSN
}ElemSN;
int
main()
{
ElemSN *head, *p;
int
i, ms;
/*ms用来存放结点的个数*/
int
x;
printf(
"Please input node number:"
);
scanf(
"%d"
, &ms);
head = p = (ElemSN *)malloc(sizeof(ElemSN));
printf(
"Please input data:"
);
scanf(
"%d"
, &x);
head->data = x;
head->next = NULL;
/*创建第一个结点,因为是头结点,和后面的结点有些不一样所以单独写出来*/
for
(i =
0
; i < ms-
1
; i++)
/*创建后面的ms-1个结点*/
{
p->next = (ElemSN *)malloc(sizeof(ElemSN));
printf(
"Please input data:"
);
scanf(
"%d"
, &x);
p->next->data = x;
p->next->next = NULL;
p = p->next;
}
for
(p = head; p != NULL; p = p->next)
{
printf(
"%d "
, p->data);
}
printf(
"\n"
);
}</malloc.h></stdio.h>
|
http://www.2cto.com/kf/201407/317187.html