单向链表的创建、遍历、求长、判存、判空、插入、删除、查找(按位置或元素)、合并

来源:互联网 发布:sql select 字段赋值 编辑:程序博客网 时间:2024/06/05 18:15

linkedlist.h

#include "stdafx.h"#include "iostream"using namespace std;typedef  struct LNode {int data;struct LNode *next;}*LinkedList; //用LNode, LinkList代替typedef struct LNode;void Create_Linked_List(LinkedList &L, int n) {//输入n个元素的值,建立带表头结点的单链线性表LL = (LinkedList)malloc(sizeof(LNode)); //开辟了一个LNode类型长度的节点L->next = NULL; // 先建立一个带头结点的空表LinkedList p, q;q = L;for (int i = 0; i < n; i++)   //--i和i--如果左边没有等号,只是加减操作顺序的区别{p = (LinkedList)malloc(sizeof(LNode));cout << "请输入第" << i + 1 << "个值:";cin >> p->data;//p ->next = L ->next;   //逆序建表//L ->next = p;p->next = NULL;   //正序建立链表q->next = p;q = p;}}//打印链表void Print_Linked_List(LinkedList &L) {  //该链表建立了一个空节点LinkedList p;p = L->next;while (p){cout << p->data << "    ";p = p->next;}cout << endl;}//获取链表长度int get_Linked_Length(LinkedList &L) {LinkedList p;p = L;int i = 0;if (!p)  return 0;else {p = p->next;while (p){i++;p = p->next;}}return i;}//判存bool isExist(LinkedList &L) {if (L == NULL)return false;elsereturn true;}//判空bool isEmpty(LinkedList &L) {if (!isExist(L))exit(1);if (L->next == NULL)return true;elsereturn false;}//在链表的第i个位置之前插入元素bool Insert_Linked_Elem(LinkedList &L, int i, int num) {//if (isExist(L))//exit(1);LinkedList p, q;p = L;//首先判断输入的i是否大于最大长度,或者i小于1if (!p || i < 0 || i>get_Linked_Length(L))return false;int j = 0;while (p&&j != i - 1) {p = p->next;j++;}q = (LinkedList)malloc(sizeof(LNode));q->data = num;q->next = p->next;p->next = q;return true;}//删除链表的第i个元素bool Delete_Linked_Elem(LinkedList &L, int i) {if (isEmpty(L))return false;LinkedList p, q;p = L;//输入的i是否合法if (i < 0 || i>get_Linked_Length(L))return false;int j = 0;while (p->next && (j < i - 1)) {//将p指向待删除的前一个p = p->next;j++;}q = p->next;p->next = q->next;free(q);return true;}//在链表中查找是否有x并返回其位序,否则返回0int Search_Linked_List_Elem(LinkedList &L, int x) {int j = 1;LinkedList p;if (isEmpty(L)){return 0;}p = L->next;if (!p)  return 0;while (p && (x != p->data)){j++;p = p->next;}if (j <= get_Linked_Length(L))return j;elsereturn 0;}//查询链表第i个值并打印int get_Elem(LinkedList &L, int i) {if (i<1 || i>get_Linked_Length(L))return false;int j = 1;LinkedList p;p = L->next;while (j < i){p = p->next;j++;}return p->data;}//已知两个链表非递减排列,合并两个链表,并排列;由于Lc链表的链接,该操作改变了La和Lb的原有结构bool Merge_Linked_List(LinkedList &La, LinkedList &Lb, LinkedList &Lc) {//初始化L3LinkedList pa, pb, pc;pa = La->next;pb = Lb->next;Lc = pc = La;while (pa&&pb){if (pa->data < pb->data){pc->next = pa;pc = pa;pa = pa->next;}else{pc->next = pb;pc = pb;pb = pb->next;}}pc->next = pa ? pa : pb;free(Lb);    //释放Lb的头结点return true;}
LinkedList.cpp

#include "stdafx.h"#include "linkedlist.h"int main(){LinkedList listA, listB, listC;cout << "创建新链表" << endl;int length;cout << "请输入要创建的链表的长度:";cin >> length;Create_Linked_List(listA, length);cout << "您创建的链表为:";Print_Linked_List(listA);int i, elem;cout << "请输入要查询的值:";cin >> elem;cout << "所要查询的值在该链表的位置为:" << Search_Linked_List_Elem(listA, elem) << endl;cout << "请输入要查询元素的位置";cin >> i;cout << "第" << i << "个元素为:" << get_Elem(listA, i) << endl;cout << "请输入要插入的数:";cin >> elem;cout << "请输入要插入的位置:";cin >> i;Insert_Linked_Elem(listA, i, elem);cout << "该链表为:";Print_Linked_List(listA);cout << "请输入要删除元素的位置:";cin >> i;Delete_Linked_Elem(listA, i);cout << "删除该元素后链表的值为:";Print_Linked_List(listA);cout << "创建新链表" << endl;cout << "请输入要创建的链表的长度:";cin >> length;Create_Linked_List(listB, length);cout << "您创建的链表为:";Print_Linked_List(listB);cout << "合并您所创建的两个链表";Merge_Linked_List(listA, listB, listC);cout << "合并后的链表为:";Print_Linked_List(listC);system("pause");return 0;}




阅读全文
0 0