zoukankan      html  css  js  c++  java
  • C语言实现数据结构的链表

    链表是用一组任意的存储单元来存放线性表的结点.

    为了能正确表示结点间的逻辑关系,在存储每个结点值的同时,还必须存储指示其后继结点的地址信息,这个信息称为指针或链

    下面是C语言实现链表的数据结构及基本的算法。

    # include <stdio.h>
    # include <stdlib.h>
    typedef char DataType;   //定义节点数据域类型
    typedef struct node      //节点类型定义
    {
     DataType data;      //节点的数据域
     struct node *next;  //节点的指针域指向下一个节点
    }ListNode;
    typedef ListNode *LinkList; 
    ListNode *p;   //定义节点指针
    LinkList head; //定义链表头指针


    /*错误信息输出函数*/
    void Error(char *message)
    {
     fprintf(stderr,"Error:%s/n",message); //输出错误信息
     exit(1);//终止程序,返回1给操作系统
    }

    /*打印输出链表*/
    void printList(LinkList head)
    {
     ListNode *p; //节点
     int i=0;
     if(head!=NULL)
     {
      p=head;
      while(p->next!=NULL)
      {
       p=p->next;
       printf("node[%d]=%c/n",i,p->data);
       i++;
      }
      
     }
    }

    /*创建链表*/
    LinkList CreateList()
    {
     char ch;
     LinkList head=(LinkList)malloc(sizeof(ListNode));//生成头节点
     ListNode *s,*r;
     r=head;
     head->data='*';
     while((ch=getchar())!='/n')
     {
      s=(LinkList)malloc(sizeof(ListNode));
      s->data=ch;
      r->next=s;
      r=s;
     }
     r->next=NULL;
     return head;
    }

    /*取得第i个结点*/
    ListNode * getNode(LinkList head,int i)
    {
     int j=0;
     ListNode *p;
     p=head;
     while(p->next!=NULL)
     {
      p=p->next;
      j++;
      if(j==i)
      {
       return p;
      }
     }
     return NULL;
    }

    /*根据结点值域找到结点*/
    ListNode * getNodeByKey(LinkList head,DataType key)
    {
     int j=0;
     ListNode *p;
     char nodeData;
     p=head;
     while(p->next!=NULL)
     {
      p=p->next;
      nodeData=p->data;
      if(key==nodeData)
      {
       return p;
      }
     }
     return NULL;
    }
    /*插入结点*/
    void insertList(LinkList head,DataType x,int i)
    {
     ListNode *p,*s;
     p=getNode(head,i-1);
     if(p==NULL)
     {
      Error("position error");
     }
     s=(ListNode *)malloc(sizeof(ListNode));
     s->data=x;
     s->next=p->next;
     p->next=s;
    }

    /*删除结点*/
    void deleteList(LinkList head,int i)
    {
     ListNode *p,*r;
     p=getNode(head,i-1);
     if(p==NULL||p->next==NULL)
     {
      Error("position error");
     }
     r=p->next;
     p->next=r->next;
     free(r);
    }

    void main()
    {
     LinkList list;
     ListNode *node;
     int getIndex=4;
     list=CreateList(); //创建链表
     printList(list);  
     node=getNode(list,getIndex);  //取得链表中索引为4的节点
     printf("get node%d is%c/n",getIndex,node->data);
     printf("insert X to node %d/n",3);
     insertList(list,'X',3); //在索引为3的地方插入节点
     printList(list);
     printf("delete %d node/n",3);
     deleteList(list,3);   //删除索引为3的节点
     printList(list);
    }

     
  • 相关阅读:
    2017.4.18下午
    2017.4.18上午
    2017.4.17上午
    2017.4.14下午
    2017.4.14上午
    4.17下午
    4.17上午
    4.13下午
    4.13上午
    4.10上午
  • 原文地址:https://www.cnblogs.com/xiejava/p/15171486.html
Copyright © 2011-2022 走看看