<C> 链表 双向链表 栈 队列

一.链表

1.线性存储结构:

在一个结构体中 再放一个本类型(结构体类型)的指针

这个指针不指向自己 指向的是要找的下一个结构体的地址 以此类推 没有数量限制

2.声明及链表遍历:

 1 #include<stdio.h>
 2 
 3 typedef struct AA
 4 {
 5     int bh;
 6     char* name;
 7     char* tel;
 8     struct AA* pNext;
 9 }Node;
10 
11 int main()
12 {
13     
14     Node a = {1,"aa","111",NULL};
15     Node b = {2,"bb","222",NULL};
16     Node c = {3,"cc","333",NULL};
17     
18     Node* p = &a;
19     
20     a.pNext = &b;
21     b.pNext = &c;
22     
23     while(p != NULL)
24     {
25         printf("%d %s %s\n",p->bh,p->name,p->tel);
26         p = p -> pNext; 
27     }
28 
29     return 0;
30 }

注:

①代码中的p存的是这个结构体的地址 而不是这个结构体的指针

②在移动p的时候 不能用p++ 链表的存储不一定是连续的 连续的空间才可以用p++

3.链表添加:

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 
 4 typedef struct NODE
 5 {
 6     int bh;
 7     char* name;
 8     char* tel;
 9     struct NODE* pNext;
10 }Node;
11 
12 void AddNode(int bh,char* name,char* tel,Node** ppHead,Node** ppEnd);
13 
14 int main()
15 {
16     Node* pHead = NULL;
17     Node* pEnd = NULL;
18 
19     AddNode(1,"aaa","111",&pHead,&pEnd);
20     AddNode(2,"bbb","222",&pHead,&pEnd);
21     AddNode(3,"ccc","333",&pHead,&pEnd);
22     AddNode(4,"ddd","444",&pHead,&pEnd);
23 
24     return 0;
25 }
26 
27 void AddNode(int bh,char* name,char* tel,Node** ppHead,Node** ppEnd)
28 {
29     Node* pNode = (Node*)malloc(sizeof(Node));
30     pNode -> bh = bh;
31     pNode -> name = name;
32     pNode -> tel = tel;
33 
34     if((*ppHead) == NULL)
35     {
36         *ppHead = pNode;
37         *ppEnd = pNode;
38     }
39     else
40     {
41         (*ppEnd) -> pNext = pNode;
42         *ppEnd = pNode;
43     }
44 
45     return ;
46 }

思路:

①给节点申请空间 并赋值

②判断链表是否存在

分两种情况:一是不存在 那么这个新来的结点即是头 也是尾

二是存在 那么就让尾的下一个指向新来的这个结点(先连) 然后让尾指向新来的结点(后移)

注:

①整个链表是以第一个节点的地址存在的

②之所以链表有两个指针 一个头指针 一个尾指针 有了尾指针是为了省去遍历的过程 方便知道最后一个节点的位置

③在传参的时候 要注意 如果你想改变外面传进来的指针的值 那就得用二级指针

4.链表插入:

猜你喜欢

转载自www.cnblogs.com/Aaaaaalei0612/p/8973198.html
今日推荐