1. 程式人生 > >c 語言:一個連結串列的實現

c 語言:一個連結串列的實現

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

typedef int ElementType;
typedef int BOOL;

#define TRUE 1
#define FALSE 0

inline BOOL compare(int a,int b,BOOL flag)
{
  if(( a > b && !flag)||( a < b && flag))
     return TRUE;
  else
     return FALSE;
}
typedef struct LNode
{
  ElementType data;
  struct LNode * next;
} LinkList;

LinkList * CreateList()
{
  LinkList * L;
  LinkList * r;
  LinkList * s;
  int length;
  ElementType e;

  printf("Please Enter The Length:");
  scanf("%d",&length);

  L = (LinkList *)malloc(sizeof(LinkList));
  L->next = NULL;
  L->data = length; // L的data域儲存連結串列的長度
  r = L;

  printf("Please Enter The Data:");
  int i;
  for(i = 0;i < length;i++)
  {
    s = (LinkList *)malloc(sizeof(LinkList));
    scanf("%d",&e);
    s->data = e;
    r->next = s;
    r = s;
  }

  r->next = NULL;
  return L;
}
void ListInsert(LinkList * L)
{
  ElementType e;
  int position;

  printf("Please Enter The Insert Position:");
  scanf("%d",&position);

  if(position > L->data + 1 ||position < 0)
    { printf("Illgal Insert Position !\n"); return;}

  printf("Please Enter The Data To Insert:");
  scanf("%d",&e);

  LinkList * p = L;
  LinkList * s;
  s = (LinkList *)malloc(sizeof(LinkList));
  s->data = e;
  int i;
  for( i = 0;i < position - 1;i++)
      p = p->next;
  s->next = p->next;
  p->next = s;
  L->data++; // L的長度增加1
}

void ListDelete(LinkList * L)
{ int position;
  printf("Please Enter The Delete Position");
  scanf("%d",&position);

  if(position > L->data||position < 0)
  {printf("Illgal Delete Position !\n"); return;}
  LinkList * p = L;
  LinkList * r = p;
  int i;
  for( i = 0; i < position -1;i++)
     p = p->next;
  r = p->next;
  p->next = r->next;
  free(r);
  L->data--; //L的長度減小1
}

void BubbleSort(LinkList * L)
{
  if(L->data <= 1)
  return;

  LinkList * pre;
  LinkList * p;
  LinkList * s;
  int i,j;
  BOOL flag,change;
  printf("Please Choice up Or down: ");
  scanf("%d",&flag);
  for( i = 0; i < L->data - 1; i++)
     {
        pre = L;
          p = pre->next;
          s = p->next;
       change = FALSE;
       for( j = 0; j < L->data - i -1; j++)
       {

          if(compare(p->data,s->data,flag))
            {
               pre->next = s;
               p->next = s->next;
               s->next = p;
               change = TRUE;
            }

        pre = pre->next;
          p = pre->next;
          s = p->next;
       }

       if(!change) break;

     }
}

int FindElement(LinkList * L)
{
  ElementType e;
  printf("Please Enter The Element To Find:");
  scanf("%d",&e);

  LinkList * p = L;
  int i = 0;
  while(p != NULL&&p->data != e)
  {
    p = p->next;
    i++;
  }
  if( i > L->data)
    return -1;
  else
    return i;

}

BOOL GetElement(LinkList * L,ElementType * eptr)
{
  int position;

  printf("Please Enter The Element Position:");
  scanf("%d",&position);

  LinkList * p = L;


  if(position < 0|| position > L->data)
  {
     printf("Illegal Position Entered!\n");
    return FALSE;

  }
  else

   { int i;
     for( i = 0; i < position; i++)
        p = p->next;

     *eptr = p->data;

    return TRUE;
   }

}
/*
ElementType * GetElement(LinkList * L)
{
  int position;
  ElementType * eptr;
  printf("Please Enter The Element Position:");
  scanf("%d",&position);

  LinkList * p = L;
  if(position < 0|| position > L->data)
   {
     printf("Illegal Position Entered!\n");
     exit(0);
   }
  else
   {  int i;
      for( i = 0; i < position; i++)
        p = p->next;
     *eptr = p->data;
     return eptr;

   }
}

BOOL GetElement(LinkList * L,ElementType ** eptr)
{
  int position;

  printf("Please Enter The Element Position:");
  scanf("%d",&position);

  LinkList * p = L;
  if(position < 0|| position > L->data)
   {
     printf("Illegal Position Entered!\n");
     return FALSE;
   }
  else
   {  int i;
      for( i = 0; i < position; i++)
        p = p->next;
     *eptr = &(p->data);
     return TRUE;

   }
}

*/

