1. 程式人生 > >C語言之單迴圈連結串列

C語言之單迴圈連結串列

#include<stdio.h>
#include<stdlib.h>
struct node
{
         int data;
         struct node *next;
};
struct node *Init(struct node *head);
void Print_list(struct node *head);
struct node *insert(struct node *head,int i);
struct node *Delete(struct node *head,int i);
struct node *Delete(struct node *head,int i)
{
         struct node *t,*s;
         struct node *pr=head;
         int j;
         if(i==1)
         { 
          for(t=pr;t->next!=pr;t=t->next);                            //找尾指標 //找到最後一個節點
          s=pr;                                                                       //刪除第一個節點意味著連線第二個節點
          pr=pr->next;                                                         //找到指向第二個節點的指標
          t->next=pr;
          free(s);
          return pr;                                                                  //刪除第一個節點
 }    
 else
 {
          t=pr;
          for(j=1;j<i;j++)                                                       //找到要刪除的位置的前一個指標
          {                                                                            //連線刪除位置後一個節點
           t=t->next;         
          }
          s=t->next;
          t->next=s->next;
          return pr;
     }
} struct node *insert(struct node *head,int i)
{
         int item;
         int j;
         struct node *s,*t;
         struct node *pr=head;               //第一步:用一個指標pr代替傳入的head指標 用pr來操作連結串列
                                                             //第二步:判斷傳入的連結串列是否為空
                                                             //第三步:為空 結束 無法插入;不為空,插入(迴圈的插入邏輯很簡單)
        printf("輸入要插入的值\n");
         scanf("%d",&item);
         if(i==1)
          {
                  s=(struct node *)malloc(sizeof(struct node));                //建立一個節點s 
                  if(s==NULL)
                      {
                           printf("建立失敗\n");
                           exit(0);
                      }   
                   s->data=item;       
                   s->next=pr->next;      
                   pr->next=s;        
                   return pr;
 }
 else
 {
          t=pr;
          for(j=1;j<i;j++)
          {
               t=t->next;                                        //遍歷到要插入的位置,一般來說用迴圈次數來結束遍歷到了第幾個位置
          }
          s=(struct node *)malloc(sizeof(struct node));
          if(s==NULL)
          {
                   printf("建立失敗\n");
                   exit(0);
          }
          s->data=item;
          s->next=t->next;
          t->next=s;
          return pr;
     }
}
void Print_list(struct node *head)
{
             struct node *p;
             for(p=head->next;p!=head;p=p->next)
             {
              printf("%d ",p->data);
             }
             printf("\n");
            } struct node *Init(struct node *head)
    {
         int item;
         struct node *t;
         struct node *s;    
         struct node *pr=head;                           //第一步:用一個指標pr代替傳入的head指標 用pr來操作連結串列
                                                              //第二步:判斷傳入的連結串列是否為空
                                                           //第三步:為空 一種初始化方式;不為空,另一種初始化方式(迴圈的建立邏輯很簡單)
         while(1)
         {
              printf("輸入節點的值\n");
              scanf("%d",&item);
              fflush(stdin);
              if(pr==NULL)                       //判斷為空表之後的操作
              {
                   pr=(struct node *)malloc(sizeof(struct node));     //建立一個頭結點,然後使頭尾相接
                   if(pr==NULL)
                       {
                            printf("建立失敗\n");
                            exit(0);
                       }            
                  pr->next=pr;           //頭尾相接的操作
                  return  pr;         
              }      
              else     //如果不是空表 之後的操作        不是空表,自帶頭結點
              {
                   for(t=pr;t->next!=pr;t=t->next);                                //用個迴圈找到尾結點,後面需要用尾結點操作  
                   s=(struct node *)malloc(sizeof(struct node));             //建立一個節點  插入到頭節點和尾結點之間
                   if(s==NULL)
                       {
                            printf("建立失敗\n");
                            exit(0);
                       }
                       s->data=item;
                       s->next=pr;
                       t->next=s;  //將s新節點插入到頭結點和尾節點之間的操作
                       return  pr; 
              }
         }
        }
            int main()
            {
                 struct node *head=NULL;
                 int n,i;
                 while(n!=0)
             {
                  printf("單迴圈連結串列的基本操作\n");
                  printf("-----------------------------");
                  printf("1.建立一個節點\n");
                  printf("2.插入節點\n");
                  printf("3.刪除節點\n");
                  printf("4.顯示連結串列成員\n");
                  printf("0.退出\n");
                  printf("請選擇操作\n");
                  scanf("%d",&n);
                  switch(n)
                  {
                       case 1:
                        {
                             head=Init(head);
                             break;
                        }
                       case 2:
                        {
                             printf("插入的位置是\n");
                             scanf("%d",&i);
                             head=insert(head,i);
                             break;
                        }
                       case 3:
                        {
                             printf("刪除的位置是\n");
                             scanf("%d",&i);
                             head=Delete(head,i);
                             break;
                        }
                       case 4:
                        {
                             Print_list(head);
                             break;
                        }
                  }
             }
 return 0;
    }