zoukankan      html  css  js  c++  java
  • 原始线性结构单链表的实现以及操作

    这里不再赘述,直接上代码。

      1 #include <stdio.h>
      2 #include <malloc.h>
      3 #include <stdlib.h>
      4 
      5 //引入头文件
      6 
      7 typedef struct Node {
      8     int data;        //数据域
      9     struct Node * pNext; //指针域
     10 } NODE,*PNODE;
     11 
     12 //声明一个结点类型
     13 PNODE create_list(void);
     14 void traverse_list(PNODE pHead);
     15 bool is_empty(PNODE pHead);
     16 int length_list(PNODE pHead);
     17 void sort_list(PNODE pHead);
     18 bool insert_list(PNODE pHead,int pos,int val);
     19 bool delete_list(PNODE pHead,int pos,int *val);
     20 
     21 
     22 
     23 
     24 //声明函数
     25 
     26 int main(void) {
     27 
     28     PNODE pHead = NULL;
     29     pHead = create_list();
     30     traverse_list(pHead);
     31     int len;
     32     len = length_list(pHead);
     33     printf("链表中共有%d个参数!
    ",len);
     34     sort_list(pHead);
     35     traverse_list(pHead);
     36     insert_list(pHead,2,555);
     37     traverse_list(pHead);
     38     int val;
     39     delete_list(pHead,2,&val);
     40     traverse_list(pHead);
     41 
     42     return 0;
     43 }
     44 //插入数据,创建一个链表
     45 PNODE create_list(void) {
     46     int len;  //用来存放有效节点的个数
     47     int i;
     48     int val; //用来临时存放用户输入的结点的值
     49     PNODE pNew;
     50     //分配了一个不存放有效数据的头结点
     51     PNODE pHead = (PNODE)malloc(sizeof(NODE));
     52     pHead->pNext = NULL;        //创建的时候定义一个头结点
     53     if (NULL == pHead) {
     54         printf("分配失败, 程序终止!
    ");
     55         exit(-1);
     56     }
     57     PNODE pTail = pHead;    //如果需要实现 尾插法的话  就需要这个指向尾结点的指针了
     58     pTail->pNext = NULL;
     59     printf("请输入您需要生成的链表节点的个数: len = ");
     60     scanf("%d", &len);
     61     for (i=0; i<len; ++i) {
     62         printf("请输入第%d个节点的值: ", i+1);
     63         scanf("%d", &val);
     64         pNew = (PNODE)malloc(sizeof(NODE));
     65         pNew->pNext = NULL;
     66         if (NULL == pNew) {
     67             printf("分配失败, 程序终止!
    ");
     68             exit(-1);
     69         }
     70         pNew->data = val;
     71         //这样能实现尾插法
     72 //        pNew->pNext = pHead->pNext;
     73 //        pHead->pNext = pNew;
     74         //头插法呢?
     75         pTail->pNext = pNew;
     76         pNew->pNext = NULL;
     77         pTail = pNew;     //这样就可以实现头插法了
     78     }
     79 
     80     return pHead;
     81 }
     82 //打印出链表的所有元素   遍历
     83 void traverse_list(PNODE pHead) {
     84     PNODE p = pHead->pNext;  //头指针
     85 
     86     while (NULL != p) {
     87         printf("%d  ", p->data);
     88         p = p->pNext;
     89     }
     90     printf("
    ");
     91 
     92     return;
     93 }
     94 
     95 bool is_empty(PNODE pHead) {
     96     if(NULL == pHead->pNext) {   // 判断一个链表是不是空的 主要就是使用 头指针就行判断  一个头指针为空链表为空
     97         printf("链表为空!");
     98         return true;
     99     } else {
    100         return false;
    101     }
    102 }
    103 //打印出链表的长度
    104 int length_list(PNODE pHead) {
    105     PNODE p = pHead->pNext;
    106     int len = 0;
    107     while(NULL != p) {
    108         p=p->pNext;
    109         len++;
    110     }
    111     return len;
    112 }
    113 
    114 void sort_list(PNODE pHead) {
    115     int i,j,t;
    116     int len = length_list(pHead);
    117     PNODE p,q;
    118 
    119     //i和j控制循环次数  p和q控制指针的移动
    120     for(i=0,p=pHead->pNext; i<len-1; i++, p=p->pNext) {
    121         for(j=i+1,q=p->pNext; j<len; j++,q=q->pNext) {
    122             if(p->data>q->data) {
    123                 t = p->data;
    124                 p->data = q->data;
    125                 q->data = t;
    126             }
    127         }
    128     }
    129     return;
    130 }
    131 bool insert_list(PNODE pHead,int pos,int val) {
    132 
    133     int i= 0;
    134     PNODE p = pHead;
    135     //前面一个就是说明他不是一个空的链表
    136     //后面一个就是说明
    137     while(NULL != p && i<pos-1) {
    138         p=p->pNext;
    139         i++;
    140     }
    141     if(p==NULL || i>pos-1) {
    142         return false;
    143     }
    144     PNODE pNew = (PNODE)malloc(sizeof(NODE));
    145     if(NULL == pNew) {
    146         printf("动态分配内存失败!
    ");
    147         exit(-1);
    148     }
    149     pNew->data = val;
    150     //插入的过程
    151     pNew->pNext = p->pNext;
    152     p->pNext = pNew;
    153     return true;
    154 }
    155 
    156 //指定位置删除结点
    157 bool delete_list(PNODE pHead,int pos,int *val) {
    158     int i= 0;
    159     PNODE p = pHead;
    160     while(NULL != p->pNext && i<pos-1) {
    161         p=p->pNext;
    162         i++;
    163     }
    164     if(p->pNext==NULL || i>pos-1) {
    165         return false;
    166     }
    167     PNODE q = p->pNext;
    168     *val = q->data;
    169     //先把删除的那个结点记录下来
    170     p->pNext = p->pNext->pNext;
    171     free(q);
    172     //将指针往后移一位删除掉删除的那个元素
    173     //然后再进行释放
    174     q= NULL;
    175     return true;
    176 }

    这应该是一个最原始的代码,如果楼主总结的有错误的话,请@楼主告知。谢谢!

  • 相关阅读:
    2017年3月9日上午学习
    3.17上午
    3.16上午
    3.16下午
    3.15
    2017.3.14
    3.14
    217.3.13上午
    2017.4.7-morning
    2017.4.6-afternoon
  • 原文地址:https://www.cnblogs.com/strator/p/7232537.html
Copyright © 2011-2022 走看看