void DisplayList(LinkList * L)
{
  LinkList * p = L->next;
  printf("The Length Of The LinkList is:%d\n",L->data);
  while(p!=NULL)
  {
    printf("%d ",p->data);
    p = p->next;
  }

}

void DistroyList(LinkList * L)
{
  LinkList * p = L->next;
  LinkList * pre = L;
  while(p!=NULL)
  {
    free(pre);
    pre = p;
    p = p->next;
  }
  free(pre);

}

int main()
{
  LinkList * linklist =  CreateList();
  int  choice;

  while(choice != -1)
  {

    printf("Please Enter Choice:1.Insert 2.Delete 3.Display 4.Bubble Sort 5.FindElement 6.GetElement -1.Quit\n");
    scanf("%d",&choice);
    switch(choice)
    {
     case 1:printf("Insert\n");ListInsert(linklist);break;
     case 2:printf("Delete\n");ListDelete(linklist);break;
     case 3:printf("Display\n");DisplayList(linklist);break;
     case 4:printf("BubbleSort: 0 up   1 down\n");BubbleSort(linklist);break;
     case 5:printf("FindElement:\n");printf("%d", FindElement(linklist));break;
     case 6:printf("GetElement:\n");ElementType  e; if(GetElement(linklist,&e)) printf("%d",e);break;
     case -1:printf("Quit\n");break;
     default:
            printf("Please Enter A Leagal Choice!\n");
            break;
    }
   printf("\n");
 }
 DistroyList(linklist);

  return 0;
}

/* 寫程式時的一些收穫

  1.c語言函式沒有引用傳遞,只能按值傳遞。在函式內的指標操作比C++要複雜。
  2.for(int i = 0;i < length;i++) 這種寫法在C89下無法編譯通過。
  3.if(length <= 1); if條件語句後多加一個分號,等同於空語句,編譯器不會報錯。
*/


相關推薦

c 語言一個連結串列實現

#include <stdio.h> #include <stdlib.h> typedef int ElementType; typedef int BOOL; #define TRUE 1 #define FALSE 0 inline BOOL

C語言連結串列實現一元多項式的加法

/* 一元多多項式的加法 1.先建立連結串列,儲存多項式 2.輸出多項式 3.兩個多項式相加 4.輸出多項式 */ # include <stdio.h> # include <malloc.h> typedef struct dxs

演算法精解(一)C語言描述(連結串列

1.連結串列認知  一場病,斷了好久。這幾天算是基本沒什麼問題了。是時候繼續了。 連結串列我想可以認為是,點到線的過程。 一個個點就是一個個連結串列的節點,以特定的順序組合或連結後,行成了一條線,即連結串列。所以新增,刪除一個點是相對較容易的(因為可以動態的追加,刪除節點),但

C語言版)連結串列(一)——實現單向連結串列建立、插入、刪除等簡單操作(包含個人理解說明及註釋,新手跟著寫程式碼)

我學習了幾天資料結構,今天下午自己寫了一個單向連結串列的程式。我也是新手,所以剛開始學習資料結構的菜鳥們(有大牛們能屈尊看一看,也是我的榮幸)可以和我一起共同學習、討論,當然也很高興能指出我的錯誤,因為這是我們一起成長的過程。本程式碼包含我在寫程式時的一些個人理解的說

C語言版)連結串列(四)——實現雙向迴圈連結串列建立、插入、刪除、釋放記憶體等簡單操作

雙向迴圈連結串列是基於雙向連結串列的基礎上實現的,和雙向連結串列的操作差不多,唯一的區別就是它是個迴圈的連結串列,通過每個節點的兩個指標把它們扣在一起組成一個環狀。所以呢,每個節點都有前驅節點和後繼節點(包括頭節點和尾節點)這是和雙向連結串列不同的地方。我們看下雙向迴圈連結

C語言如何用函式實現2-100以內素數的判別

C語言中如何用函式實現2-100以內素數的判別 #include<stdio.h> #include<math.h> int isPrime(int);//函式宣告 int main() { int i; for(i = 2; i <= 100;

