• C语言实现线性表之链表算法


    链表的各种算法,包括初始化,插入,删除,排序等操作,以下为代码:

      1 # include <stdio.h>
      2 # include <malloc.h>
      3 # include <stdlib.h>
      4 
      5 typedef struct LinkList{
      6     int data;
      7     struct LinkList * next;
      8 }NODE, * PNODE;
      9 
     10 //链表初始化 
     11 PNODE init();
     12 //插入元素
     13 bool insert(PNODE pHead,int pos,int val);
     14 //删除元素
     15 bool deleteLink(PNODE pHead,int pos);
     16 //判断是否为空
     17 bool isEmpty(PNODE pHead);
     18 //获取长度
     19 int getLength(PNODE pHead);
     20 //获取某个位置的元素
     21 int getValueByPos(PNODE pHead,int pos);
     22 //排序
     23 void sort(PNODE pHead);
     24 //输出
     25 void trverser(PNODE pHead);
     26 
     27 int main(int argc, char *argv[])
     28 {
     29     //初始化链表
     30     PNODE pHead=init();    
     31     trverser(pHead);
     32     //在第0个位置插入元素
     33     insert(pHead,0,10);
     34     //第一个位置插入
     35     insert(pHead,1,20);
     36     trverser(pHead);
     37     //最后位置插入
     38     insert(pHead,getLength(pHead),30);
     39     trverser(pHead);
     40     //最后位置附加一个元素 
     41     insert(pHead,getLength(pHead)+1,40);
     42     trverser(pHead);
     43     //中间位置插入一个元素 
     44     insert(pHead,2,50);
     45     trverser(pHead);
     46     //删除第0个位置的元素
     47     deleteLink(pHead,0);
     48     trverser(pHead);
     49     //删除第1个位置的元素
     50     deleteLink(pHead,1);
     51     trverser(pHead);
     52     //删除最后一个位置的元素
     53     deleteLink(pHead,getLength(pHead));
     54     trverser(pHead);
     55     //删除第3个位置的元素
     56     deleteLink(pHead,3);
     57     trverser(pHead);
     58     //获取第3个位置的元素
     59     int t=getValueByPos(pHead,3);
     60     printf("第3位置的元素为%d
    ",t);    
     61     sort(pHead);
     62     printf("元素排序:"); 
     63     trverser(pHead);
     64     return 0;
     65 }
     66 
     67 //链表初始化 
     68 PNODE init(){
     69     int length=0;
     70     printf("请输入初始化的长度:");
     71     scanf("%d",&length);
     72     //创建头结点 
     73     PNODE pHead=(PNODE)malloc(sizeof(NODE));
     74     if(NULL==pHead){
     75         printf("内存分配失败,程序退出!
    ");
     76         exit(-1) ;
     77     }
     78     //创建一个中间变量 
     79     PNODE p=pHead;
     80     p->next=NULL; 
     81     int t=0;
     82     for(int i=0;i<length;i++)
     83     {
     84         PNODE pNew=(PNODE)malloc(sizeof(NODE));
     85         if(NULL==pNew){
     86             printf("内存分配失败,程序退出!
    ");
     87             exit(-1) ;
     88         }
     89         printf("请输入第%d个节点的值:",i+1);
     90         scanf("%d",&t);
     91         pNew->data=t;
     92         p->next=pNew;
     93         p=pNew;
     94         p->next=NULL;
     95     }
     96     return pHead;
     97 }
     98 
     99 //插入元素
    100 bool insert(PNODE pHead,int pos,int val){
    101     //判断位置是否合法
    102     int length=getLength(pHead);
    103     if(pos<1||pos>length+1){
    104         printf("该链表只有%d个元素,您插入元素的位置不合法!
    ",length);
    105         return false;
    106     }    
    107     //删除指定位置的元素
    108     PNODE p=pHead;
    109     int i=0;
    110     for(;i<pos-1;i++)
    111     {
    112         p=p->next;    
    113     }
    114     PNODE pNew=(PNODE)malloc(sizeof(NODE));
    115     if(NULL==pNew)    
    116     {
    117         printf("内存分配失败,程序退出!
    ");
    118         exit(-1);
    119     }
    120 
    121     pNew->data=val;
    122     pNew->next=p->next;
    123     p->next=pNew;
    124     return true;
    125 }
    126 //删除元素
    127 bool deleteLink    (PNODE pHead,int pos){
    128     //判断是否为空
    129     if(isEmpty(pHead))
    130     {
    131         printf("链表为空,无法删除指定位置的元素!
    ");
    132         return false;
    133     }
    134     //判断位置是否合法
    135     int length=getLength(pHead);
    136     if(pos<1||pos>length){
    137         printf("该链表只有%d个元素,您删除元素的位置不合法!
    ");
    138         return false;
    139     }    
    140     //删除指定位置的元素
    141     PNODE p=pHead;
    142     int i=0,result=0;
    143     for(;i<pos-1;i++)
    144     {
    145         p=p->next;
    146     }
    147     PNODE pDel=p->next;
    148     p->next=p->next->next;
    149     free(pDel);    
    150     return result;
    151 
    152 }
    153 //判断是否为空
    154 bool isEmpty(PNODE pHead){
    155     if(NULL==pHead->next){
    156         return true;
    157     }
    158     return false;
    159 }
    160 //获取长度
    161 int getLength(PNODE pHead){
    162     int length=0;
    163     PNODE p=pHead->next;
    164     while(NULL!=p)
    165     {
    166         length++;
    167         p=p->next;
    168     }
    169     return length;
    170 }
    171 //获取某个位置的元素
    172 int getValueByPos(PNODE pHead,int pos){
    173     int length=getLength(pHead);
    174     if(pos<1||pos>length){
    175         printf("该链表只有%d个元素,您取元素的位置不合法,程序将输出0!
    ");
    176         return 0;
    177     }
    178     PNODE p=pHead->next;
    179     int i=1,result=0;
    180     while(NULL!=p)
    181     {
    182         if(i==pos){
    183             result=p->data;    
    184             break;
    185         }
    186         p=p->next;
    187         i++;
    188     }
    189     return result;
    190 }
    191 //排序
    192 void sort(PNODE pHead){
    193     int t=0,i=0,j=0;
    194     int length=getLength(pHead);
    195     PNODE p=pHead->next;
    196     PNODE pNext=p->next;
    197     for(i=0;i<length,NULL!=p;i++,p=p->next)
    198     {
    199         for(j=i+1,pNext=p->next;j<=length,NULL!=pNext;pNext=pNext->next,j++){
    200             if(p->data>pNext->data){
    201                 t=pNext->data;
    202                 pNext->data=p->data;
    203                 p->data=t;
    204             }    
    205         }
    206     }
    207         
    208 }
    209 //输出
    210 void trverser(PNODE pHead){
    211     PNODE p=pHead->next;
    212     while(NULL!=p)
    213     {
    214         printf("%d ",p->data);
    215         p=p->next;
    216     }
    217     printf("
    ");
    218 }

    以下为运行结果:

    在本程序中需要重点注意遍历,插入及删除三个算法

  • 相关阅读:
    (4)使用 JDK8 日期時間 API
    (3)使用 Joda-Time
    (2)時間的 ABC
    (1)Date 與 Calendar 怎麼了?
    Android 开发绕不过的坑:你的 Bitmap 究竟占多大内存?
    AsyncTask 源码阅读笔记
    LinkedHashMap 阅读笔记
    HashMap 阅读笔记
    DiskLruCache 阅读笔记
    Android面试复习
  • 原文地址:https://www.cnblogs.com/hymhblf/p/3199785.html
Copyright © 2020-2023  润新知