1. c語言寫ADT的問題
參考c 模板
template,對代碼重用很有幫助,特別是那種演算法一樣,只是數據類型不同〔例如排序〕的代碼有很大的用處
2. 數據結構(C語言)單鏈表的問題
/*
這是結果,需要的話給我個地址
------------------------
***建立含有n個數據元素的帶頭結點的單鏈表***
請輸入n = 5
請輸入第1個元素:1
請輸入第2個元素:2
請輸入第3個元素:3
請輸入第4個元素:4
請輸入第5個元素:5
依次輸出該表中各元素的值:1 2 3 4 5
將單鏈表進行逆置運算:
依次輸出逆置後表中各元素的值:5 4 3 2 1
Press any key to continue
------------------------------
*/
3. c語言!!!程序設計:建立一個學生信息鏈表,包括學號,姓名,成績.(實現添加,刪除,查詢,排序,平均)
代碼如下:
/*用c語言鏈表編寫一個學生信息系統程序,要求輸出學生的學號,姓名,性別,學號,姓名,成績(實現添加,刪除,查詢,排序,平均)*/
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <stdlib.h>
using namespace std;
const int n=5;
/*
* nodeEntry : 節點數據類型
* nodeADT : 節點結構
* linkADT : 鏈表結構
*/
typedef struct Student
{
int num;
char name[30];
char sex;
float score1;//語文
float score2;//數學
float score3;//英語
//struct Student *next;
}Student;
typedef struct linkCDT {
nodeADT head;
}*linkADT;
/*
* InitLink : 初始化鏈表
* CreateNode : 創建節點
* AppendLink : 添加數據
*/
nodeADT CreateNode(Student entry) {
nodeADT p=(nodeADT)malloc(sizeof*p);
p->entry=entry,p->next=0;
return p;
}
/*
SortLink : 排序鏈表
//按學號排序
void SortLinkID(linkADT link) {
nodeADT pHead,pRear,p,tp;
if (!link) return;
for (pHead=link->head,pRear=0;pHead;pHead=pHead->next) {
for (tp=pHead,p=pHead->next;p;tp=p,p=p->next)
if (pHead->entry.num>=p->entry.num)
tp->next=p->next,p->next=pHead,pHead=p,p=tp;
if (!pRear) link->head=pHead;
else pRear->next=pHead;
pRear=pHead;
}
//按英語成績排序
void SortLinkEnglish(linkADT link) {
nodeADT pHead,pRear,p,tp;
if (!link) return;
for (pHead=link->head,pRear=0;pHead;pHead=pHead->next) {
for (tp=pHead,p=pHead->next;p;tp=p,p=p->next)
if (pHead->entry.score3>=p->entry.score3)
tp->next=p->next,p->next=pHead,pHead=p,p=tp;
if (!pRear) link->head=pHead;
else pRear->next=pHead;
pRear=pHead;
}
}
//按姓名的字典序進行排序
void SortLinkName(linkADT link) {
nodeADT pHead,pRear,p,tp;
if (!link) return;
for (pHead=link->head,pRear=0;pHead;pHead=pHead->next) {
for (tp=pHead,p=pHead->next;p;tp=p,p=p->next)
if (pHead->entry.name[0]>=p->entry.name[0])
tp->next=p->next,p->next=pHead,pHead=p,p=tp;
if (!pRear) link->head=pHead;
else pRear->next=pHead;
pRear=pHead;
}
}
//按姓名的長度進行排序
void SortLinkNameLength(linkADT link) {
nodeADT pHead,pRear,p,tp;
if (!link) return;
for (pHead=link->head,pRear=0;pHead;pHead=pHead->next) {
for (tp=pHead,p=pHead->next;p;tp=p,p=p->next)
if (strlen(pHead->entry.name)>=strlen(p->entry.name))
tp->next=p->next,p->next=pHead,pHead=p,p=tp;
if (!pRear) link->head=pHead;
else pRear->next=pHead;
pRear=pHead;
}
循環鏈表是與單鏈表一樣
是一種鏈式的存儲結構,所不同的是,循環鏈表的最後一個結點的指針是指向該循環鏈表的第一個結點或者表頭結點,從而構成一個環形的鏈。
循環鏈表的運算與單鏈表的運算基本一致。所不同的有以下幾點:
1、在建立一個循環鏈表時,必須使其最後一個結點的指針指向表頭結點,而不是象單鏈表那樣置為NULL。此種情況還使用於在最後一個結點後插入一個新的結點。
2、在判斷是否到表尾時,是判斷該結點鏈域的值是否是表頭結點,當鏈域值等於表頭指針時,說明已到表尾。而非象單鏈表那樣判斷鏈域值是否為NULL。
以上內容參考:網路-鏈表
4. C語言 ADT列表問題
你的目的:
我看了你的代碼,基本上了解你的意圖,就是建立單向鏈表,並循環往鏈表增加結構體。
你發生錯誤的原因:
先看看你的代碼為什麼在第二次增加節點出現錯誤吧,主要集中在ADDNODE函數內。
第一次 Item *b = (*p) 這個是等於NULL的,然後你再在堆中為 Item *c分配內存。並把a(你在main循環scanf的棧結構數據)指針賦值給c(注意,這里c分配的內存指針丟失,這是個嚴重的內存泄露)。然後你判斷b是否為NULL,第一次當然是NULL了,所以你把c(也就是把*p作為鏈表頭)賦值給*p(其實是錯誤的)。第一次scanf完成,其實繞了一大圈也就是完成Item **p 內的b=*p=c=&a;然後第二次就執行到了ADDNODE的 { while(b!=NULL) b=b->next;b=c; } 這段代碼,為什麼第二次出現錯誤,主要原因就在這里。因為這時b!=null 了,你開始b=b->next,b=c; 你仔細看下循環。因為你在第一次的時候b就相當於等於 &a(main 函數內的Item a),而(&a)->next 是不為NULL.是系統隨機分配的一個內存地址,在VC環境一般為0xcccccc.那麼b=b->next 這時b就是0xcccccc了,然後b=c,再次循環b又是0xcccccc,然後在b=c,然後b又被賦值0xcccccc......一直到永遠(一個大大的死循環)。
總結:
1、你對指針有嚴重的認識誤區
2、你對鏈表next節點增加指向下一個數據區域的指針模糊,你只知道理論。但不知道如何去實現它。
3、你的代碼有很多不太好的習慣。對數據不進行初始化、濫用指針、內存泄露、還有&a的數據被重復覆蓋(即使鏈表構件出來也是全部都是最後一次增加的那個節點的姓名和年齡數據)
4、Item **p 完成是多餘的聲明和操作,如果你對指向指針的指針不理解,請慎用。從你的代碼上來看,你還是不夠了解的。
5、你的代碼有容錯處理(比如在申請內存的時候),看來你是個嚴謹的人,這個值得提倡。
** 還有 你的代碼錯誤太多,無法給你修改 。如果真想實現,請聯系我吧。
5. C語言-ADT列表錯誤!
// new->item=*item; 注釋掉該行
new->next = NULL; //增加這一行 (1)
p->next = NULL; //增加這一行 ,必須設置為null,否則(2)處永遠死循環
if(ls->next==NULL)
p->next=new; //因為有 (1) 把next指針設為NULL,所以你下次循環到尾節點增加新節點才有循環到NULL的保證。
else
{
while(ls->next!=NULL) (2)
ls=ls->next;
ls->next=new;
}
*這只能解決你在第二次或N次增加鏈表的問題。
還有你實現單向鏈表的想法是 從頭節點循環至尾節點把尾節點找到,再在尾節點的next指針上增加新節點(new節點)。這點不好,因為隨著你的鏈表數據的增多,你每次都要循環至尾節點加新的節點。這是個效率較低的方法。
你的程序代碼還有其他多處問題。我今天比較忙,有時間再根據你的思路,寫段代碼給你。你就會明白。
6. 數據結構——C語言:求解題目:為字元串定義一個ADT,要求包含常見的字元串運算,每個運算定義成一個函數。
用C++比較簡單。直接重載一下操作符就可以了。
7. c primer plus中講的adt不太懂 c語言高手幫忙
ADT那一章應該是學完前面的所有東西之後才能看的,如果是挑著看,或許會有疏漏,看起ADT來會有些吃力
視頻教程很難找,因為這涉及到數據結構,如果是在網上找數據結構的教程的話,找到的應該難度都很大,所以我建議你先把書看懂,畢竟那是入門,c primer我看過,那一章其實就是代碼有點長罷了,難度並不算大
精通C語言要多上機操作,多寫代碼,多讀代碼,可以自己找一些生活中的問題,用C加以解決,這樣也可以鍛煉水平
學C語言的時間因人而異,而且看你到底要往哪個方面發展,如果往單片機或系統底層發展,那就需要非常精通才行。如果往桌面軟體方向發展,可以轉去學c++(當然,java,c#之類的都是可以的),那樣C不需要太精通,語法都弄懂就好了。
8. 為二維數組定義一個ADT,詳細而准確地說明可以在此數組上完成的操作,請編程高手解決。
數組實際上就是一組相同數據類型變數。如果一個數組中的一個變數也是一個數組,就構成了二維數組。用同樣的方法可以構成多維數組。在使用數組以前需要定義一個數組。可以用一個實例來理解數組。假設在一個程序中要存儲100個人的年齡,可以寫成下面代碼來定義100個整型變數。#include void main()for(i=0;i<=9;i++)}在c語言中,函數是程序的基本組成單位,因此可以很方便地用函數作為程序模塊來實現c語言程序。利用函數,不僅可以實現程序的模塊化,程序設計得簡單和直觀,提高了程序的易讀性和可維護性,而且還可以把程序中普通用到的一些計算或操作編成通用的函數,以供隨時調用,這樣可以大大地減輕程序員的代碼工作量。函數是c語言的基本構件,是所有程序活動的舞台。例如:printf,scanf,getch,putch,fopen等都是C語言裡面的函數指針是指向內存單元的地址.不同類型的指針指向不同類型的地質單元。如:int a; a=100; 這樣就把整型常量賦給了變數a。但是如果寫成這樣:a=123.33;就會出問題,最後輸出變數a的值結果是123。現在說到指針,其實地址值也是一個整型數,如某某變數的地址值為36542,說明這個變數被分配在內存地址值為36542的地方。能不能這樣進行推理,既然地址值也是整型數,整型變數正好可以用來存放整型數,那不是一個整型變數可以用來存放地址的值嗎。程序寫成下面這樣: int a,b; a=&b; 很明顯,這樣寫是錯誤的。原因在於不能簡單地把地址理解為整型數。 應有這樣的對應關系: 地址值<--->指針; 整型數<--->int 型變數。 所以有這樣的說法:「指針就是地址」(指針就是存放地址值的一種數據類型) 下面是一段正確的程序: int a,*p; p=&a; /*把變數a的地址值賦給指針p*/ 答案補充 指針是指向內存單元的地址.不同類型的指針指向不同類型的地質單元。是所指數據類型的地址!指針可以指向數據,也可以指向函數等!
如果幫助到您,請記得採納為滿意答案哈,謝謝!祝您生活愉快! vae.la