❶ 關於數據結構c語言版的習題問題
樹是一種重要的非線性數據結構,直觀地看,它是數據元素(在樹中稱為結點)按分支關系組織起來的結構,很象自然界中的樹那樣。樹結構在客觀世界中廣泛存在,如人類社會的族譜和各種社會組織機構都可用樹形象表示。樹在計算機領域中也得到廣泛應用,如在編譯源程序如下時,可用樹表示源源程序如下的語法結構。又如在資料庫系統中,樹型結構也是信息的重要組織形式之一。一切具有層次關系的問題都可用樹來描述。一、樹的概述樹結構的特點是:它的每一個結點都可以有不止一個直接後繼,除根結點外的所有結點都有且只有一個直接前趨。以下具體地給出樹的定義及樹的數據結構表示。(一)樹的定義樹是由一個或多個結點組成的有限集合,其中: ⒈必有一個特定的稱為根(ROOT)的結點;
⒉剩下的結點被分成n>=0個互不相交的集合T1、T2、......Tn,而且, 這些集合的每一個又都是樹。樹T1、T2、......Tn被稱作根的子樹(Subtree)。
樹的遞歸定義如下:(1)至少有一個結點(稱為根)(2)其它是互不相交的子樹
1.樹的度——也即是寬度,簡單地說,就是結點的分支數。以組成該樹各結點中最大的度作為該樹的度,如上圖的樹,其度為3;樹中度為零的結點稱為葉結點或終端結點。樹中度不為零的結點稱為分枝結點或非終端結點。除根結點外的分枝結點統稱為內部結點。
2.樹的深度——組成該樹各結點的最大層次,如上圖,其深度為4;
3.森林——指若干棵互不相交的樹的集合,如上圖,去掉根結點A,其原來的二棵子樹T1、T2、T3的集合{T1,T2,T3}就為森林;
4.有序樹——指樹中同層結點從左到右有次序排列,它們之間的次序不能互換,這樣的樹稱為有序樹,否則稱為無序樹。
5.樹的表示
樹的表示方法有許多,常用的方法是用括弧:先將根結點放入一對圓括弧中,然後把它的子樹由左至右的順序放入括弧中,而對子樹也採用同樣的方法處理;同層子樹與它的根結點用圓括弧括起來,同層子樹之間用逗號隔開,最後用閉括弧括起來。如上圖可寫成如下形式:
(A(B(E(K,L),F),C(G),D(H(M),I,J)))
二叉樹
1.二叉樹的基本形態:
二叉樹也是遞歸定義的,其結點有左右子樹之分,邏輯上二叉樹有五種基本形態:
(1)空二叉樹——(a);
(2)只有一個根結點的二叉樹——(b);
(3)右子樹為空的二叉樹——(c);
(4)左子樹為空的二叉樹——(d);
(5)完全二叉樹——(e)
注意:盡管二叉樹與樹有許多相似之處,但二叉樹不是樹的特殊情形。
2.兩個重要的概念:
(1)完全二叉樹——只有最下面的兩層結點度小於2,並且最下面一層的結點都集中在該層最左邊的若干位置的二叉樹;
(2)滿二叉樹——除了葉結點外每一個結點都有左右子女且葉結點都處在最底層的二叉樹,。
3.二叉樹的性質
(1) 在二叉樹中,第i層的結點總數不超過2^(i-1);
(2) 深度為h的二叉樹最多有2h-1個結點(h>=1),最少有h個結點;
(3) 對於任意一棵二叉樹,如果其葉結點數為N0,而度數為2的結點總數為N2,
則N0=N2+1;
(4) 具有n個結點的完全二叉樹的深度為int(log2n)+1
(5)有N個結點的完全二叉樹各結點如果用順序方式存儲,則結點之間有如下關系:
若I為結點編號則 如果I<>1,則其父結點的編號為I/2;
如果2*I<=N,則其左兒子(即左子樹的根結點)的編號為2*I;若2*I>N,則無左兒子;
如果2*I+1<=N,則其右兒子的結點編號為2*I+1;若2*I+1>N,則無右兒子。
4.二叉樹的存儲結構:
(1)順序存儲方式
type node=record
data:datatype
l,r:integer;
end;
var tr:array[1..n] of node;
(2)鏈表存儲方式,如:
type btree=^node;
node=record
data:datatye;
lchild,rchild:btree;
end;
5.普通樹轉換成二叉樹:凡是兄弟就用線連起來,然後去掉父親到兒子的連線,只留下父母到其第一個子女的連線。
//////////////////////////////////////////////////////
2.
基於順序結構的順序查找演算法
(1)類型說明
typedef struct{
KeyType key;
InfoType otherinfo; //此類型依賴於應用
}NodeType;
typedef NodeType SeqList[n+1]; //0號單元用作哨兵
(2)具體演算法
int SeqSearch(Seqlist R,KeyType K)
{ //在順序表R[1..n]中順序查找關鍵字為K的結點,
//成功時返回找到的結點位置,失敗時返回0
int i;
R[0].key=K; //設置哨兵
for(i=n;R[i].key!=K;i--); //從表後往前找
return i; //若i為0,表示查找失敗,否則R[i]是要找的結點
} //SeqSearch
❷ c語言編程 數據結構題
(⊙o⊙)…我昨天看到了,寫完代碼之後找不到問題了
。一會兒回去把代碼貼上來。
給你參考參考:
/*
*Filename:main.c
*/
#include<stdio.h>
#include"queue.h"
intmain(void){
inti;
queueque;
/*
*創建一個大小為10的隊列,對隊列進行入隊,出隊操作
*/
que=create_queue(10);
for(i=0;i<10;i++){
in_queue(que,i);
}
for(i=0;i<5;i++){
printf("%d ",out_queue(que));
}
printf(" 隊列是否為空?");
if(is_empty(que)){
printf("TRUE ");
}else{
printf("FALSE 將隊列置空 ");
set_queue_empty(que);
}
if(is_empty(que)){
printf("隊列為空 ");
}
free_queue(que);
return0;
}
/*
*Filename:queue.c
*/
#include"queue.h"
#include<stdlib.h>
/*
*創建大小為size的循環隊列
*/
queuecreate_queue(size_tsize){
q_valuetemp=NULL;
queueque=NULL;
/*
*創建隊列指針
*/
que=(queue)malloc(sizeof(struct_queue));
que->size=size;
/*
*創建隊列值,初始化為-1
*/
que->rear=(q_value)malloc(sizeof(struct_que_value));
que->rear->value=-1;
temp=que->rear;
while(--size){
que->front=(q_value)malloc(sizeof(struct_que_value));
que->front->next=temp;
que->front->value=-1;
temp=que->front;
}
/*
*頭尾相連成為循環隊列
*/
que->rear->next=que->front;
que->rear=que->front;
returnque;
}
/*
*將隊列設置為空
*/
voidset_queue_empty(queueque){
while(que->front!=que->rear){
que->rear->value=-1;
que->rear=que->rear->next;
}
que->front->value=-1;
que->front=que->rear;
}
/*
*判斷隊列是否為空
*/
_boolis_empty(queueque){
if(que->front==que->rear&&
que->front->value==-1)
returnTRUE;
returnFALSE;
}
/*
*判斷隊列是否為滿了
*/
_boolis_full(queueque){
if(que->front==que->rear&&
que->front->value!=-1)
returnTRUE;
returnFALSE;
}
/*
*出隊,出隊之後的位置用-1標記
*/
intout_queue(queueque){
intvalue=que->rear->value;
/*
*如果隊列為空則返回-1
*/
/*
if(is_empty(que)){
printf("隊列為空 ");
return-1;
}
*/
que->rear->value=-1;
que->rear=que->rear->next;
returnvalue;
}
/*
*入隊
*/
voidin_queue(queueque,intvalue){
/*
*如果隊列滿則不能入隊
*/
/*
if(is_full(que)){
printf("隊列已滿 ");
return;
}
*/
que->front->value=value;
que->front=que->front->next;
}
/*
*釋放隊列
*/
voidfree_queue(queueque){
q_valuetemp=que->front->next;
while((que->size)--){
free(que->front);
que->front=temp;
temp=temp->next;
}
free(que);
}
/*
*Filename:queue.h
*/
#ifndef_QUEUE_H_
#define_QUEUE_H_
#include<stdio.h>
typedefint_bool;
#defineFALSE(0)
#defineTRUE(1)
typedefstruct_que_value*q_value;
typedefstruct_queue*queue;
struct_que_value{
intvalue;
q_valuenext;
};
struct_queue{
size_tsize;
q_valuefront;
q_valuerear;
};
queuecreate_queue(size_tsize);
voidfree_queue(queueque);
voidset_queue_empty(queueque);
_boolis_empty(queueque);
_boolis_full(queueque);
voidin_queue(queueque,intvalue);
intout_queue(queueque);
#endif
❸ 一個大二的數據結構C語言的實驗題
就一個棧+一個隊列。
停車場就是一個棧,先進後出,
中間的車出棧的話讓其前面的車依次入到另一個臨時棧,這個要出去的車出棧後,再把另一個臨時棧的元素依次入到這個停車場的棧。
等待入停車場的車是一個隊列。先進先出(有車來添加到隊列尾部,停車場的棧有空位,從隊列頭部取)。
下面是停車場的類定義
struct NODE
{
unsigned int CarID;
unsigned int EnterTime;
};
class CCarStation
{
public:
CCarStation(int size)
:
m_Size(size){}
void CheckStation()//檢查棧中有空位 從queue中取一個car,構造一個NODE 加入棧,
{
if (m_station.size() < m_Size && m_waitCar.size() > 0)
{
NODE* carInfo = new NODE;
carInfo->CarID = m_waitCar.front();
carInfo->EnterTime = time(NULL);
m_station.push(carInfo);
m_waitCar.pop();
}
}
bool EnterStation(int CarID)
{
m_waitCar.push(CarID);
CheckStation();
}
void LeaveStation(int CarID)
{
stack<NODE*> temp;
while (!m_station.empty())
{
NODE* carInfo = m_station.top();
m_station.pop();
if (carInfo->CarID == CarID)
{
//根據時長,在這里收費。
int stayedTime = time(NULL) - carInfo->EnterTime;
delete carInfo;
}
else
{
temp.push(carInfo);
}
}
while (!temp.empty())
{
m_station.push(temp.top());
temp.pop();
}
CheckStation();
}
private:
int m_Size;
stack<NODE*> m_station;
queue<int> m_waitCar;
CCarStation(){};
};
❹ 數據結構的一些題目(C語言)
1.
int lenth(LNode * head)
{
LNode *p;
int i
p=head;
while(p)
{
++i;
p=p->next;
}
return i;
}
2.
int max(LNode * head)
{
LNode *p;
LNode *q;
elemtype maxelem;//具體的數據類型我不知道,所以用了elemtype
p=head;
maxelem=p->data;
while(p)
{
p=p->next;
if(p->data > maxekem)
{
maxelem=p->data;
q=p; /*將最大的位置記錄下來*/
}
p=head;
while(p!=q)
{
p=p->next;
++i; /*找到最大值的位子,並記錄是第幾個節點*/
}
return i; /*在一個函數中只能有一個返回值,最大值你可以列印出來,這里我就不寫了*/
}
}
3、
int inset_after(LNode *head,x,y)
{
LNode *p;
LNode *q;
p=head;
while(p && p->data!=x)
p=p->next;
if(!p) return 0;//沒有找到
q=(LNode *)malloc(sizeof(LNode))
q->data=y;
q->next=p->next;
p->next=q;
return 1;//找到
}
4、int merge(LNode *L)
{
LNode *p;
LNode *q;
int i;
q=L;
p=create();
p->next=p->next->next;//去除頭結點
i=5
while(q && i<0) //如果要插入的帶頭結點的鏈表的話,是i<=0
{ q=q->next;
i--;
}
if(!p) return 0;//要插入的鏈表的結點數小於5,退出,返回0
}
❺ 數據結構的習題(C語言版)
第一個問題,分析下要求,可以知道要做的事情是合並兩個數組到一個數組里去,數組C的長度是AB之和。表C的第一個字元不是A的第一個字元就是B的第一個字元。因此接下來要做的事情就是做一個長度為AB之和的循環,每一次找出A或B中的最小元素,存到C裡面去,循環結束,C就自動有了。
第二個問題,有時間和空間的要求,不太容易,只有更好,沒有最好。不過提供一個思路。可以首先掃描整個數列,將奇數偶數的位置和個數標注出來,存在一個數列中。例如數列奇 奇 偶 奇 奇,可以得到奇數個數為4,位置為[0,1,3,4],偶數為1,位置為[2],因此要生成的數列中前4個必定為奇數,而題目中沒有對大小的要求,因此只用將偶數與最後面的奇數對換位置即可。對換的次數即為偶數的個數。
大概思路如此,不過有很多方法可以高效的存儲和計算,具體實現,希望你能親自琢磨下,還可以鞏固一下C技巧。
祝好,有問題可以探討。
❻ 關於數據結構(C語言)的幾個題
1.
voidconverse(intn,intd){
SqStackS;//新建一個棧
InitStack(S);//初始化棧
intk,e;
while(n>0){
k=n%d;
push(S,k);
n=n/d;
}//將余數進棧
while(S.top!=S.base){
pop(S,e);
printf("%1d",e);
}//輸出結果
}
8.
先序遍歷:ABCDEF
中序遍歷:BCDAFE
後序遍歷:DCBFEA
❼ 數據結構(C語言版)的題
1)在P結點後插入S結點的語句序列是:(4),(1)
2)在P結點前插入S結點的語句序列是:(7),(8),(1),(4)
3)在表首插入S結點的語句序列是:(5)
4)在表尾插入S結點的語句序列是:(9)(1)(6)
❽ C語言數據結構題
基礎定義
如果需要PPT講解,私信我
❾ 求助數據結構題用C語言做
1: 因為要刪除那些即在B表又在C表中的元素,所以A,B,C三個表中都會有這個元素。那麼用指針遍歷A表,用另外兩個指針遍歷B,C。查找B,C中同A的元素,因為3個表都是有序的,可以採用些簡單的比較。找到後刪除。
2:void AE(stack &s)
{
int stack (s); //得到傳遞過來的棧
push(s,3); // 3進棧
push(s,4); // 4進棧
int x=pop(s)+2*pop(s); // x = 3 + 2 * 4
push(s,x); // x 進棧
int a[5]={2,5,8,22,15};
for(j=0;j<5;j++)
push(s,a[i]) // A數組進棧
while(!stackempty(s)) // 直到棧空
printf("%d",2*pop(s)); //輸出 2*棧中每個元素
結果自己想了。