链表的常见用法

来源:互联网 发布:c语言printf输出汉字 编辑:程序博客网 时间:2024/05/19 19:34

#include <stdio.h>
#include <malloc.h>

#define ElemType int

typedef struct Node
{
    ElemType       Data;
    struct  Node * Next;
}LNode,*LinkList;

 LinkList CreatLNode_Tail_Insert( ) //尾插法建立链表
{
    LinkList Head;
    Head=(LinkList)malloc(sizeof(LNode));
    LNode *S,*R;
    ElemType Elem;

    Head->Next=NULL;
    R=Head;

    printf("请输入数字,以0终止输入\n");
    scanf("%d",&Elem);

    while(Elem!=0)
    {
        S=(LinkList)malloc(sizeof(LNode));
        S->Data=Elem;
        S->Next=NULL;
        R->Next=S;
        R=S;
        scanf("%d",&Elem);
    }
    return Head;
}

int Get_Length_Linklist(LinkList Head)//求表长
{
    LNode *p;
    int   j=0;
    p=Head;

    while(p->Next!=NULL)
    {
        p=p->Next;
        j++;
    }
    return j;
}

 ElemType Search(LinkList Head,int k) //查找第K个结点
{
 LNode *p;
 int   length;
 int   i;
 p=Head;

 length=Get_Length_Linklist(Head);
 if(length==0||length<k||k==0)
 {
     return 0;
 }
 else
 {
     for(i=0;i<k;i++)
     {
       p=p->Next;
     }
     return p->Data;
 }
}

void Insert(LinkList Head,ElemType Elem,int K)//将数据域为Elem的结点插到第K的结点之后
{
     int    length=0;
     LNode  *p,*S;
     int    i;

     p=Head;
     S=NULL;
     length=Get_Length_Linklist(Head);
     if(K>length)
     {
      printf("查找失败,没有第K个结点\n");
     }
     else
     {
         for(i=0;i<K;i++)
        {
          p=p->Next;
        }

          S=(LinkList)malloc(sizeof(LNode));
          S->Data=Elem;
        if(K==length)
        {
          S->Next=NULL;
          p->Next=S;
        }
        else
        {
          S->Next=p->Next;
          p->Next=S;
        }
     }
}

void Delete_Node(LinkList Head,int K)//删除第K个结点
{
     int    length=0;
     LNode  *p,*q;
     int    i;

     p=Head;
     q=NULL;
     length=Get_Length_Linklist(Head);
     if(K>length)
     {
      printf("查找失败,没有第 %d 个结点\n",K);
     }
     else
     {
         for(i=0;i<K-1;i++)//查找被删除结点的上一个结点
        {
          p=p->Next;
        }
        q=p->Next;//q 指向被删除结点

        if(K==length)
        {
          p->Next=NULL;
        }
        else
        {
          p->Next=q->Next;
        }
        free(q);
     }
}

void Print (LinkList Head)
{
    LinkList   p;
    p=Head;
    while(p->Next!=NULL)
    {
        p=p->Next;
        printf("%d   ",p->Data);
    }
    printf("\n");
}

int  Destroy_LinkList(LinkList Head)//销毁链表
{
    LinkList p,q;
    p=Head;
    q=p->Next;
    while(q->Next!=NULL)
    {
        free(p);
        p=q;
        q=q->Next;
    }
    free(p);
    free(q);
    return 0;
}

int main(void)
{
    LinkList  head;
    int       length=0;
    int       search_num;
    int       found;
    ElemType  elem;
    int       insert_dir;
    int       delete_dir;

    head=CreatLNode_Tail_Insert();
    Print(head);
    length=Get_Length_Linklist(head);
    printf("链表长度:%d\n",length);
    printf("请输入待查找结点序号:");
    scanf("%d",&search_num);
    found=Search(head,search_num);
    if(found==0)
    {
        printf("查找失败,没有第 %d 个结点\n",search_num);
    }
    else
    {
        printf("查找成功,第 %d 个结点的数据是 %d \n",search_num,found);
    }
    printf("请输入待插入结点数据,插入位置\n");
    scanf("%d",&elem);
    scanf("%d",&insert_dir);
    Insert(head,elem,insert_dir);
    Print(head);
    printf("请输入待删除结点位置\n");
    scanf("%d",&delete_dir);
    Delete_Node(head,delete_dir);
    Print(head);
    Destroy_LinkList(head);
    return 0;
}

0 0
原创粉丝点击