20 return NULL;
21 }
22
23 return pnode;
24 }
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
【单向链表】
①.如何创建一个单链表?
链表节点的定义:
typedef struct node
{
int data; //节点内容
node *next; //下一个节点
}node;
单链表的创建:
1 //创建单链表
2 node *create()
3 {
4 int i = 0; //链表中数据的个数
5 node *head, *p, *q;
6 int x = 0;
7 head = (node *)malloc(sizeof(node)); //创建头节点
8
9 while(1)
10 {
11 printf("Please input the data: ");
12 scanf("%d", &x);
13 if (x == 0) //data为0时创建结束
14 break;
15 p = (node *)malloc(sizeof(node));
16 p->data = x;
17 if (++i == 1)
18 { //链表只有一个元素
19 head->next = p; //连接到head的后面
20 }
21 else
22 {
23 q->next = p; //连接到链表尾端
24 }
25 q = p; //q指向末节点
26 }
27 q->next = NULL; //链表的最后一个指针为NULL
28 return head;
29 }
上面的代码中,使用while循环每次从终端读入一个整型数据,并调用malloc动态分配链表节点内存存储这个整型数据,然后再插入到单链表的末尾。最后当数据为0时表示插入数据结束,此时把末尾节点的next指针置为NULL。
②.查找单链表中间元素?
解析:
这里使用一个只用一遍扫描的方法。描述如下:
假设mid指向当前已经扫描的子链表的中间元素,cur指向当前以扫描链表的尾节点,那么继续扫描即移动cur到cur->next,这时只需判断一下应不应移动mid到mid->next就行了。所以一遍扫描就能找到中间位置。代码如下:
1 node *search(node *head)
2 {
3 int i = 0;
4 int j = 0;
5 node *current = NULL;
6 node *middle = NULL;
7
8 current = middle = head->next;
9 while(current != NULL)
10 {
11 if( i / 2 > j)
12 {
13 j++;
14 middle = middle->next;
15 }
16 i++;
17 current = current->next;
18 }
19
20 return middle;
21 }
③.打印单向链表?
解析:
单链表的打印:
1 //打印单链表
2 void print(node *head)
3 {
4 node *p;
5 int index = 0;
6 if (head->next == NULL) //链表为空
7 {
8 printf("Link is empty!\n");
9 return;
10 }
11 p = head->next;
12 while(p != NULL) //遍历链表
13 {
14 printf("The %dth node is: %d\n", ++index, p->data); //打印元素 ----- 也可计算单链表长度 count++;
15 p = p->next;
16 }
17 }
单链表的打印与单链表的测长方法类似,使用while循环进行遍历链表所有节点并打印各个节点内容,当遇到NULL时结束循环。
④.查找单链表节点?
单链表的查找节点:
1 //查找单链表pos位置的节点,返回节点指针
2 //pos从0开始,0返回head节点
3 node *search_node(node *head, int pos)
4 {
5 node *p = head->next;
6 if (pos < 0) //pos位置不正确
7 {
8 printf("incorrect position to search node!\n");
9 return NULL;
10