赞
踩
链表是一种物理存储结构上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。相比于数组这种连续性的储存结构,链表对于插入及删除等操作将更为方便。
- #include<stdlib.h>
- #include<stdbool.h>
- #include<iostream>
- using namespace std;
- struct student
- {
- int score;
- struct student* next;
- };
- typedef struct student stu;
- stu* Creat_Node(int x)//申请结点
- {
- stu* new_node = new stu;
- new_node->score = x;
- new_node->next = NULL;
- return new_node;
- }
- void Initlist(stu*& L)//初始化 stu* &L表示对一个指针的引用
- {
- L = new stu;
- L->next = NULL;
- }
-
- void Insert(int i, int k, stu* L)//在第i个位置插入k;Insert(Get_length(L)+1, 2, L)实现尾插;Insert(1, 2, L);实现头插
- {
- stu* o = L;
- for (int j = 1; j < i; j++)
- {
- o = o->next;
- }
- stu* p = new stu;
- p->score = k;
- p->next = o->next;
- o->next = p;
- }
- void Print_list(stu* head)//遍历打印链表
- {
- if (head->next == NULL)
- {
- cout << "空表" << endl;
- return;
- }
- head = head->next;
- while (head)
- {
- cout << head->score << "->";
- head = head->next;
- }
- cout << "NULL" << endl;
- return;
- }
- void Delete_Kth(stu* list, int k)//删除第k个结点
- {
- for (int i = 1; i < k; i++)
- {
- list = list->next;
- }
- stu* p = new stu;
- p = list->next;
- list->next = list->next->next;
- delete p;
- return;
- }
- int Get_length(stu* list)//获得链表长度
- {
- stu* p = list;
- if (p->next == NULL)
- {
- return 0;
- }
- int j = 0;
- p = p->next;
- while (p != NULL)
- {
- p = p->next;
- j++;
- }
- return j;
- }
- void Find_first(int k, stu* list)//寻找出现值的第一个结点
- {
- stu* p = list;
- p = p->next;
- for (int i = 1; i <= Get_length(list); i++)
- {
- if (p->score == k)
- {
- cout << k << "第一次出现的位置为" << i << endl;
- return;
- }
- else
- p = p->next;
- }
- cout << "表中无此值" << endl;
- return;
- }
- void Find_Kth(int k, stu* list)//寻找第K个结点的值
- {
- stu* p = list;
- p = p->next;
- int i = 1;
- while (p->next != NULL && i < k)//p->next==NULL的时候说明此时p已经是最后一个结点
- {
- i++;
- p = p->next;
- }
- if (i == k)
- {
- cout << "第" << k << "个结点的值为" << p->score << endl;
- return;
- }
- else
- {
- cout << "没有第" << k << "个结点" << endl;
- return;
- }
-
- }
- void Delete_k(int k, stu* list)//删除所有元素为K的结点
- {
- stu* p = list;
- while (p->next)
- {
- if (p->next->score == k)
- {
- stu* q = new stu;
- q = p->next;
- p->next = p->next->next;
- delete q;
- }
- else
- p = p->next;
- }
- return;
- }
- void sort_list(stu* head)//排序
- {
- for (int i = 1; i <= Get_length(head); i++)
- {
- stu* p = head->next;
- for (int j = 1; j < Get_length(head); j++)
- {
- if (p->score > p->next->score)
- {
- int a = p->score;
- p->score = p->next->score;
- p->next->score = a;
- }
- p = p->next;
- }
- }
- }
- void Merge_list(stu* L, stu* M)//合并链表于L
- {
- stu* p = L;
- for (int i = 0; i < Get_length(L); i++)
- {
- p = p->next;
- }
- p->next = M->next;//表尾下接表头
- }
- void Remove_DupliCation(stu* head)//除去重复元素
- {
- stu* p = head->next;
- for (int i = 1; i <Get_length(head); i++)
- {
- if (p->score == p->next->score)
- {
- stu* q = p->next;
- p->next = p->next->next;
- delete q;
- }
- else
- p = p->next;
- }
- }
- int main()
- {
- stu* L;
- Initlist(L);
- stu* M;
- Initlist(M);
- Insert(1, 12, L);
- Insert(1, 7, L);
- Insert(1, 6, L);
- Insert(1, 5, L);
- cout << "L链表: ";
- Print_list(L);
- Insert(1, 11, M);
- Insert(1, 7, M);
- Insert(1, 6, M);
- Insert(1, 3, M);
- Insert(1, 1, M);
- cout << "M链表: ";
- Print_list(M);
- Merge_list(L, M);
- cout << "合并后的链表为:";
- Print_list(L);
- sort_list(L);
- cout << "排序后的链表为:";
- Print_list(L);
- Remove_DupliCation(L);
- cout << "去重后的链表为: ";
- Print_list(L);
- return 0;
- }
- //嗨害嗨
- #include<stdlib.h>
- #include<stdbool.h>
- #include<iostream>
- using namespace std;
- #define OK 1;
- #define ERROR 0;
- #define ElemType int;
- #define TRUE 1
- #define FALSE 0
- #define INFEASIBLE -1
- typedef int Status;
- struct student
- {
- int score;
- struct student* next;
- struct student* last;
- };
- typedef struct student stu;
- Status Initlist(stu* &L)//初始化 stu* &L表示对一个指针的引用
- {
- L = new stu;
- L->next = NULL;
- L->last = NULL;
- return OK;
- }
- Status Insert(int i, int k, stu* L)//在第i个位置插入k;Insert(Get_length(L)+1, 2, L)实现尾插;Insert(1, 2, L);实现头插
- {
- stu* o = L;
- for (int j = 1; j < i; j++)
- {
- o = o->next;
- }
- stu* p = new stu;
- p->score = k;
- p->next = o->next;
- p->last = o;
- o->next = p;
- if (p->next != NULL)
- {
- p ->next->last = p;
- }
-
- return OK;
- }
- Status Print_link(stu* head)//遍历打印链表
- {
- if (head->next == NULL)
- {
- cout << "空表" << endl;
- return ERROR;
- }
- head = head->next;
- while (head)
- {
- cout << head->score << endl;
- head = head->next;
- }
- cout << "遍历结束" << endl;
- return OK;
- }
- Status Delete_Kth(stu* list, int k)//删除第k个结点
- {
- for (int i = 1; i < k; i++)
- {
- list = list->next;
- }
- stu* p = new stu;
- p = list->next;
- list->next = list->next->next;
- list->next->last = list;
- delete p;
- return OK;
- }
- Status Get_length(stu* list)//获得链表长度
- {
- stu* p = list;
- if (p->next == NULL)
- {
- return ERROR;
- }
- int j = 0;
- p = p->next;
- while (p!=NULL)
- {
- p = p->next;
- j++;
- }
- return j;
- }
- Status Find_first(int k, stu* list)//寻找出现值的第一个结点
- {
- stu* p = list;
- p = p->next;
- for (int i = 1; i <= Get_length(list); i++)
- {
- if (p->score == k)
- {
- cout << k << "第一次出现的位置为" << i << endl;
- return OK;
- }
-
- else
- p = p->next;
- }
- return ERROR;
- }
- Status Find_Kth(int k, stu* list)//寻找第K个结点的值
- {
- stu* p = list;
- p = p->next;
- int i = 1;
- while (p->next!=NULL && i < k)//p->next==NULL的时候说明此时p已经是最后一个结点
- {
- i++;
- p = p->next;
- }
- if (i == k)
- {
- cout << "第" << k << "个结点的值为" << p->score << endl;
- return OK;
- }
- else
- {
- cout << "没有第" << k << "个结点" << endl;
- return ERROR;
- }
-
- }
- Status Delete_k(int k, stu* list)//删除所有元素为K的结点
- {
- stu* p = list;
- while (p->next)
- {
- if (p->next->score == k)
- {
- stu* q = new stu;
- q = p->next;
- p->next = p->next->next;
- p->next->last = p;
- delete q;
- }
- else
- p = p->next;
- }
- return OK;
- }
- Status Clear_link(stu* head)
- {
- if (head == NULL)
- {
- return ERROR;
- }
- stu* p = head;
- p = p->next;
- while (p != NULL)
- {
- stu* tmp = p;
- p = p->next;
- free(tmp);
- }
- head->next = NULL;
- cout << "链表已清空" << endl;
- return OK;
- }
- int main()
- {
- stu* L;
- Initlist(L);
- Insert(1, 3, L);
- Insert(1, 3, L);
- Insert(1, 3, L);
- Insert(2, 8, L);
- Insert(1, 3, L);
- Insert(1, 2, L);
- Insert(Get_length(L)+1, 2, L);
- Print_link(L);
- Delete_k(3, L);
- Print_link(L);
- return 0;
- }
- //嗨害嗨
- #include<stdlib.h>
- #include<stdbool.h>
- #include<iostream>
- using namespace std;
- struct student
- {
- int score;
- struct student* next;
- struct student* last;
- };
- typedef struct student stu;
- void Initlist(stu*& L)//初始化 stu* &L表示对一个指针的引用
- {
- L = new stu;
- L->next = L;
- L->last = L;
- }
-
- stu* Creat_Node(int x)//申请结点
- {
- stu* new_node = new stu;
- new_node->score = x;
- new_node->next = NULL;
- new_node->last = NULL;
- return new_node;
- }
-
- void Print(stu* head)//打印
- {
- if (head->next == head)
- {
- cout << "空表" << endl;
- return;
- }
- stu* current = head->next;
- while (current != head)
- {
- cout << current->score << endl;
- current = current->next;
- }
- }
-
- void Tail_Plug(stu* head, int x)//尾插
- {
- stu* new_node = Creat_Node(x);
- new_node->next = head;
- new_node->last = head->last;
- head->last->next = new_node;
- head->last = new_node;
- }
-
- void Delete_tail(stu* head)//尾删
- {
- stu* p = head->last;
- p->last->next = head;
- head->last = p->last;
- delete p;
- }
-
- void Head_Plug(stu* head, int x)//头插
- {
- stu* p = Creat_Node(x);
- p->next = head->next;
- head->next->last = p;
- p->last = head;
- head->next = p;
- }
-
- void Delete_head(stu* head)//头删
- {
- stu* p = head->next;
- head->next = p->next;
- p->next->last = head;
- delete p;
- }
-
- int Get_length(stu* head)//获得链表长度
- {
- stu* p = head;
- if (p->next == NULL)
- {
- return 0;
- }
- int j = 0;
- while (p->next != head)
- {
- p = p->next;
- j++;
- }
- return j;
- }
-
- void Insert(int i, int k, stu* L)//在第i个位置插入k;
- {
- if (i <= Get_length(L))
- {
- stu* o = L;
- for (int j = 1; j < i; j++)
- {
- o = o->next;
- }
- stu* p = Creat_Node(k);
- p->next = o->next;
- p->last = o;
- o->next = p;
- }
- else
- cout << "第" << i << "个位置不合法" << endl;
- }
-
- void Delete_Kth(stu* list, int k)//删除第k个结点
- {
- if (k > Get_length(list) || k < 1)
- {
- cout << "没有第" << k << "个结点" << endl;
- return;
- }
- for (int i = 1; i < k; i++)
- {
- list = list->next;
- }
- stu* p = list->next;
- list->next = list->next->next;
- list->next->last = list;
- delete p;
- }
-
- void Find_first(int k, stu* list)//寻找出现值的第一个结点
- {
- stu* p = list;
- p = p->next;
- for (int i = 1; i <= Get_length(list); i++)
- {
- if (p->score == k)
- {
- cout << k << "第一次出现的位置为" << i << endl;
- return;
- }
- else
- p = p->next;
- }
- cout << "表中没有值为" << k << "的结点" << endl;
- }
-
- void Find_Kth(int k, stu* head)//寻找第K个结点的值
- {
- int i = k;
- if (k <= Get_length(head))
- {
- stu* p = head;
- while (i--)
- {
- p = p->next;
- }
- cout << "第" << k << "个结点的值为" << p->score << endl;
- return;
- }
- else
- {
- cout << "没有第" << k << "个结点" << endl;
- return;
- }
- }
-
- void Delete_k(int k, stu* list)//删除所有元素为K的结点
- {
- stu* p = list;
- while (p->next != list)
- {
- if (p->next->score == k)
- {
- stu* q = new stu;
- q = p->next;
- p->next = p->next->next;
- p->next->last = p;
- delete q;
- }
- else
- p = p->next;
- }
- }
-
- void Clear_link(stu* head)//清空链表
- {
- int k = Get_length(head);
- for (int i = 1; i <= k; i++)
- {
- Delete_Kth(head, 1);
- }
- cout << "链表已清空" << endl;
- }
-
- int main()
- {
- stu* L;
- Initlist(L);
- Tail_Plug(L, 1);
- Tail_Plug(L, 2);
- Tail_Plug(L, 3);
- Tail_Plug(L, 4);
- Head_Plug(L, 8);
- Insert(2, 8, L);
- Insert(2, 8, L);
- Insert(2, 8, L);
- Insert(2, 8, L);
- Insert(108, 5, L);
- Print(L);
- Clear_link(L);
- Print(L);
- return 0;
- }
- //嗨害嗨
有何不足欢迎批评指正
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。