• 单链表的各种操作


      1 #include "stdafx.h"
      2 #include <iostream>
      3 #include <exception>
      4 using namespace std;
      5 
      6 //一系列状态
      7 #define OK 1
      8 #define ERROR 0
      9 #define TRUE 1
     10 #define FALSE 0
     11 typedef int Status;
     12 
     13 //线性表的顺序存储
     14 #define MAXSIZE 20
     15 typedef int ElemType;
     16 typedef struct
     17 {
     18     ElemType data[MAXSIZE];
     19     int length;
     20 }SqList;
     21 
     22 //线性表的链式存储
     23 typedef struct Node
     24 {
     25     ElemType data;
     26     struct Node *next;
     27 }Node,*LinkList;
     28 
     29 //获取线性表元素,所以不会修改L.所以L就是一个普通参数
     30 Status GetElem(LinkList L,int i,ElemType *e)
     31 {
     32     int j;//用来向下走的
     33     LinkList p ;//命名中p一般是指指针,指向一个Node
     34     p=L->next;//L是头指针.头结点的next就是第一个结点
     35     j=1;
     36     while(p&&j<i)//p不为空或者计数器j还没有等于i时,循环继续.
     37     {
     38         p=p->next;
     39         j++;
     40     }
     41     if(!p||j>i)//对应的上面while的两个条件,个人认为这里如果i=0的时候j才会大于i
     42         return ERROR;//第i个元素不存在
     43     *e=p->data;//取出第i个元素的数据
     44     return OK;
     45 }
     46 //单链表的插入
     47 Status ListInsert(LinkList *L,int i,ElemType *e)
     48 {
     49     int j;
     50     LinkList p,s;
     51     p = *L;
     52     j = 1;//使用之前赋值
     53     while(p&&j<i)
     54     {
     55         p=p->next;
     56         ++j;
     57     }
     58     if(!p||j>i)
     59         return ERROR;
     60     s = (LinkList) malloc(sizeof(Node));//生成新的结点  分配Node大小的内存空间,并且返回了指向这块内存的指针.
     61     s->data=*e;
     62     s->next=p->next;
     63     p->next=s;
     64     return OK;
     65 
     66 }
     67 //单链表的删除
     68 Status ListDelete(LinkList *L,int i,ElemType *e)
     69 {
     70     int j;
     71     LinkList p=*L,q;
     72     j=1;
     73     while(p->next&&j<i)
     74     {
     75         p=p->next;
     76         ++j;
     77     }
     78     if(!(p->next)||j>i)
     79         return ERROR;
     80     q=p->next;
     81     p->next = q->next;
     82     *e=q->data;
     83     free(q);//让系统回收结点,释放内存.
     84     q=p;
     85     return OK;
     86 }
     87 //单链表的创建--头插法
     88 void CreateListHead(LinkList *L,int n)
     89 {
     90     LinkList p;
     91     int i ;
     92     *L =(LinkList)malloc(sizeof(Node));
     93     (*L)->next = NULL;
     94     for(i = 0;i<n;++i)
     95     {
     96         p=(LinkList)malloc(sizeof(Node));
     97         p->data=i+1;
     98         p->next = (*L)->next;
     99         (*L)->next = p;
    100     }
    101 }
    102 
    103 //单链表的创建--尾插法
    104 void CreateListTail(LinkList *L,int n)
    105 {
    106     LinkList p,r;//r是指向尾结点的变量
    107     int i ;
    108     *L = (LinkList)malloc(sizeof(Node));
    109     r = *L;
    110     (*L)->next = NULL;
    111     for(i = 0;i<n;++i)
    112     {
    113         p=(LinkList)malloc(sizeof(Node));
    114         p->data=i+1;
    115         r->next=p;
    116         r=p;
    117     }
    118     r->next = NULL;
    119 }
    120 //单链表的整表删除
    121 Status ClearList(LinkList *L)
    122 {
    123     LinkList p,q;
    124     p=(*L)->next;
    125     while(p)
    126     {
    127         q=p->next;
    128         free(p);
    129         p=q;
    130     }
    131     (*L)->next = NULL;
    132     return OK;
    133 }
    134 //单链表的整表读取
    135 Status ReadList(LinkList L)
    136 {
    137     LinkList p=L->next;
    138     while(p)
    139     {
    140         cout<<(p->data)<<" ";
    141         p=p->next;
    142     }
    143     cout<<endl;
    144     return OK;
    145 }
    146 //获取单链表的最后一个元素
    147 Status GetEndElem(LinkList L,ElemType *e)
    148 {
    149     LinkList p;
    150     p=L->next;
    151     while((p->next))
    152     {
    153         p=p->next;
    154     }
    155     *e = p->data;
    156     return OK;
    157 }
    158 //获取链表的长度
    159 Status GetListLength(LinkList L,ElemType *e)
    160 {
    161     int j = 0;
    162     LinkList p = L;
    163     while(p->next)
    164     {
    165         j++;
    166         p=p->next;
    167     }
    168     *e = j;
    169     return OK;
    170 }
    171 int _tmain(int argc, _TCHAR* argv[])
    172 {
    173     LinkList *L=(LinkList*)malloc(sizeof(Node));
    174     int listLength = 0;//链表长度
    175     CreateListTail(L,5);//尾插法创建一个链表
    176     ReadList(*L);//输出1 2 3 4 5
    177     int endData = 0;
    178     GetEndElem(*L,&endData);
    179     cout<<"最后一个元素:"<<endData<<endl;
    180     int localData=0;
    181     GetElem(*L,2,&localData);//获取第二个元素
    182     cout<<localData<<endl;//输出2
    183     int insertElem=9;
    184     ListInsert(L,2,&insertElem);//在第二个位置插入9
    185     ReadList(*L);//输出1 9 2 3 4 5
    186     GetListLength(*L,&listLength);//获取链表长度
    187     cout<<"链表长度:"<<listLength<<endl;//输出 6
    188     ListDelete(L,3,&insertElem);//把第三个位置的数2删除,返回给insertElem
    189     ReadList(*L);//输出1 9 3 4 5
    190     GetListLength(*L,&listLength);//获取链表长度
    191     cout<<"链表长度:"<<listLength<<endl;
    192     cout<<insertElem<<endl;//输出2
    193     ClearList(L);//整表删除
    194     ReadList(*L);//空表没输出了
    195     return 0 ;
    196 }
  • 相关阅读:
    关于webapi post 使用多个参数的间接用法
    Web Api 中Get 和 Post 请求的多种情况分析
    Juery On事件的 事件触发流程
    构建ASP.NET网站十大必备工具(1)
    了解 XSS 攻击原理
    c#访问Oracle问题及解决方法
    C#连接数据库的四种方法
    OracleClient卸载
    oracle的默认表空间
    oracle Service Name和SID的区别
  • 原文地址:https://www.cnblogs.com/crazycodehzp/p/3540468.html
Copyright © 2020-2023  润新知