链表是最基本的数据结构之一,建立单项链表步骤如下
- 定义链表节点
- 定义三个指针——头指针,尾指针,当前结点指针。并分别申请内存,初始化
- 判断是不是头指针,如果是,则当前结点赋值给头指针,尾指针的后继为空;如果当前不是头指针,在尾指针后追加当前结点
- 完成插入操作后,更新尾指针和尾指针的后继
- 重新申请一块内存为新的扩展节点使用
定义简单的节点结构体
1 typedef struct Node2 {3 int data;4 struct Node *next;5 } Node;
最后返回链表的头指针
1 Node *create() 2 { 3 int n; 4 int i; 5 Node *head=NULL; 6 Node *tail; 7 Node *p; 8 tail = (Node *)malloc(sizeof(Node)); 9 p = (Node *)malloc(sizeof(Node));10 if(p==NULL)11 {12 printf("Fail to create a new node.....");13 return NULL;14 }15 else16 {17 for(i=0; i<10; i++)18 {19 p->data=i;20 if(head==NULL)21 {22 head=p;23 tail->next=NULL;24 }25 else26 {27 tail->next=p;28 }29 tail=p;30 tail->next=NULL;31 p = (Node *)malloc(sizeof(Node));32 }33 }34 return head;35 }
问题
在第一次写链表的时候,每次输出链表的时候总是输出尾节点的值。后来发现,原来是指针的问题。
就是每次添加一个节点时,没有新申请一块未使用的内存,而是继续使用p,而p和head都是指向头节点的(第22行),所以,使用p和head都能改变认为的头节点的值,所以每次改变p,实际上就是改变了head所指向的值。
所以,这里应该为新节点申请一块新的内存。