单链表实现

  1 #include <stdio.h>
  2 #include <string.h>
  3 #include <stdlib.h>
  4 
  5 typedef int ElemType;
  6 typedef struct ListNode{
  7     struct ListNode* next;
  8     ElemType data;
  9 }*LinkList, ListNode;
 10 
 11 //  初始化链表
 12 LinkList init_list(LinkList &list)
 13 {
 14     list->next = NULL;
 15     list->data = 0;
 16     return list;
 17 }
 18 
 19 // * 建立链表
 20 // * 头插法
 21 // * 王道 P.27
 22 // *
 23 
 24 LinkList create_list(LinkList &list)
 25 {
 26     ListNode *n_node;
 27     ElemType x;
 28     list = (LinkList)malloc(sizeof(ListNode));
 29     list->next = NULL;
 30     list->data = 0;
 31     scanf("%d", &x);
 32     while(x != 9999)                             ///输入9999表示结束
 33     {
 34         n_node = (LinkList)malloc(sizeof(ListNode));
 35         n_node->data = x;
 36 
 37         n_node->next = list->next;               ///核心的地方
 38         list->next = n_node;
 39         scanf("%d", &x);
 40     }
 41     return list;
 42 }
 43 
 44 
 45 // * 尾插法
 46 // * 王道 P.28
 47 // *
 48 
 49 LinkList create_list2(LinkList &list)
 50 {
 51     ElemType x;
 52     list = (LinkList)malloc(sizeof(ListNode));
 53     ListNode *n_node, *rear = list;             ///rear 指向链表尾
 54     list->next = NULL;
 55     list->data = 0;
 56     scanf("%d", &x);
 57     while(x != 9999)                            ///输入9999表示结束
 58     {
 59         n_node = (LinkList)malloc(sizeof(ListNode));
 60         n_node->data = x;
 61 
 62         rear->next = n_node;                    ///核心的地方
 63         rear = n_node;
 64         scanf("%d", &x);
 65     }
 66     rear->next = NULL;
 67     return list;
 68 }
 69 
 70 
 71 // * 打印链表的信息
 72 // *
 73 
 74 void show_list(LinkList list)
 75 {
 76     printf("
show list
");
 77     //因为加了头结点,所以跳过头结点
 78     list = list->next;
 79     while(list != NULL)
 80     {
 81         printf("%d ", list->data);
 82         list = list->next;
 83     }
 84     return;
 85 }
 86 
 87 
 88 // * 按序号查找结点的值
 89 // * 王道 P.28
 90 // *
 91 
 92 ListNode* get_elem(LinkList list, int i)
 93 {
 94     int j = 1;
 95     ListNode* tmp = list->next;
 96     if(i == 0)
 97         return list;
 98     if(i < 0)
 99         return NULL;
100     while(tmp && i > j)
101     {
102         tmp = tmp->next;
103         j++;
104     }
105     return tmp;
106 }
107 
108 // * 按值查找表结点
109 // * 王道 P.29
110 // *
111 
112 ListNode* locate_elem(LinkList list, ElemType x)
113 {
114     ListNode* tmp = list->next;
115     while(tmp && tmp->data != x)
116         tmp = tmp->next;
117     return tmp;
118 }
119 
120 
121 // * 在指定位置上插入一个结点,返回当且要插入结点的指针
122 // * 王道 P.29
123 // *
124 
125 ListNode* insert_node(LinkList &list, int position, ElemType x)
126 {
127     int i = 1;
128     ListNode* p = list->next;
129     while(i < position)
130     {
131         p = p->next;
132         i++;
133     }
134     ListNode* tmp = (LinkList)malloc(sizeof(ListNode));
135     tmp->data = x;
136     tmp->next = p->next;                                    //这是核心
137     p->next = tmp;
138     return tmp;
139 }
140 
141 // * 删除一个结点
142 // * 王道 P.30
143 // *
144 
145 ElemType delete_node(LinkList &list, int position)
146 {
147     int i = 1;
148     ListNode* p = list->next;
149     ListNode* pre = list;
150 
151     while(i < position)
152     {
153         pre = p;
154         p = p->next;
155         i++;
156     }
157     i = p->data;
158     pre->next = p->next;
159     free(p);
160     return i;
161 }
162 
163 // * 求链表的=长度
164 // * 王道 P.31
165 // *
166 
167 int list_length(LinkList list)
168 {
169     int len = 0;
170     ListNode* tmp = list->next;
171     while(tmp)
172     {
173         tmp = tmp->next;
174         len++;
175     }
176     return len;
177 }
178 /*
179  * swap function
180  * 用来交换两个结点的信息
181  * */
182 void swap(ListNode *n1, ListNode *n2)
183 {
184     ElemType  tmp;
185     tmp = n1->data;
186     n1->data = n2->data;
187     n2->data = tmp;
188 }
189 /*
190  * 单链表的插入排序
191  * http://www.cnblogs.com/Camilo/p/3927912.html
192  * 基本思想:假设前面n-1个结点有序,将第n个结点插入到前面结点的适当位置,使这n个结点有序。
193  * 实现方法:
194  * 将链表上第一个结点拆下来,成为含有一个结点的链表(head1),其余的结点自然成为另外一个链表(head2),此时head1为含有一个结点的有序链表;
195  * 将链表head2上第一个结点拆下来,插入到链表head1的适当位置,使head1仍有序,此时head1成为含有两个结点的有序链表;
196  * 依次从链表head2上拆下一个结点,插入到链表head1中,直到链表head2为空链表为止。最后,链表head1上含所有结点,且结点有序。
197  * */
198 LinkList insert_sort(LinkList list)
199 {
200     ListNode *list2, *current, *p, *q;
201     if(!list || !(list->next))
202         return  list;
203 
204     //第一次拆分
205     list2 = list->next;
206     list->next = NULL;
207 
208     while(list2)
209     {
210         current = list2;
211         list2 = list2->next;
212         //寻找插入位置,插入位置为p和q之间
213         for(p = NULL, q = list; q && q->data <= current->data; p = q, q = q->next);
214 
215         if(q == list)
216             list = current;  //current插入到最前面
217         else
218             p->next = current;
219 
220         current->next = q;
221     }
222     return list;
223 }
224 
225 /*
226  * 单链表冒泡排序
227  * 还是自己理解的东西,写自己的风格超级舒服
228  * */
229 LinkList bubble_sort(LinkList list)
230 {
231     if(!list || !(list->next))
232         return  list;
233     ListNode *p, *q;
234     for(p = list; p != NULL; p = p->next)
235     {
236         for(q = p; q->next != NULL; q = q->next)
237         {
238             if(q->data > q->next->data)
239                 swap(q, q->next);
240         }
241     }
242     return list;
243 }
244 /*
245 int main()
246 {
247     LinkList list;
248     //list = create_list(list);
249     LinkList pNode = create_list2(list);
250     list = pNode;
251     show_list(list);
252 
253 //    ListNode* get_elem1 = get_elem(list, 3);
254 //    printf("
%d 
", get_elem1->data);
255 //
256 //    ListNode* locate_elem1 = locate_elem(list, 4);
257 //    printf("
this is a pointer : %d
", locate_elem1->data);
258 //
259 //    insert_node(list, 3, 9999);
260 //    show_list(list);
261 //
262 //    delete_node(list, 3);
263 //    show_list(list);
264 
265     printf("
the list`s length is %d
", list_length(list));
266 
267     //bubble_sort(list);
268     insert_sort(list);
269     show_list(list);
270 
271     return 0;
272 }
273 
274 */
#include <iostream>

using namespace std;

class Node
{
public:
    int data;
    Node *next;
};

class LinkList
{
public:
    LinkList();

    ~LinkList();
    void CreateLinkList(int n); 
    void TravalLinkList();
    int GetLength();
    bool IsEmpty();
    Node *Find(int data);
    void InsertElemAtEnd(int data);
    void InsettElemHead(int data);
    void DeleteElemAtEnd();

private:
    Node *head;

};

LinkList::~LinkList() {
    delete head;
}

LinkList::LinkList() {
    head = new Node();
    head->data = 0;
    head->next = NULL;
}

void LinkList::CreateLinkList(int n) {
    Node *p_new, *p_tmp;
    p_tmp = head;
    if(n <= 0){
        cout << "node cnt error" << endl;
    }
    for(int i=0;i<n;++i)
    {
        p_new = new Node();
        cout << "input n nums" << endl;
        cin >> p_new->data;
        p_new->next = NULL;
        p_tmp->next = p_new;
        p_tmp = p_new;
    }
}

void LinkList::TravalLinkList() {
    if(head == NULL || head->next == NULL)
        cout << "empty list" << endl;

    Node *p_tmp = head;
    while(p_tmp->next != NULL)
    {
        p_tmp = p_tmp->next;
        cout << p_tmp->data << " ";
    }
}

int LinkList::GetLength() {

    int cnt = 0;
    Node *p_tmp = head->next;
    while(p_tmp !=NULL)
    {
        cnt++;
        p_tmp = p_tmp->next;
    }

    return cnt;
}

bool LinkList::IsEmpty() {
    if(head->next == NULL)
        return true;
    return false;
}

Node *LinkList::Find(int data) {

    Node *p = head;
    if(p == NULL)
    {
        cout << "llist empty" << endl;
        return NULL;
    }

    while(p->next != NULL)
    {
        if(p->data == data)
            return p;
        p = p->next;
    }


    return nullptr;
}

void LinkList::InsertElemAtEnd(int data) {
    Node *node_n = new Node();
    node_n->next = NULL;
    node_n->data = data;
    Node *p = head;

    if(head == NULL)
        head = node_n;
    else
    {
        while(p->next != NULL)
            p=p->next;
        p->next = node_n;
    }
}

void LinkList::InsettElemHead(int data) {
    Node *node_n = new Node();
    node_n->data = data;
    Node *p=head;

    if(head == NULL)
        head = node_n;
    node_n->next = p->next;
    p->next = node_n;
}

void LinkList::DeleteElemAtEnd() {
    Node *p = head;
    Node *p_tmp = NULL;

    if(p->next != NULL)
        cout << "llist is empty" << endl;
    else{
        while(p->next != NULL)
        {
            p_tmp = p;
            p = p->next;
        }

        delete p;
        p = NULL;
        p_tmp->next = NULL;
    }
}

int main() {

    LinkList llist;
    int n;
    cin >> n;
    llist.CreateLinkList(n);
    cout << llist.GetLength() << endl;

    cout << llist.IsEmpty() << endl;
    cout << llist.Find(12)->data << endl;
    llist.InsertElemAtEnd(11);
    llist.InsettElemHead(21);
    llist.DeleteElemAtEnd();

    llist.TravalLinkList();
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/ya-cpp/p/5832270.html