zoukankan      html  css  js  c++  java
  • 关于链表的一个小程序

    关于链表的一个小程序:

    /**************************链表*****************************/
    /* 具备功能 */
    /* 链表按元素位置插入 */
    /* 链表按元素位置删除 */
    /* 链表全表遍历 */
    /* 链表整表创建(头插法) */
    /* 链表整表创建(尾插法) */
    /* 链表整表删除 */
    /**************************链表*****************************/

    #include<stdio.h>
    #include<stdlib.h>

    typedef struct node //链表存储结构
    {
    int data;
    struct node *next;
    }Node;

    void LinkedListInitialization(Node **LinkedList); //链表初始化
    int LinkedListTraverse(Node *LinkedList); //链表全表遍历
    int LinkedListInsert(Node **LinkedList, int position, int data); //链表按元素位置插入
    int LinkedListDelete(Node **LinkedList, int position); //链表按元素位置删除
    void LinkedListCreateHeadInsertion(Node **LinkedList, int data[], int number); //链表整表创建(头插法)
    void LinkedListCreateTailInsertion(Node **LinkedList, int data[], int number); //链表整表创建(尾插法)
    void LinkedListDestroy(Node **LinkedList); //链表整表删除
    void Welcome(); //菜单栏函数

    int main()
    {

    int i=0;
    int response;
    int position;
    int value;


    Node *LinkedList=NULL; //设立头结点

    LinkedListInitialization(&LinkedList); //链表初始化

    printf("采用前插法,插入和删除传的参数改成了指向指针的指针 --因为既然链表要变,那么就应该传指向链表指针的指针吧 ");
    printf("************************************************************************* ");


    Welcome(); //菜单栏函数


    while(scanf("%d", &response)==1)
    {
    switch(response)
    {
    case 1: printf("请输入要插入的链表位置和数值,用空格键分开(0--当前节点+1): ");
    scanf("%d%d", &position, &value);
    LinkedListInsert(&LinkedList, position, value); //链表插入, position表示插入位置,value是插入值
    printf(" ");
    break;

    case 2: printf("请输入要删除的链表元素的位置(0--当前节点): ");
    scanf("%d", &position);
    LinkedListDelete(&LinkedList, position); //链表删除,position表示删除位置
    printf(" ");
    break;

    case 3: printf("遍历链表的结果为: ");
    LinkedListTraverse(LinkedList); //链表遍历
    printf(" ");
    printf(" ");
    break;

    case 4: return 1;
    }

    Welcome();
    }

    LinkedListDestroy(&LinkedList);
    if(LinkedList->next==NULL)
    printf("test! ");
    /*
    Node *LinkedList=NULL; //设立头结点
    int number=10;
    int data[10]={1,2,3,4,5,6,7,8,9,10};
    LinkedListCreateTailInsertion(&LinkedList, data, number);
    LinkedListCreateHeadInsertion(&LinkedList, data, number);
    LinkedListTraverse(LinkedList);

    */


    return 1;
    }

    /*******************************链表初始化*******************************/

    /* 因为实参是一个指针,故形参必须是一个二级指针,才能改变实参指针中的值*/
    /* 给头结点分配空间,data域初始化为0, next域赋值NULL */

    /*******************************链表初始化*******************************/

    void LinkedListInitialization(Node **LinkedList)
    {

    *LinkedList =(struct node *)malloc(sizeof(Node));
    (*LinkedList)->data = 0; //要加括号,->的优先级比*高
    (*LinkedList)->next = NULL;


    }

    /*******************************链表全表遍历*****************************/

    /*设定一个指针pointer指向头结点后面第一个元素,开始遍历,直到pointer为空 */

    /*******************************链表全表遍历*****************************/

    int LinkedListTraverse(Node *LinkedList)
    {

    Node *p;
    p = LinkedList->next;

    if(!p)
    {
    printf("没有数字,请先插入!");
    return 1;
    }

    while(p->next != NULL)
    {
    printf("%d",p->data);
    p = p->next;
    }

    printf("%d",p->data);
    putchar(' ');

    return 1;

    }

    /*******************************链表插入*****************************/

    /* 在position位置进行插入数据data */
    /* 使用pointer指针找到position前一个元素位置,而后进行插入操作 */

    /*******************************链表插入*****************************/

    int LinkedListInsert(Node **LinkedList, int position, int data)
    {
    int j;
    Node * p,*s;
    p = *LinkedList;
    j = 1;


    while(p && j < position) //找到下标position-1,因为有个头节点
    {
    p = p->next;
    j++;
    }

    if(p== NULL ) //第i个节点不存在
    {
    printf("此时第i个节点不存在,请位置数值小一点,可以先遍历以下。 ");
    return 1;
    }

    s = (struct node *)malloc(sizeof(Node));
    s->data = data;
    s->next = p->next;
    p->next = s;

    return 1;
    }

    /*******************************链表删除*****************************/

    /* 在position位置删除结点 */
    /* 使用pointer指针找到position前一个元素位置,而后进行删除操作 */

    /*******************************链表删除*****************************/

    int LinkedListDelete(Node **LinkedList, int position) //这里也是,应该加个*吧?
    {

    int j;
    Node * p,*s;
    p = *LinkedList;
    j = 1;

    while(p && j < position) //找到下标为position-1
    {
    p = p->next;
    j++;

    }

    if(p==NULL || j!=position ||p->next ==NULL)
    {
    printf("输入的节点有误,请用1查清楚再输入! ");
    return 1;

    }

    s = p->next;
    p->next = p->next->next;
    free(s);

    return 1;
    }

    /***************************链表整表创建(头插法)*******************/

    /* 新加入的结点总是跟在头结点后边 */

    /***************************链表整表创建(头插法)*******************/

    void LinkedListCreateHeadInsertion(Node **LinkedList, int data[], int number)
    {
    Node * s;
    int i;

    *LinkedList =(struct node *)malloc(sizeof(Node));
    (*LinkedList)->next = NULL;
    (*LinkedList)->data = 0;

    for(i = 0; i < number; i++)
    {
    s = (struct node *)malloc(sizeof(Node));
    s->data = data[i];
    s->next =(* LinkedList)->next;
    (*LinkedList) ->next = s;
    }



    }

    /***************************链表整表创建(尾插法)*******************/

    /* 设立一个尾指针tail,tail总是指向链表的末尾。新加入的结点链接到tail
    的末尾,同时更新tail指针,使其指向新加入的结点(链表的末尾) */

    /***************************链表整表创建(尾插法)*******************/

    void LinkedListCreateTailInsertion(Node **LinkedList, int data[], int number)
    {
    Node * s,*r;
    int i;

    *LinkedList =(struct node *)malloc(sizeof(Node));
    (*LinkedList)->next = NULL;
    (*LinkedList)->data = 0;

    r = *LinkedList;
    for(i = 0; i < number; i++)
    {
    s = (struct node *)malloc(sizeof(Node));
    s->data = data[i];
    r->next = s;
    r = s;
    }

    r->next = NULL;

    }

    /***************************链表整表删除*******************/

    /* 设置p,q两个指针, q指向p的下一个元素。释放p指向的结点后,
    把q的值赋给p, 同时q更新为下一个元素 */

    /***************************链表整表删除*******************/

    void LinkedListDestroy(Node **LinkedList)
    {
    Node *p,*q;
    p =(*LinkedList)->next;

    while(p->next !=NULL)
    {
    q = p;
    p = p->next;
    free(q);
    }

    (*LinkedList)->next = NULL;


    }

    /*******************菜单栏函数***********************/

    void Welcome()
    {
    printf("欢迎光临链表!请按1,2,3,4选择对应功能: ");
    printf("1. 链表按元素位置插入: ");
    printf("2. 链表按元素位置删除: ");
    printf("3. 链表全表遍历: ");
    printf("4. 退出: ");
    }

  • 相关阅读:
    2.5亿!华为成立新公司!
    两年半换第 4 份工作,做个总结
    不懂什么叫编程?
    Google 为什么把几十亿行代码放在一个库?
    IntelliJ 平台 2020 年路线图
    别找了,这是 Pandas 最详细教程了
    MongoDB是什么?看完你就知道了!
    有了这个神器,轻松用 Python 写 APP !
    整理出来几个比较实用的代码对比工具
    学习进度条 第六十一-七十五天 SpringMVC学习笔记
  • 原文地址:https://www.cnblogs.com/zxj-262410/p/6691268.html
Copyright © 2011-2022 走看看