資料結構(c語言)——雙向連結串列的基本操作

定義一個雙向連結串列結構: typedef struct DulNode{ // *prior:前一個元素的地址 // *next:後一個元素的地址 struct DulNode *prior; Element data; struct DulNode *

C語言》環形連結串列與《約瑟夫問題》

環形連結串列與《約瑟夫問題》 Main.c A_List.h A_List.c Main.c #include "A_List.h" #include <time.h> void main() { /*********

約瑟夫環(使用C語言單向迴圈連結串列來解決)

題目描述 編號為1,2,…,n的n個人按順時針方向圍坐在一張圓桌周圍,每人持有一個密碼(正整數)。一 開始任選一個正整數m作為報數上限值,從第一個人開始按順時針方向自1開始報數,報到m時停止報數,報m的那 個人出列,將他的密碼作為新的m值,從他順時針方向的下一個人開始重新從1報數,

C語言之單迴圈連結串列

#include<stdio.h> #include<stdlib.h> struct node {          int data;  &

C語言資料結構——連結串列

轉自https://www.cnblogs.com/chenxiaohei/p/6862791.html /* 連結串列節點的插入與刪除 編譯環境:VC++ 6.0 編譯系統:windows XP SP3 */ #inc

資料結構(c語言)--雙向連結串列的基本操作

定義一個雙向連結串列結構: typedef struct DulNode{ // *prior:前一個元素的地址 // *next:後一個元素的地址 struct DulNode *prior; Element data; struc

資料結構連結串列實現棧的括號匹配

完成以下程式,並在右邊空白處,對錯誤進行修改,並記錄下程式執行結果: 1. 編寫演算法,判斷一表達式中的括號是否配對,包括大、中、小三類括號。 連結串列版本: #include <cstdio> #include <cmath> #inclu

學習C語言指標和連結串列的體會

題目:C語言指標和連結串列 一、指標    什麼是指標?什麼是記憶體地址?什麼叫做指標的取值?指標是一個儲存計算機記憶體地址的變數。從指標指向的記憶體讀取資料稱作指標的取值。指標可以指向某些具體型別的變數地址,例如int、long和double。指標也可以是void型

socket例項C語言一個簡單的聊天程式

我們老師讓寫一個簡單的聊天軟體,並且實現不同機子之間的通訊,我用的是SOCKET程式設計。不廢話多說了,先附上程式碼: 伺服器端server.c #include <stdio.h> #include <stdlib.h> #include

C語言簡單運用連結串列實驗程式碼

實驗一 (創新性)利用指標實現小學生數學四則運算小軟體 1.實驗內容 利用函式指標、指標函式、陣列指標以及指標陣列完成小學生數學四則運算小軟體,具體要求如下: 1)要具有自動批改功能。 2)要具有統計已完成題目數量和正確率功能。 3)要具有錯題記錄和回放功能。 4)參與運算的資料範圍可以由使

C語言訪問一個連結

示例程式碼1: # include <Windows.h> int main(){ system("start http://""www.baidu.com"); return 0; } 示例程式碼: # include <stdio.h>

C語言用單鏈表實現輸入排序

純當練習 連結串列頭結點儲存的資訊是連結串列長度 平臺VS2015 #include<stdio.h> #include<stdlib.h> #include<time.h> struct ListNod

C語言資料結構----連結串列(靜態連結串列

看了老唐的靜態連結串列,越發的覺得自己是菜鳥了,因為看的過程實在是太糾結了。下面就把自己看老唐靜態連結串列的內容寫下來。 一、靜態連結串列的基礎知識 1.單鏈表的缺陷:單鏈表的實現嚴重依賴指標,每一個數據元素都要有額外的指標域。 2.在靜態表中我們把資料元素放在一個數組裡,

C語言用遞迴實現將輸入的整數按逆序輸出。如輸入12345,則輸出54321。

這個程式是我對建構函式有個更深的認識。 首先建構函式要先從頭至尾走一邊才會輸出,無論輸出語句加的位置(迴圈內,條件語句內...除外)。 然後建構函式遞迴可以把問題簡單化,本題如果按常規思路,應該是做個迴圈,把各個數首尾交換。但是用呼叫使得其可以一次輸出一位數,而並不是輸出一個