zoukankan      html  css  js  c++  java
  • 双向循环链表

    这是我做的一个简单的双向循环链表。

    在双向循环链表当中最重要的是对四个指针的控制,其它地方与之前学的无异。

      1 #include<stdio.h>
      2 #include<stdlib.h>
      3 typedef int DataType;
      4 //链表结点 
      5 typedef struct node{
      6     DataType data;
      7     struct node *front;
      8     struct node *next; 
      9 }LinkList;
     10 //初始化双向链表
     11 int IntList(LinkList *L){
     12     L=(LinkList*)malloc(sizeof(LinkList));
     13     L->front=L->next=L;
     14     L->data=0;
     15 } 
     16 //输入双向链表的值(尾插法)
     17 int InputList(LinkList *L){
     18     LinkList *NewNode,*p;
     19     p=L;
     20     int length,data;
     21     printf("请输入想要创建链表的长度:");  
     22     scanf("%d",&length);  
     23     for(int i=0; i<length; i++) {
     24      NewNode=(LinkList*)malloc(sizeof(LinkList));
     25              if(NewNode==NULL){
     26                  printf("内存分配失败!
    "); 
     27                  return 0;
     28                }
     29         printf("请输入第%d个节点元素值:",i+1);  
     30           scanf("%d",&data);
     31           NewNode->data=data;     
     32     /*1*/     NewNode->next=L;
     33     /*2*/      NewNode->front=p;
     34     /*3*/      p->next=NewNode;
     35     /*4*/      L->front=NewNode; 
     36     //1和4是固定的,2和3是动态的。 
     37               p=NewNode; 
     38     }
     39 }
     40 //打印链表     
     41 int TraverseDbCcLinkList(LinkList *L)  
     42 {  
     43     LinkList *p = L->next;  
     44   
     45     printf("链表打印如:
    ");  
     46     while (p!=L)  
     47     {  
     48         printf("%d ", p->data);  
     49         p = p->next;  
     50     }  
     51    printf("
    "); 
     52    printf("打印成功
    "); 
     53 }
     54 //计算链表长度
     55 int GetLength(LinkList *L){
     56     int length=0;
     57     LinkList *p=L->next;
     58     while(p!=L){
     59         length++;
     60         p=p->next;
     61     }
     62     return printf("链表长度为%d
    ",length);
     63 } 
     64 //向链表内插入节点
     65 int InsertLinkList(LinkList *L){
     66     LinkList *p=L->next;
     67     int n,m,i=1;
     68     printf("请输入想要插在第几个位置后面:
    ");
     69     scanf("%d",&n);
     70     while(p!=L&&i<n){
     71         i++;
     72         p=p->next;
     73     }
     74     if(p==L){
     75     return    printf("要插入的位置不存在!
    ");
     76          
     77     }else{
     78         LinkList *S=(LinkList*)malloc(sizeof(LinkList));
     79         printf("请输入要插入的值
    ");
     80         scanf("%d",&m);
     81         S->data=m;
     82         S->next=p->next;
     83         S->front=p;
     84         p->next->front=S;
     85         p->next=S;
     86     }
     87     return printf("插入成功!
    ");
     88 } 
     89 //删除某个位置的数
     90 int DelLinklist(LinkList *L){
     91     LinkList *p=L->next,*q;
     92     int n,i=1;
     93     printf("请输入要删除的位置
    ");
     94     scanf("%d",&n);
     95     while(p!=L&&i<n-1){
     96         i++;
     97         p=p->next;
     98     } 
     99     if(p==L){
    100         return printf("需要删除的位置不存在!
    ");
    101     }else{
    102         q=p->next;
    103         printf("删除的数为%d
    ",q->data); 
    104         p->next=p->next->next;
    105         p->next->front=p;
    106         free(q);
    107     }
    108     return printf("删除成功!
    ");
    109 }
    110 //查找链表某位置的数
    111 int FoundElem(LinkList *L){
    112     LinkList *p=L->next;
    113     int n,i=1; 
    114     printf("请输入你想查找的位置
    ");
    115     scanf("%d",&n);
    116     while(p!=L&&i<n){
    117         i++;
    118         p=p->next;
    119     }
    120     if(p==L){
    121         return printf("位置不存在!
    ");
    122     }else{
    123         return printf("该位置的值为%d",p->data);
    124     }
    125      
    126 } 
    127 int main(){
    128     LinkList L;
    129     IntList(&L);
    130     InputList(&L);
    131         TraverseDbCcLinkList(&L);
    132     InsertLinkList(&L);
    133         GetLength(&L);
    134         TraverseDbCcLinkList(&L);
    135     DelLinklist(&L);
    136         GetLength(&L);
    137         TraverseDbCcLinkList(&L);
    138     FoundElem(&L);    
    139 
    140 } 
  • 相关阅读:
    1059. C语言竞赛(20)
    1057. 数零壹(20)
    1056. 组合数的和(15)
    1054. 求平均值 (20)
    1052. 卖个萌 (20)
    1053. 住房空置率 (20)
    第五周课后作业02(动手动脑)
    课堂动手动脑
    课后作业
    课堂测试动手动脑
  • 原文地址:https://www.cnblogs.com/longlonglonglong/p/11005717.html
Copyright © 2011-2022 走看看