連結串列,樹,順序表操縱
//
// 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;
}
相關文章
- 【資料結構與演算法學習】線性表(順序表、單連結串列、雙向連結串列、迴圈連結串列)資料結構演算法
- 資料結構實驗之連結串列一:順序建立連結串列資料結構
- 資料結構練習題(順序表和單連結串列)C++資料結構C++
- 《演算法筆記二》連結串列、棧、佇列、遞迴、雜湊表、順序表演算法筆記佇列遞迴
- 建立和操縱表
- 單連結串列基本介紹以及按照順序插入節點
- 資料結構篇_程式設計思想板塊_第一章順序表和連結串列資料結構程式設計
- 反轉連結串列、合併連結串列、樹的子結構
- Android技能樹 — 陣列,連結串列,雜湊表基礎小結Android陣列
- 順序表
- 線性表——連結串列
- 資料結構 - 線性表 - 順序表資料結構
- Hash連結串列轉換為紅黑樹,和樹轉換為連結串列的條件
- 順序表應用5:有序順序表歸併
- 順序表應用6:有序順序表查詢
- 考研資料結構-線性表-順序表資料結構
- 靜態連結動態連結的連結順序問題和makefile示例
- 線性表之順序儲存結構
- 順序結構
- 連結串列-迴圈連結串列
- 連結串列-雙向連結串列
- 連結串列 - 單向連結串列
- [連結串列】2.輸入一個連結串列,反轉連結串列後,輸出新連結串列的表頭。[多益,位元組考過]
- 第2章 順序表及其順序儲存
- 二叉樹遍歷順序與方法小結二叉樹
- CSS 連結偽類選擇器順序原理CSS
- 二叉樹展開為連結串列二叉樹
- 資料結構-線性表、連結串列資料結構
- 連結串列4: 迴圈連結串列
- 連結串列-單連結串列實現
- 連結串列-雙向通用連結串列
- 查詢列表連結串列加排序 每次重新整理順序都不同是什麼情況?排序
- 11 線性表的順序儲存結構
- 【資料結構】線性表-單連結串列資料結構
- 連結串列-雙向非通用連結串列
- 【LeetCode】->連結串列->通向連結串列自由之路LeetCode
- 連結串列入門與插入連結串列
- Leetcode_86_分割連結串列_連結串列LeetCode