2008年6月28日 星期六

Linked list

請使用動態記憶體配置與Linked list,撰寫一程式,可以讓使用者逐一輸入各學生的姓名與成績(int),並依成績高低由高到低排好節點串接的順序。並可印出所有學生的成績,以及查詢某一位學生的成績。

(optional): 試試讓該Linked list反轉,該如何做?

========================================================
拙著,請指教......
// 使用動態記憶體配置與linked list 撰寫程是讓使用者逐一輸入學生姓名,
// 成績,並依成績高低由高至低排好結點串接的順序,並可印出學生成績,
// 以及查詢某位學生成績
#include
#include


typedef struct TagStudent
{
char name[30];
int grade;
struct TagStudent *next;
}Student;

void InsertStudent(char newname[30],int newgrade);
int StudentCount();
void StudentPrint();
void StudentSearch(char search[]);

Student Head,*ptr=&Head,*current,*previous;


int main(int argc, char *argv[])
{
char ch,Newname[10],SearchName[10];
int Newgrade;

puts("學生成績查詢及輸入系統(停止輸入請按q或Q)\n");
while(1) //當按下不是 Ctrl+q 時
{
printf("請輸入學生姓名:");
scanf("%s",Newname);
if(!stricmp(Newname,"q")) break;
printf("請輸入成績:");
scanf("%d",&Newgrade);
InsertStudent(Newname,Newgrade);
}
puts("輸入結束!!");
printf("共有%d個學生\n",StudentCount());
StudentPrint();
printf("\n請輸入欲查詢學生姓名:");
scanf("%s",SearchName);
StudentSearch(SearchName);
system("PAUSE");
return 0;
}

void StudentSearch(char search[])
{
Student *p=ptr->next;
while(p!=NULL)
{
if(!strcmp(search,p->name))
printf("%s 成績:%d\n",p->name,p->grade);
p=p->next;
}
}
void StudentPrint()
{
Student *p = ptr->next;
while(p!=NULL)
{
printf("姓名:%s \t 分數:%d\n",p->name, p->grade);
p = p->next;
}
}

int StudentCount()
{
int count=0;
Student *p = ptr->next;
while(p!=NULL)
{
count++;
p = p->next;
}
return count;

}
void InsertStudent(char newname[],int newgrade)
{
Student *NewNode;
NewNode=(Student*)malloc(sizeof(Student));
if(NewNode == NULL)
puts("malloc Fail!!");

strcpy(NewNode->name ,newname);
NewNode->grade = newgrade;
NewNode->next=NULL;

if(StudentCount()==0)
{
NewNode->next = ptr->next;
ptr->next = NewNode;
}else
{
previous = ptr;
current = ptr->next;

while(current->grade > NewNode->grade)
{
previous = current;
if (current->next != NULL)
current=current->next;
else
goto END;
}
NewNode->next = current;
END:
previous->next = NewNode;
}

}

2008年7月 課表

年月:2008年7月 課表

<< 依班級:SI502 >>

製成時間:2008/7/1上午 01:40:04

星期
週別
星期一 星期二 星期三 星期四 星期五 星期六 星期日

1

6/30
 
 
 
7/1
陳衍華
    TCP/IP
    310
7/2
黃馨瑧
    DS
    310
7/3
蔡宜璋
    嵌入式處理器架構
    310
7/4
李志賢
    OS
    310
7/5
鄧淇文
    驅動程式
    310
7/6
鄧淇文
    驅動程式
    310

 
 
 
李志賢
    OS
    310
李志賢
黃馨瑧 專題
孫文駿 106
蔡宜璋
    嵌入式處理器架構
    310
黃馨瑧
 程式設計(C/C++)
    310
鄧淇文
    驅動程式
    310
鄧淇文
    驅動程式
    310

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

2

7/7
 
 
 
7/8
李俊傑
    Socket程式
    310
7/9
黃馨瑧
 程式設計(C/C++)
    310
7/10
黃馨瑧
 程式設計(C/C++)
    310
7/11
李俊傑
    Socket程式
    310
