C語言數據結構單鏈表的相關操作彙總

/*
*鏈表的相關操作集合
*鏈表的創建 頭插法 尾插法
*鏈表元素的排序(遞增排序)
*鏈表的遍歷
*鏈表節點點的插入 前插 後插 在指點位置插入數據
*刪除指點位置的節點
*按值進行查找 按序號進行查找
*/

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#define OK 1
#define ERROR 0
typedef char*NameType;//鏈表節點名稱的數據類型
//static int id=0;
typedef struct element
{
    int id;
    NameType name;//節點的名稱

}ElementType;//鏈表節點的數據域結構體
typedef struct linklist
{
    ElementType data;
    struct linklist *next;//指向下一個節點點的指針
}LinkList;//鏈表的數據類型
LinkList*create_linklist();//創建單鏈表
void Display_linklist(LinkList*head);//鏈表的遍歷
int  insert_after_linklist(LinkList*p,LinkList*s);//在p後面插入s節點
int  insert_before_linklist(LinkList*head,LinkList*p,LinkList*s);//在指定節點的前面進行插入
int  insert_position(LinkList*head,int i,LinkList*p);//在指定的位置進行插入
void sort_node(LinkList*head);//對鏈表的節點進行排序
int  delete_position(LinkList*head,int i );//刪除指定位置的節點
int delet_node(LinkList*head,LinkList*p);//刪除指點的節點
LinkList*search_index_linklis(LinkList*head,int i);//按序號進行查找
LinkList*search_data_linklist(LinkList*head,ElementType key);//按值進行查找
int length_linklist(LinkList*head);//返回鏈表的長度
int dele_node(LinkList*p);//對節點後繼節點進行刪除
void main()
{
    LinkList*head;
    LinkList*r;
    LinkList*s;//在後面進行插入的節點
    LinkList*s1;//在指定位置進行插入
    int index;//要插入的位置
    ElementType str;//要查詢的數據的名稱
    head=create_linklist();
    if(head==NULL)
        printf("鏈表創建失敗!\n");
      else
      {
          printf("鏈表創建成功!\n");
          printf("鏈表遍歷的結果爲:\n");
          Display_linklist(head);
      }
      printf("\n");
       s=(LinkList*)malloc(sizeof(LinkList));//對其進行指向操作(同下)
       s1=(LinkList*)malloc(sizeof(LinkList));//對其進行動態賦存儲空間
      printf("請輸入要插入節點的數據:\n");
        s->data.name=(NameType)malloc(sizeof(char)*20);
        s->next=NULL;
          scanf("%s",s->data.name);
        s->data.id=rand()%50;
        printf("輸入查詢的數據-名稱\n");
        str.name=(NameType)malloc(sizeof(char)*20);
          scanf("%s",str.name);
          str.id=rand()%50;
         r= search_data_linklist(head,str);
         if(r==NULL)
         {
             printf("要查詢的數據沒有找到:\n");

         }
         else
         {
             //將節點s插入到查詢到的節點的後面
             printf("查詢節點成功\n");
              int result=insert_after_linklist(r,s);
              if(result==0)
              {
                  printf("插入節點失敗\n");
              }
              else
              {
                  printf("插入節點成功\n");
              }
         }
         s1=(LinkList*)malloc(sizeof(LinkList));
         printf("請輸入要插入節點的名稱:\n");
         s1->data.name=(NameType)malloc(sizeof(char)*20);
          scanf("%s",s1->data.name);
             s1->data.id=rand()%50;
            printf("請輸入要插入的位置:\n");
              scanf("%d",&index);
              int result1= insert_position(head,index,s1);
              if(result1==0)
              {
                  printf("插入指定位置插入節點失敗\n");

              }
              else
              {
                  printf("在指定位置插入節點成功\n");
              }
               printf("\n");
              printf("對查詢到的節點進行刪除:\n");
             int result2=delet_node(head,r);
              if(result2==0)
              {
                  printf("對指定節點的刪除失敗:\n");
              }
              else
              {
                  printf("對指定節點的刪除成功:\n");
              }
              printf("請輸入要刪除的節點的位置:\n");
              int index1;//要刪除的指定節點的下標
              scanf("%d",&index1);
              int result3=delete_position(head,index1);
              if(result3==0)
              {
                  printf("刪除指定位置節點失敗:\n");

              }
              else
              {
                  printf("刪除指定位置節點成功:\n");
              }
              //printf("\n");
              printf("鏈表節點的個數爲:%d",length_linklist(head));
          printf("鏈表節點的數據排序的結果爲:\n");
         sort_node(head);
         Display_linklist(head);
}
LinkList*create_linklist()//創建單鏈表
{
    LinkList*head;
    ElementType data;
    LinkList*p;
     head=(LinkList*)malloc(sizeof(LinkList));//動態賦儲存空間
    LinkList*tail;
    //尾插法創建單鏈表
    if(head==NULL)
    {
        printf("鏈表創建失敗!\n");
        return NULL;

    }
    else
    {
        tail=head;
    }
    printf("請輸入數據:\n");
    data.name=(NameType)malloc(sizeof(char)*20);
    while(1)
    {
        gets(data.name);
        p=(LinkList*)malloc(sizeof(LinkList));
        p->data.name=(NameType)malloc(sizeof(LinkList));//賦動態存儲空間
         if(strcmp(data.name,"^")==0)//strcmp是在字符串之間的比較
         {
             break;
         }
         else
            {
             p->data.id=rand()%50;//隨機時間函數 以時間爲種子 產生隨機數字
        strcpy(p->data.name,data.name);
             tail->next=p;
             tail=p;
             p->next=NULL;//使最後一個節點的next指針爲空  等價於tail->next=NULL

            }
         data.name=(NameType)malloc(sizeof(LinkList));
       }
    /* //頭插法創建單鏈表
    if(head==NULL)
    {
        printf("創建單鏈表失敗!\n");
        return NULL;
    }
    else{
        head->next=NULL;
    }
      data.name=(NameType)malloc(sizeof(char)*20);//字符串
      printf("請輸入數據:\n");
      while(1)
      {    gets(data.name);
          p=(LinkList*)malloc(sizeof(LinkList));
          p->data.name=(NameType)malloc(sizeof(char)*20);//動態賦儲存空間
          p->data.id=++id;
          if(strcmp(data.name,"^")==0)
            break;
          else
          {
               strcpy(p->data.name,data.name);
               p->next=head->next;
               head->next=p;
               data.name=(NameType)malloc(sizeof(char)*20);

          }
      }*/

      return head;
}
void Display_linklist(LinkList*head)
{
    LinkList*p;
    p=head->next;
    if(p==NULL)
    {
        printf("鏈表有誤,遍歷失敗!\n");
        return ;
    }

    else
    {
        printf("HEAD->");
        while(p!=NULL)
        {
            printf("[%d,%s]->",p->data.id,p->data.name);
            p=p->next;
        }
        printf("END");
    }
}
int   insert_after_linklist(LinkList*p,LinkList*s)//在p後面插入s節點
{
    s->next=p->next;
    p->next=s;
    return 1;
}
int   insert_before_linklist(LinkList*head,LinkList*p,LinkList*s)//在指定節點的前面進行插入
{
    if(p==head)//s想插入到head的前面的時候插入失敗
    {
        return 0;
    }
    else
    {
        LinkList*q;
        q=head;
        while(q->next!=p)
        {
            q=q->next;
        }
        insert_after_linklist(q,s);//在q的後面插入s

    }
}
void sort_node(LinkList*head)//對鏈表的節點進行排序
{
    //對鏈表節點進行遞增排序
    LinkList*p,*q;
    ElementType *temp;//中間值變量
    temp=(ElementType*)malloc(sizeof(ElementType));
    for(p=head->next;p->next!=NULL;p=p->next)
        for(q=head->next;q->next!=NULL;q=q->next)
    {
        if(q->data.id>q->next->data.id)
        {
            *temp=q->data;
            q->data=q->next->data;
            q->next->data=*temp;//數值進行交換
        }
    }
}
LinkList*search_data_linklist(LinkList*head,ElementType key)//按值進行查找
{
    LinkList*p;
    p=head->next;
    if(p==NULL)
    {
        return NULL;
    }
    else
    {
        while(p!=NULL)
        {
            if(strcmp(p->data.name,key.name)==0)
            {
                break;
            }
            else
            p=p->next;
        }
        return p;//找到數據對應的節點
    }

}
int  insert_position(LinkList*head,int i,LinkList*p)//在指定的位置進行插入
{
    LinkList*q;
    if(i<=0)//在head指針處或者前面進行插入是失敗的
    {
        return 0;

    }
    else if(i==1)
    {
        q=head;//在head指針後面進行插入

    }
    else
    {
        q=search_index_linklis(head,i-1);//在i頂點下標前面進行插入 利用search函數進行查找
    }
    insert_after_linklist(q,p);
      return 1;
}
LinkList*search_index_linklis(LinkList*head,int i)//按序號進行查找
{
    int j=0;
    LinkList*q;
    q=head;
    //head的位置對應的是0
    if(i<0)
    {
        return NULL;//沒有找到
    }
    else
    {
        while(q->next!=NULL&&i>j)
        {
            j++;
            q=q->next;

        }
    }
        if(i==j)
        {
            return q;

        }
        else
        {
            return NULL;
        }
}
int dele_node(LinkList*p)//對節點後繼節點進行刪除
{
    //對節點的後繼節點進行刪除
    LinkList*s;
    s=p->next;
    p->next=s->next;
    free(s);//對刪除節點進行釋放空間
    return 1;
}
int delet_node(LinkList*head,LinkList*p)//對指定節點進行刪除
{
    LinkList*s;
    //假如節點有後繼節點的存在
    if(p->next!=NULL)//後繼節點不爲空
    {
        s=p->next;
        p->data=s->data;
        p->next=s->next;//將後繼節點的值賦值給其要刪除的節點的數據域
        return 1;

    }
    else
    {
        //找到節點的前繼接節點
        s=head;
        while(s->next!=p)
        {
            s=s->next;

        }
        dele_node(s);//將s的後繼節點進行刪除(達到刪除指定節點的目的)
          return 1;//刪除成功
    }
    return 0;//刪除失敗
}

int  delete_position(LinkList*head,int i )//刪除指定位置的節點
{
    //對不可能的情況進行判斷
    LinkList*p;
    LinkList*s;
    p=head;
    if(i<0)

    {
        printf("刪除節點失敗!\n");
        return 0;


    }
    else
    {
        //對其前繼節點進行查找
        s=search_index_linklis(head,i);
        if(s==NULL)
            return 0;
        while(p->next!=s)
        {
            p=p->next;
        }
        dele_node(p);//刪除後繼節點即是指定位置的節點
      return 1;
      }

}
int length_linklist(LinkList*head)//返回鏈表的長度
{
    //返回鏈表的長度(鏈表的長度代表鏈表節點的個數)
    int count=0;//計算鏈表的長度
    LinkList*p;
    p=head->next;//指向第一你鏈表數據節點
    while(p!=NULL)
    {
        count++;
        p=p->next;

    }
    return count;//返回鏈表節點的個數
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章