zoukankan      html  css  js  c++  java
  • 数据结构之单链表基本操作 C语言

      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 #define OK            0
      4 #define ERROR        -1
      5 
      6 //
      7 typedef int Status;
      8 typedef int ElemType;
      9 
     10 /*
     11 单链表的存储结构:
     12 使用typedef定义的后面的LNode和*LinkList分别表示的是
     13 LNode是一个结构体类型的可以用他定义其他变量例如 LNode node即 node也为LNode类型的结构体
     14 *LinkList是一个结构体类型的指针可以用他定义其他变量例如 *LinkList node即 node也为LNode类型的结构体指针
     15 */
     16 typedef struct LNode{
     17     ElemType data; //数据域
     18     struct LNode *next; //指针域
     19 }LNode,*LinkList;
     20 
     21 int main(){
     22     ElemType data1[]={1,2,3,4,5,6,7,8,9};
     23     int n=9;
     24     //声明创建链表的方法
     25     //头插法
     26     LinkList Create_Link_Tou(ElemType data1[],int n);
     27     //尾插法
     28     LinkList Create_Link_Wei(ElemType data1[],int n);
     29     //获取第i个元素
     30     Status GetElem(LinkList L,int i);
     31     //在第i个元素之前插入元素
     32     LinkList ListInsert_L(LinkList L,int i);
     33     //删除链表中的第i个元素
     34     LinkList ListDelete_L(LinkList L,int i);
     35     //声明展示链表的方法
     36     void DisPlay(LinkList L);
     37     //循环调用Create_Link方法为链表赋值
     38     LinkList head=Create_Link_Wei(data1,n);
     39     //展示链表的方法
     40     printf("原始列表的数据为:");
     41     DisPlay(head);
     42     printf("插入后的列表的数据为:");
     43     head=ListInsert_L(head,4);
     44     DisPlay(head);
     45     head=ListDelete_L(head,3);
     46     printf("删除后的列表的数据为:");
     47     DisPlay(head);
     48     GetElem(head,5);
     49     return 0;
     50 }
     51 
     52 #if(0)
     53 //头插法创建单链表
     54 //创建链表的方法 传入的参数为链表的指针(头结点)和数据域
     55 LinkList Create_Link_Tou(ElemType data1[],int n){
     56     //给头结点分配空间
     57     LinkList head_node=(LinkList)malloc(sizeof(LNode));
     58     if(head_node==NULL){
     59         return ERROR;
     60     }
     61     head_node->next=NULL;
     62     int i;
     63     for (i =0; i <n; i++){
     64         //给链表分配内存
     65         LinkList p=(LinkList)malloc(sizeof(LNode));
     66         //进行赋值操作
     67         p->data=data1[i];
     68         p->next=head_node->next;
     69         head_node->next=p;
     70     }
     71     return head_node;
     72 }
     73 #endif
     74 
     75 #if(1)
     76 //尾插法创建单链表
     77 LinkList Create_Link_Wei(ElemType data1[],int n){
     78     //给头结点分配空间
     79     LinkList head_node=(LinkList)malloc(sizeof(LNode));
     80     if(head_node==NULL){
     81         return ERROR;
     82     }
     83     //首先将头结点的下一个指针为空
     84     head_node->next=NULL;
     85     //定义尾结点
     86     LinkList rear;
     87     //开始尾结点指向头结点
     88     rear=head_node;
     89     int i;
     90     for (i =0; i <n; i++){
     91         //给链表分配内存
     92         LinkList p=(LinkList)malloc(sizeof(LNode));
     93         //进行赋值操作
     94         p->data=data1[i];
     95         rear->next=p;
     96         rear=p;
     97     }
     98     //最后将尾结点的next为空 防止出现死循环
     99     rear->next=NULL;
    100     return head_node;
    101 }
    102 #endif
    103 
    104 //展示链表的方法 传入的参数为链表的指针
    105 void DisPlay(LinkList L){
    106     if (L == NULL){
    107         return;
    108     }
    109     // 链表第一个结点指针
    110     LinkList temp = L->next;
    111     while (temp!=NULL){
    112         printf ("%4d", temp->data);
    113         temp = temp->next;
    114     }
    115     printf ("
    ");
    116 }
    117 
    118 
    119 #if(1)
    120 //获取链表中的第i个元素
    121 Status GetElem(LinkList L,int i){
    122     //创建一个ElemType类型的变量用来接收值
    123     ElemType e;
    124     //创建一个链表的指针变量
    125     LinkList p;
    126     //p指向头结点的下一个节点,头结点为传入的参数
    127     p=L->next;
    128     int j=1;
    129     while(p!=NULL&&j<i){
    130         p=p->next;
    131         ++j;
    132     }
    133     //如果为空返回错误
    134     if(p==NULL||j>i){
    135         return ERROR;
    136     }
    137     e=p->data;
    138     printf("第%d个元素是%d
    ",i,e);
    139     return OK;
    140 }
    141 #endif
    142 
    143 #if(1)
    144 //向单链表中插入元素的方法 在第i个元素之前插入元素e
    145 LinkList ListInsert_L(LinkList L,int i){
    146     ElemType e=20; //要插入的元素
    147     LinkList p; //创建一个链表指针
    148     int j=0;//创建一个变量
    149     p=L;//将头结点赋值给指针p
    150     //找到i之前的节点
    151     while(p!=NULL&&j<i-1){
    152         p=p->next;
    153         ++j;
    154     }
    155     if(p==NULL||j>i-1){
    156         return ERROR;
    157     }
    158     //创建一个新节点
    159     LinkList s=(LinkList)malloc(sizeof(LNode));
    160     //进行数据的赋值和指针的转换
    161     s->data=e;
    162     s->next=p->next;
    163     p->next=s;
    164     //返回头结点
    165     return L;
    166 }
    167 #endif
    168 
    169 #if(1)
    170 //删除链表中的第i个元素
    171 LinkList ListDelete_L(LinkList L,int i){
    172     int e,j=0;
    173     LinkList p,q;
    174     p=L;
    175     //循环找到第i个元素
    176     while(p->next!=NULL&&j<i-1){
    177         p=p->next;
    178         ++j;
    179     }
    180     //错误判断
    181     if(p->next==NULL||j>i-1){
    182         return ERROR;
    183     }
    184     //转换指针 删除节点
    185     q=p->next;
    186     p->next=q->next;
    187     e=q->data;
    188     printf("删除的%d元素为:%d
    ",i,e);
    189     return L;
    190 }
    191 #endif

    运行结果:=========================================================================================================================================

  • 相关阅读:
    hdu5247找连续数(打表)
    hdu5246超级赛亚ACMer
    hdu5246超级赛亚ACMer
    cf534D 枚举握手次数
    cf534D 枚举握手次数
    4467奇妙的方式优化暴力的01边查询
    4467奇妙的方式优化暴力的01边查询
    POJ1364基本的查分约束问题
    POJ1364基本的查分约束问题
    poj1509最小表示法
  • 原文地址:https://www.cnblogs.com/yh2924/p/12501723.html
Copyright © 2011-2022 走看看