zoukankan      html  css  js  c++  java
  • 单链表基本操作

      1 //单链表基本操作
      2 #include <iostream>
      3 using namespace std;
      4 
      5 //#define ElemType int
      6 typedef int ElemType;
      7 
      8 typedef struct LNode {
      9     ElemType data;
     10     struct LNode *next;   // (递归定义)  指向后继节点
     11 }LinkList;
     12 
     13 //头插法建表
     14 void CreateListF(LinkList *&List, ElemType a[], int n) {
     15     LinkList *s;
     16     List = (LinkList *)malloc(sizeof(LinkList));
     17     List->next = NULL;
     18     for (int i = 0; i < n; i++) {
     19         s = (LinkList*)malloc(sizeof(LinkList));
     20         s->data = a[i];
     21         s->next = List->next;
     22         List->next = s;
     23     }
     24 }
     25 
     26 
     27 //尾插法建表
     28 void CreateListR(LinkList *&List, ElemType a[], int n) {
     29     LinkList *s, *r;
     30     List = (LinkList *)malloc(sizeof(LinkList));
     31     r = List;
     32     List->next = NULL;
     33     for (int i = 0; i < n; i++) {
     34         s = (LinkList *)malloc(sizeof(LinkList));
     35         s->data = a[i];
     36         r->next = s;
     37         r = s;
     38     }
     39     r->next = NULL;
     40 }
     41 
     42 //初始化单链表
     43 void InitList(LinkList *&list) {
     44     list = (LinkList *)malloc(sizeof(LinkList));
     45     list->next = NULL;
     46 }
     47 
     48 //销毁单链表
     49 void DestroyList(LinkList *&list) {
     50     LinkList *p = list, *q = list->next;
     51     while (q != NULL) {
     52         free(p);
     53         p = q;
     54         q = q->next;
     55     }
     56     free(p);
     57 }
     58 
     59 //判断单链表是否为空
     60 bool ListEmpty(LinkList *list) {
     61     return (list->next == NULL);
     62 }
     63 
     64 //求单链表的长度
     65 int ListLength(LinkList *list) {
     66     int n = 0;
     67     LinkList * p = list;
     68     while (p->next) {
     69         n++;
     70         p = p->next;
     71     }
     72     return n;
     73 }
     74 
     75 //输出单链表
     76 void DispList(LinkList *list) {
     77     LinkList *p = list->next;
     78     while (p != NULL) {
     79         cout << p->data << "  ";
     80         p = p->next;
     81     }
     82     cout << endl;
     83 }
     84 
     85 //求单链表中某值元素的位置
     86 int LocateElem(LinkList *list, ElemType e) {
     87     int i = 1;
     88     LinkList *p = list ->next;
     89     while (p != NULL && p->data != e) {
     90         i++;
     91         p = p->next;
     92     }
     93     if (p == NULL)
     94         return (0);
     95     else 
     96         return (i);
     97 }
     98 
     99 
    100 
    101 //求单链表中某个位置元素的值
    102 bool GetElem(LinkList*list, int i, ElemType &e) {
    103     LinkList * p = list;
    104     int j = 0;
    105     while (j < i && p->next != NULL) {
    106         j++;
    107         p = p->next;
    108     }
    109     if (p == NULL)
    110         return false;
    111     else {
    112         e = p->data;
    113         return true;
    114     }
    115 }
    116 
    117 
    118 //插入数据元素
    119 bool ListInsert(LinkList *&list, int i, ElemType e) {
    120     int j = 0;
    121     LinkList *p = list, *s;
    122     while (j < i - 1 && p != NULL) {
    123         j++;
    124         p = p->next;
    125     }
    126     if (p == NULL) 
    127         return false;
    128     else {
    129         s = (LinkList *)malloc(sizeof(LinkList));
    130         s->data = e;
    131         s->next = p->next;
    132         p->next = s;
    133         return true;
    134     }
    135     
    136     
    137 }
    138 
    139 //删除数据元素
    140 bool ListDelete(LinkList *&list, int i, ElemType &e) {
    141     int j = 0;
    142     LinkList *p = list, *q;
    143     while (j < i - 1 && p != NULL) {
    144         j++;
    145         p = p->next;
    146     }
    147     if (p == NULL)
    148         return false;
    149     else {
    150         q = p->next;
    151         if (q == NULL)
    152             return false;
    153         e = q->data;
    154         p->next = q->next;
    155         free(q);
    156         return true;
    157     }
    158 }
    159 
    160 
    161 int main() {
    162     const int n = 7;
    163     int a[n];
    164     cout << "Input " << n << " numbers:";
    165     for (int i = 0; i < n; i++) {
    166         cin >> a[i];
    167     }
    168     LinkList *lista, *listb;
    169     InitList(lista);
    170     InitList(listb);
    171     CreateListF(lista, a, n);
    172     cout << "Input " << n << " numbers:";
    173     for (int i = 0; i < n; i++) {
    174         cin >> a[i];
    175     }
    176     CreateListR(listb, a, n);
    177     cout << "头插法(lista):";
    178     DispList(lista);
    179     cout << "尾插法(listb):";
    180     DispList(listb);
    181     DestroyList(listb);
    182     cout << endl << endl;
    183     
    184     int len = ListLength(lista);
    185     cout << "Lista的长度" << len << endl;
    186     cout << endl << endl;
    187     
    188     
    189     int m;
    190     cout << "输入要查询的元素的值(lista):" ;
    191     cin >> m;
    192     int loca = LocateElem(lista, m);
    193     cout << m << "第一次出现在" << loca << "位置" << endl;
    194     cout << endl << endl;
    195     
    196     
    197     cout << "输入要查询的元素的位置(lista):";
    198     cin >> loca;
    199     GetElem(lista, loca, m);
    200     cout << "" << loca << "个元素的值为" << m<< endl;
    201     cout<< endl << endl;
    202     
    203     
    204     cout << "输入要插入的位置和数值(lista):";
    205     cin >> loca >> m;
    206     if (ListInsert(lista, loca, m))
    207         DispList(lista);
    208     else
    209         cout << "插入失败!" << endl;
    210     cout << endl << endl;
    211     
    212     cout << "输入要删除的位置(lista):";
    213     cin >> loca;
    214     if (ListDelete(lista, loca, m))    {
    215         cout << "删除的元素值为" << m << endl << "更新后的链表为:";
    216         DispList(lista);
    217         cout << endl << endl;
    218     }
    219     else cout << "删除失败!" << endl;
    220     DestroyList(lista);
    221 }

  • 相关阅读:
    Android框架之Volley与Glide
    美团点餐—listview内部按钮点击事件
    Android之MaterialDesign应用技术2-仿支付宝上滑搜索框缓慢消失
    Android之MaterialDesign应用技术
    Android之Bmob移动后端云服务器
    Java设计模式总汇二---MVC、中介者设计模式
    Java设计模式总汇一 (适配器、单例、静态代理、简单工厂设计模式)
    Android数据绑定技术二,企业级开发
    再次强调完成的定义(DoD)
    在远程 CSM 课程中体验线上工作坊
  • 原文地址:https://www.cnblogs.com/Arvin-JIN/p/8974875.html
Copyright © 2011-2022 走看看