7/12
蔡宜璋
    嵌入式處理器架構
    310
7/13
鄧淇文
    驅動程式
    310

 
 
 
李志賢
    OS
    310
 
 
 
李志賢
    OS
    310
黃馨瑧
 程式設計(C/C++)
    310
蔡宜璋
    嵌入式處理器架構
    310
鄧淇文
    驅動程式
    310

 
 
 
 
 
 
孫文駿
    Linux程式設計
    310
 
 
 
 
 
 
 
 
 
 
 
 

3

7/14
 
 
 
7/15
 
 
 
7/16
孫文駿
    Linux程式設計
    310
7/17
李俊傑
    Socket程式
    310
7/18
 
    專題觀摩
    310
7/19
蔡宜璋
    嵌入式作業系統
    310
7/20
鄧淇文
    驅動程式
    310

 
 
 
李俊傑
    Socket程式
    310
黃馨瑧
 程式設計(C/C++)
    310
黃馨瑧
    DS
    310
李志賢
    OS
    310
蔡宜璋
    嵌入式作業系統
    310
鄧淇文
    驅動程式
    310

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

4

7/21
 
 
 
7/22
 
 
 
7/23
李俊傑
    Socket程式
    310
7/24
李俊傑
    Socket程式
    310
7/25
李志賢
    OS
    310
7/26
蔡宜璋
    嵌入式作業系統
    310
7/27
鄧淇文
    驅動程式
    310

 
 
 
黃馨瑧
 程式設計(C/C++)
    310
李志賢
    OS
    310
李志賢
黃馨瑧 專題
孫文駿 310
黃馨瑧
    DS
    310
蔡宜璋
    嵌入式作業系統
    310
鄧淇文
    驅動程式
    310

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

5

7/28
 
 
 
7/29
 
 
 
7/30
李俊傑
    Socket程式
    310
7/31
黃馨瑧
    DS
    310
8/1
李俊傑
    Socket程式
    310
8/2
陳裕生
 嵌入式Linux系統
    310
8/3
鄧淇文
    嵌入式作業系統
    310

 
 
 
 
 
 
李志賢
    OS
    310
李志賢
黃馨瑧 專題
孫文駿 106
李志賢
    OS
    310
陳裕生
 嵌入式Linux系統
    310
鄧淇文
    嵌入式作業系統
    310

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

2008年6月13日 星期五

03.堆疊與佇列( Stack and Queue )

上課內容精要!!

3.1 堆疊和佇列基本觀念

堆疊(Stack)

加入(push)與刪除(pop)於同一端。後進先出(LIFO)

例子:堆積木、蓋房子

佇列(Queue)

加入與刪除於不同端(front & rear)。先進先出(FIFO)

例子:排隊買票、坐公車

3.2 堆疊的加入與刪除

3.2.1 堆疊加入函數(top的初始值為-1)

3.2.2 堆疊刪除函數

3.3 佇列的加入與刪除

3.3.1 佇列加入函數(frontrear的初始值分別為0-1)

3.3.2 佇列刪除函數

[ 問題 ] 佇列前端還有空位,但要加入元素卻發現此佇列已滿

[ 解決方式 ] 環狀佇列

3.3.3 環狀佇列加入函數(frontrear的初始值均為MAX-1)

3.3.4 環狀佇列刪除函數

3.4 堆疊與佇列的應用

堆疊的應用 :副程式的呼叫 (subroutine calls)

中序表示式 後序表示式

佇列的應用 作業系統的工作安排(job scheduling)

中序表示式 :「運算子」(operator)置於「運算元」(operand)的中間

Ex A*B / C

後序表示式 :「運算子」置於「運算元」的後面

ExAB * C /

3.5 如何計算後序表示式

利用<運算元堆疊法>

3.6 老掉牙的應用問題

數獨遊戲 (個人經常給學生玩的數獨網站) http://oddest.nc.hcc.edu.tw/sumain.htm

Algorithm Gossip: 八個皇后

老鼠走迷官(一)

河內塔

(以上三個連結取自 良葛格學習筆記 - 困在技術撰稿人身體裡的小說家)