連結串列,樹,順序表操縱

寫程式碼的小哥哥發表於2020-12-23
//
//  main.c
//  2020專業課
//
//  Created by cj on 2020/11/16.
//  Copyright © 2020 cj. All rights reserved.
//

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#define MaxSize 10
typedef struct{
    int data[MaxSize];
    int length;
}SqNode,*SqList;

typedef struct LNode{
    int data;
    struct LNode * next;
}LNode,*LinkList;

typedef struct Node{
    char data;
    struct Node * lchild;
    struct Node * rchild;
}Node,*Tree;

//初始化單連結串列
LinkList InitSqLink(){
    LNode *rear,*L;
    LNode *pnew;
    L=(LinkList)malloc(sizeof(LNode));
    rear=L;
    for(int i=1;i<4;i++){
        pnew=(LNode *)malloc(sizeof(LNode));
        printf("請輸入第%d個節點的值:",i);
        int x;
        scanf("%d",&x);
        pnew->data=x;
        rear->next=pnew;
        rear=pnew;
    }
    rear->next=NULL;
    return L;
}
//初始化順序表
SqList InitSqList(SqList L){
    
    L=(SqList)malloc(sizeof(SqNode));
    
    for (int i=0; i<4; i++) {
        int x;
        printf("請輸入第%d個值:",i+1);
        scanf("%d",&x);
        L->data[i]=x;
    }
    
    L->length=4;
    return L;
   
}

//迴圈單連結串列
void foreachLink(LNode *L){
    LNode *p=L->next;
    while(p!=NULL){
        printf("%d\t",p->data);
        p=p->next;
    }
    printf("\n");
}
//迴圈陣列
void foreachArr(SqNode *L){
    for (int i=0; i<L->length; i++) {
        printf("%d\t",L->data[i]);
    }
    printf("\n");
}
//刪除資料表中最小的一個元素,並把刪除元素用最後一個元素替代
void deleteMin(SqList L){
    
    int min=L->data[0],pos=0;
    for (int i=0; i<L->length; i++) {
        if(min>L->data[i]){
            min=L->data[i];
            pos=i;
        }
    }
    L->data[pos]=L->data[L->length-1];
   
}
//順序表中多少個最大節點數
int countMax(SqList L){
    int max=L->data[0],k=1;
    for(int i=0;i<L->length;i++){
        if(max<L->data[i]){
            k=1;
            max=L->data[i];
        }else{
            k++;
        }
    }
    return k;
}
//順序表刪除所有值為x的元素
void deleteX(SqList L,int x){
    int k=0;
    for (int i=0; i<L->length; i++) {
        if(L->data[i]==x){
            k++;
        }else{
            L->data[i-k]=L->data[i];
        }
    }
    L->length-=k;
}
//有序表刪除給定值s與t之間的元素
void deleteS_T(SqList L,int s,int x){
    int k=0;
    for (int i=0; i<L->length; i++) {
        if(L->data[i]>s && L->data[i]<x){
            k++;
        }else{
            L->data[i-k]=L->data[i];
        }
    }
    L->length-=k;
}

