• QQ
  • nahooten@sina.com
  • 常州市九洲新世界花苑15-2

技术天地

单链表基本操作

原创内容,转载请注明原文网址:http://homeqin.cn/a/wenzhangboke/jishutiandi/2018/1013/75.html

 

今天常州手机App培训中心幻天网络带来的算法技巧主要是单链表的一些常见操作:像创建链表,删除结点,插入结点,链表逆序,按大小排序等

 

  1 #include <iostream>

  2 using namespace std;

  3 

  4 struct Node

  5 {

  6     int val;

  7     Node *next;

  8     Node(int x) :val(x), next(nullptr){}

  9 };

 10 

 11 //创建带有头结点的单链表

 12 void Create(Node *head)

 13 {

 14     int n;

 15     Node *p(head), *q;

 16     cout << "请输入元素个数及相应数据:";

 17     cin >> n;

 18     while (n--)

 19     {

 20         int value;

 21         cin >> value;

 22         q = new Node(value);

 23         q->next = nullptr;

 24         p->next = q;

 25         p = q;

 26     }

 27 }

 28 

 29 //获得链表长度

 30 int GetSize(Node *head)

 31 {

 32     int num = 0;

 33     Node *p = head->next;

 34     while (p)

 35     {

 36         num++;

 37         p = p->next;

 38     }

 39     return num;

 40 }

 41 //输出链表元素

 42 void Print(Node *head)

 43 {

 44     Node *p = head->next;

 45     while (p)

 46     {

 47         cout << p->val << ' ';

 48         p = p->next;

 49     }

 50 }

 51 

 52 //删除值为x的结点

 53 void Delete(Node *head, int x)

 54 {

 55     Node *p(head), *q;

 56     while (p->next && p->next->val != x)

 57     {

 58         p = p->next;

 59     }

 60     if (p->next)

 61     {

 62         q = p->next;

 63         p->next = q->next;

 64         delete[] q;

 65     }

 66     else

 67     {

 68         cout << "链表不存在值为" << x << "的结点" << endl;

 69     }

 70 }

 71 

 72 //链表逆序

 73 void Reverse(Node *head)

 74 {

 75     Node *p(head->next), *q(head->next);

 76     head->next = nullptr;

 77     while (p)

 78     {

 79         q = q->next;

 80         p->next = head->next;

 81         head->next = p;

 82         p = q;

 83     }    

 84 }

 85 

 86 //在升序链表中插入结点使之仍然有序

 87 void Insert(Node *head, Node *t)

 88 {

 89     Node *p(head);

 90     while (p->next && p->next->val < t->val)

 91     {

 92         p = p->next;

 93     }

 94     t->next = p->next;

 95     p->next = t;

 96 }

 97 //按升序排列

 98 void Sort(Node *head)

 99 {

100     Node *p, *q;

101     p = head->next;

102     head->next = nullptr;

103     while (p)

104     {

105         q = p;

106         p = p->next;

107         q->next = nullptr;

108         Insert(head, q);

109     }

110 }

111 

112 void Tips()

113 {

114     cout << "\n请按键选择相应操作" << endl;

115     cout << "-------------------------" << endl;

116     cout << "1.输出链表" << endl;

117     cout << "2.删除链表某一结点" << endl;

118     cout << "3.链表逆序" << endl;

119     cout << "4.按升序排列" << endl;

120     cout << "-------------------------" << endl;

121 }

122 int main()

123 {

124     Node *head = new Node(0);

125     head->next = nullptr;

126     Create(head);

127     Tips();

128     char c;

129     while (cin >> c)

130     {

131         switch (c)

132         {

133         case '1':

134             Print(head);

135             break;

136         case'2':

137             int valToDelete;

138             cout << "请输入要删除结点的值:";

139             cin >> valToDelete;

140             Delete(head, valToDelete);

141             Print(head);

142             break;

143         case'3':

144             Reverse(head);

145             Print(head);

146             break;

147         case '4':

148             Sort(head);

149             Print(head);

150             break;

151         default:

152             break;

153         }

154         Tips();

155     }

156     

157 }

 

测试结果:



上篇:上一篇:单链表逆序的几种方法
下篇:下一篇:线性表实现简单vector