zoukankan      html  css  js  c++  java
  • 2015.12.16 doubleLinkedList-Function

      1 #include <stdio.h>
      2 #include <stdbool.h>
      3 #include <stdlib.h>
      4 
      5 typedef struct node{
      6     struct node *previous;
      7     int age;
      8     struct node *next;
      9 }Node;
     10 
     11 //创建一个结点
     12 Node *createNode();
     13 //初始化链表
     14 void intial(Node *const pHead);
     15 //是否继续
     16 bool isContinue();
     17 //查找index对应的结点位置
     18 Node *checkIndex(Node *pHead, int index);
     19 //输出链表
     20 void show(const Node *const pHead);
     21 //插入结点
     22 void insert(Node *pHead, int index, int element);
     23 //删除结点
     24 void delete(Node *pHead, int index);
     25 
     26 int main(int argc, const char * argv[]) {
     27     //定义一个指针 指向头结点(头结点不存储数据)
     28     Node *pHead = NULL;
     29     
     30     pHead = createNode();
     31     if (pHead == NULL) {
     32         exit(EXIT_FAILURE);
     33     }
     34     
     35     intial(pHead);
     36     
     37     show(pHead);
     38     
     39     insert(pHead, 3, 99);
     40     
     41     show(pHead);
     42     
     43     delete(pHead, 3);
     44     
     45     show(pHead);
     46     
     47     return 0;
     48 }
     49 
     50 
     51 
     52 Node *createNode(){
     53     //创建一个新的结点
     54     Node *pTemp = (Node *)malloc(sizeof(Node));
     55     if (pTemp == NULL) {
     56         return NULL;
     57     }
     58     
     59     //赋初值
     60     pTemp->previous = NULL;
     61     pTemp->next = NULL;
     62     
     63     //返回
     64     return pTemp;
     65 }
     66 
     67 void intial(Node *const pHead){
     68     Node *pTail = pHead;
     69     
     70     //添加保存数据的结点
     71     while (1) {
     72         Node *pTemp = createNode();
     73         if (pTemp == NULL) {
     74             exit(EXIT_FAILURE);
     75         }
     76         //输入数据
     77         printf("Please input age:");
     78         scanf("%d", &pTemp->age);
     79         
     80         //判断需要添加的位置
     81         if (pHead->next == NULL) {
     82             //头指针指向第一个结点
     83             pHead->next = pTemp;
     84             
     85             //第一个结点的previous指针指向头结点
     86             pTemp->previous = pHead;
     87             
     88             //第一个结点的next指针指向头指针
     89             pTemp->next = pHead;
     90             
     91             //头指针的previous指向第一个结点
     92             pHead->previous = pTemp;
     93             
     94             //尾指针指向第一个结点
     95             pTail = pTemp;
     96         } else{
     97             //前面的结点已经存在了
     98             //让尾结点的next指向新建的结点
     99             pTail->next = pTemp;
    100             
    101             //新建结点的previous指针指向尾结点
    102             pTemp->previous = pTail;
    103             
    104             //pTail指向新建的结点
    105             pTail = pTemp;
    106             
    107             //尾结点的next指针指向头结点
    108             pTail->next = pHead;
    109             
    110             //头结点的previous指针指向尾结点
    111             pHead->previous = pTail;
    112         }
    113         //询问是否继续
    114         if (isContinue() == false) {
    115             break;
    116         }
    117     }
    118     
    119     
    120 }
    121 
    122 bool isContinue(){
    123     char option;
    124     do {
    125         getchar();
    126         printf("Is continued(y/n):");
    127         option = getchar();
    128     } while (option != 'y' && option != 'n');
    129     
    130     if (option == 'y') {
    131         return true;
    132     } else{
    133         return false;
    134     }
    135 }
    136 
    137 void show(const Node *const pHead){
    138     Node *pTemp = pHead->next;
    139     
    140     while (pTemp != NULL) {
    141         printf("%d ", pTemp->age);
    142         pTemp = pTemp->next;
    143         
    144         if (pTemp == pHead) {
    145             break;
    146         }
    147     }
    148     printf("
    ");
    149 }
    150 
    151 Node *checkIndex(Node *pHead, int index){
    152     Node *pTemp = pHead->next;
    153     
    154     while (index > 0) {
    155         if (pTemp == pHead) {
    156             //结点数少于index
    157             break;
    158         } else{
    159             pTemp = pTemp->next;
    160         }
    161         index --;
    162     }
    163     if (index > 0) {
    164         return NULL;
    165     } else{
    166         //让pTemp指向上一个结点(因为while循环中『指过了』)
    167         pTemp = pTemp->previous;
    168         return pTemp;
    169     }
    170 }
    171 
    172 void insert(Node *pHead, int index, int element){
    173     //首先应该获取到index对应的结点地址
    174     Node *pIndex = checkIndex(pHead, index);
    175     
    176     if (pIndex == NULL) {
    177         printf("相应的元素不存在
    ");
    178         exit(EXIT_FAILURE);
    179     } else{
    180         //在index前插入一个指针,并且为这个指针分配内存
    181         Node *pNew = createNode();
    182         
    183         if (pNew == NULL) {
    184             exit(EXIT_FAILURE);
    185         } else{
    186             pNew->age = element;
    187             
    188             //pNew的next指针指向pIndex
    189             pNew->next = pIndex;
    190             
    191             //pNew的previous指针指向pIndex前面的那个结点的地址
    192             pNew->previous = pIndex->previous;
    193             
    194             //pIndex前面的那个结点的next指针指向pNew
    195             pIndex->previous->next = pNew;
    196             
    197             //pIndex的previous指针指向pNew
    198             pIndex->previous = pNew;
    199         }
    200     }
    201 }
    202 
    203 void delete(Node *pHead, int index){
    204     //获取到index对应的结点
    205     Node *pIndex = checkIndex(pHead, index);
    206     
    207     if (pIndex == NULL) {
    208         exit(EXIT_FAILURE);
    209     } else{
    210         //pIndex前面结点的next指针指向pIndex后面的结点
    211         pIndex->previous->next = pIndex->next;
    212         
    213         //pIndex后面结点的previous指针指向pIndex前面的结点
    214         pIndex->next->previous = pIndex->previous;
    215         
    216         //释放pIndex结点
    217         free(pIndex);
    218     }
    219 }
  • 相关阅读:
    大三上寒假15天--第6天
    大三上寒假15天--第5天
    大三上寒假15天--第4天
    大三上寒假15天--第3天
    selenium(python)登录时账号密码错误提示语
    selenium(python)用HTMLTestRunner导出报告(断言)信息的显示
    Jmeter打开url时提示“请在微信客户端打开链接问题”
    python(unittest)报告导出(二):使用 BeautifulReport导出
    python(unittest)报告导出(一):使用HTMLTestRunner导出
    selenium+python+unittest:一个类中只执行一次setUpClass和tearDownClass里面的内容(可解决重复打开浏览器和关闭浏览器,或重复登录等问题)
  • 原文地址:https://www.cnblogs.com/immustard/p/5052016.html
Copyright © 2011-2022 走看看