//連結串列刪除所有值為x的元素
void deleteXList(LinkList L,int x){
    LNode *p=L->next,*pre=L,*temp;
    while (p!=NULL) {
        if(p->data==x){
            temp=p;
            pre->next=p->next;
            free(p);
            p=p->next;
        }else{
            pre=p;
            p=p->next;
        }
    }
}
//單連結串列刪除s與t之間的數
void deleteS_TLink(LinkList L,int x,int t){
    LNode *p=L->next,*pre=L,*temp;
    while(p!=NULL){
        if(p->data>x && p->data<t){
            temp=p;
            pre->next=p->next;
            p=p->next;
            free(temp);
        }else{
            pre=p;
            p=p->next;
        }
    }
}
//有序連結串列刪除重複的元素
void deleteSameLink(LinkList L){
    LNode *p=L->next->next,*pre=L->next,*temp;
    while (p!=NULL) {
        if(pre->data==p->data){
            temp=p;
            pre->next=p->next;
            p=p->next;
            free(temp);
        }else{
            pre=p;
            p=p->next;
        }
    }
    
}
//單連結串列逆置
void reserve(LinkList L){
    LNode *p=L->next,*r;
    L->next=NULL;
    while (p!=NULL) {
        r=p->next;
        p->next=L->next;
        L->next=p;
        p=r;
    }
}
//兩個遞增的單連結串列合併,成一個遞減的
void merge(LinkList La,LinkList Lb){
    LNode *r,*pa=La->next,*pb=Lb->next;
    La->next=NULL;
  
    while (pa && pb) {
        if(pa->data<pb->data){
            r=pa->next;
            pa->next=La->next;
            La->next=pa;
            pa=r;
        }else{
            r=pb->next;
            pb->next=La->next;
            La->next=pb;
            pb=r;
        }
    }
    if(pa){
        pb=pa;
    }
    while (pb) {
        r=pb->next;
        pb->next=La->next;
        La->next=pb;
        pb=r;
    }
}
//二叉樹的前序
void preforeach(Tree T){
    if(T){
        printf("%c\n",T->data);
        preforeach(T->lchild);
        preforeach(T->rchild);
    }
}
//中序
void orderforeach(Tree T){
    if(T){
        orderforeach(T->lchild);
        printf("%c\n",T->data);
        orderforeach(T->rchild);
    }
}
//統計葉子結點
int count(Tree T){
    if(T==NULL){
        return 0;
    }
    if(T->lchild==NULL && T->rchild==NULL){
        return 1;
    }else{
        return count(T->lchild)+count(T->rchild);
    }
}
//求樹的高度
int height(Tree T){
    int lheight,rheight;
    if(T==NULL){
        return 0;
    }else{
        lheight=height(T->lchild);
        rheight=height(T->rchild);
    }
    if(lheight>rheight){
        return lheight+1;
    }else{
        return rheight+1;
    }
}
//輸入兩個正整數 m,n,求其最大公約和最小公倍數
void find(){
    int m,n,temp,r,p;
       printf("請輸入兩個正整數:\n");
       scanf("%d%d",&m,&n);
       if(m<n){//把大數放在m中
           temp=m;m=n;n=temp;
       }
       r=m%n;
       p=m*n;//p存放兩者乘積,p除以最大公約數即為最小公倍數
       while(r!=0){//求兩者公約數
           
           m=n;n=r;r=m%n;
           
           printf("m:%d,n:%d,r:%d",m,n,r);
       }
       printf("最大公約數為:%d\n",n);
       printf("最小公倍數為:%d\n",p/n);
        
}
//4~100的偶數拆成兩個素數之和
int isPrime(int n){
    for (int i=2; i<=n/2; i++) {
        if(n%i==0){
            return 0;
        }
    }
    return 1;
}
void chai(){
    for (int i=4; i<100; i+=2) {
        for (int n=2; n<i;n++) {
            if(isPrime(n) && isPrime(i-n)){
                printf("%d=%d+%d\t",i,n,i-n);
                break;
            }
        }
    }
}
//一個燈塔有9層,共有1022燈,每一層的燈都是相鄰上層的兩倍,請按升序輸出每一層的燈
void deng(){
    int top,bottom;
    for(int i=1;i<=9;i++){
        
    }
}
//列印出一百以內的水仙花數
void xianhua(){
    int i,j,k,n;
     
    for(i=1;i<10;i++)
     for(j=0;j<10;j++)
      for(k=0;k<10;k++)
      {
       n=i*100+j*10+k;
       if((i*100+j*10+k)==((i*i*i)+(j*j*j)+(k*k*k)))
        printf("水仙花數為:%d\n",n);
      }
}
//字串轉換成浮點數
void strtofloat(){
   
}
//輸入一行字元,統計其中分別多少個單詞和空格
void wordkong(){
    char c[100];
    int word=0;
    
    gets(c);
    for (int i=0;c[i]!='\0'; i++) {
        if(c[i]==' '){
            word++;
        }
    }
    printf("單詞%d\n",word+1);
    printf("空格%d",word);
    puts(c);
}
 


int main() {
//    LNode *L=NULL,*Lb=NULL;
//    L=InitSqLink();
    
//    foreachLink(L);
//    deleteXList(L, 3);
//    deleteS_TLink(L, 2, 6);
//    foreachLink(L);
//    deleteSameLink(L);
//    foreachLink(L);
//    reserve(L);
//    foreachLink(L);
    
//    Lb=InitSqLink();
//
//    foreachLink(L);
//    foreachLink(Lb);
//     merge(L, Lb);
//    foreachLink(L);
//    foreachLink(L);
    
    
//    SqNode *arr=NULL;
//    arr=InitSqList(arr);
//
//    foreachArr(arr);
//
//    printf("%d",countMax(arr));
//    deleteMin(arr);
//    foreachArr(arr);
//    deleteX(arr, 9);
//    foreachArr(arr);
//    deleteS_T(arr, 2, 6);
//    foreachArr(arr);
    
//    Tree T=NULL,A,B,C,D;
//    T=(Node *)malloc(sizeof(Node));
//    A=(Node *)malloc(sizeof(Node));
//    B=(Node *)malloc(sizeof(Node));
//    C=(Node *)malloc(sizeof(Node));
//    D=(Node *)malloc(sizeof(Node));
//        T
//    A       B
//C       D
//    T->data='T';
//    A->data='A';
//    B->data='B';
//    C->data='C';
//    D->data='D';
//    T->lchild=A;
//    T->rchild=B;
//    A->lchild=C;
//    A->rchild=D;
//    C->lchild=NULL;
//    C->rchild=NULL;
//    D->lchild=NULL;
//    D->rchild=NULL;
//    B->lchild=NULL;
//    B->rchild=NULL;
//    preforeach(T);
//    orderforeach(T);
//    printf("%d",count(T));
//    printf("%d\n",height(T));
//    short b=65536;
//    printf("%d",b);
    
    
//    find();
//    chai();
//    xianhua();
    wordkong();
    return 0;
}

 

相關文章