数据结构之链表

一、 单链表的创建、插入、遍历

  1 //
  2 //  main.c
  3 //  1.1-链表创建
  4 //
  5 //  Created by LinKun on 2016/10/14.
  6 //  Copyright © 2016年 LinKun. All rights reserved.
  7 //
  8 
  9 #include <stdio.h>
 10 #include <stddef.h>
 11 #include <stdlib.h>
 12 #include <stdbool.h>
 13 
 14 #define ElemType char
 15 
 16 #pragma mark - 链表结点结构
 17 typedef struct Node {
 18     ElemType data;
 19    struct Node *next;
 20 }Node;
 21 
 22 #pragma mark - 1. 创建单链表
 23 Node *CreateList(Node *head) {
 24     // 如果头结点为空,则创建头结点
 25     if (head == NULL) {
 26         head = (Node *)malloc(sizeof(Node));
 27         head->next = NULL;
 28     }
 29     
 30     // 指向当前结点
 31     Node *prev = head, *temp;
 32     ElemType ch;
 33     
 34     while (true) {
 35         printf("input node: ");
 36         
 37         scanf("%c", &ch);
 38         
 39         if (ch == '#')
 40             break;
 41         
 42         // 创建新链表结点
 43         temp = (Node *)malloc(sizeof(Node));
 44         temp->data = ch;
 45         temp->next = NULL;
 46         
 47         // 在表尾结点后面插入新结点
 48         prev->next = temp;
 49         prev = temp;
 50         
 51         // 过滤回车键
 52         getchar();
 53     }
 54     
 55     return head;
 56 }
 57 
 58 #pragma mark - 2. 遍历单链表
 59 void TranversalList(Node *head) {
 60     // 没有头结点则直接返回
 61     if (head == NULL) {
 62         printf("遍历失败,链表表头为空!");
 63         return;
 64     }
 65     
 66     // 指向当前结点的下一个结点
 67     Node *curr = head->next;
 68     
 69     // 当前结点有下一结点时,输出下一结点值
 70     while (curr) {
 71             printf("结点%c->", curr->data);
 72             curr = curr->next;
 73 
 74     }
 75     printf("NULL\n");
 76 }
 77 
 78 #pragma mark 3. 插入结点
 79 Node *InsertNode(Node *head, ElemType element) {
 80     if (head == NULL) {
 81         printf("插入失败,链表表头为空!");
 82         return head;
 83     }
 84     
 85     // 指向当前结点
 86     Node *prev = head;
 87     // 指向当前结点的下一个结点
 88     Node *curr = head->next;
 89     
 90     // 递推到当前结点是链表尾结点
 91     while (curr) {
 92         prev = curr;
 93         curr = curr->next;
 94     }
 95     
 96     // 创建新结点
 97     Node *temp = (Node *)malloc(sizeof(Node));
 98     temp->data = element;
 99     temp->next = NULL;
100     
101     // 插入到链表尾结点之后
102     prev->next = temp;
103     
104     return head;
105 }
106 
107 
108 
109 #pragma mark - 测试
110 int main(int argc, const char * argv[]) {
111     
112     Node *head;
113     
114     // 创建链表并遍历
115     head = CreateList(head);
116     printf("遍历结果:\n");
117     TranversalList(head);
118     
119     // 插入链表元素并遍历
120     head = InsertNode(head, 'a');
121     printf("遍历结果:\n");
122     TranversalList(head);
123     
124     return 0;
125 }
单链表

 

posted @ 2016-10-30 13:38  穷则独善其身  阅读(149)  评论(0编辑  收藏  举报