當前位置:首頁 » 密碼管理 » 鏈表如何訪問

鏈表如何訪問

發布時間: 2022-09-25 07:47:24

㈠ 鏈表的操作(鏈表的建立,訪問,刪除鏈表指定結點,增加結點)

/*這個是我剛才寫的,那個問題結果找不到了,給你吧*/#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "conio.h"
#define N 3
#define MAX 12
#define OK 1
#define ERROR 0
#define FALSE 0
#define TRUE 1
#define OVERFLOW -2
#define FILE_PATH_NAME "c:\\student"
typedef int Status;
FILE *fp;
typedef struct stu
{
char num[MAX];
char name[MAX];
int score[N];
int total;
int average;
}ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
LinkList L;//保存成績的鏈表
int count=0;//所有人數
int TAB=FALSE;
Status ListInit(LinkList *L)
{
*L=(LinkList)malloc(sizeof(LNode));
if(!*L)exit(OVERFLOW);
(*L)->next=NULL;
return OK;
}
Status InsertByTotal(LinkList L,ElemType e)
{
LinkList p,q;
p=L;q=L->next;
while(q&&q->data.total<e.total)
{
p=q;
q=q->next;
}
p->next=(LinkList)malloc(sizeof(LNode));
p->next->data=e;
p->next->next=q;
return OK;
}
void ListTraverse(LinkList L,void(*vi)(ElemType))
{
LinkList p=L->next;
while(p)
{
vi(p->data);
p=p->next;
}
}
Status FindNum(LinkList L,char num[],LinkList *p,LinkList *q)
{
*p=L;
*q=L->next;
while(*q)
{
if(!strcmp((*q)->data.num,num))
return OK;
*p=*q;
*q=(*q)->next;
}
return FALSE;
}
Status ReadFromFile(ElemType *e)
{
int i;
i=fread(e,sizeof(ElemType),1,fp);
if(i==1)return OK;
return ERROR;
}
void WriteToFile(ElemType e)
{
fwrite(&e,sizeof(ElemType),1,fp);
}
void BuildFile()
{
char key;
if((fp=fopen(FILE_PATH_NAME,"r"))==NULL)
{
printf("文件打開失敗!\n是否建立新文件?Y/N ");
key=getchar();
if(key=='Y'||key=='y')
{
fp=fopen(FILE_PATH_NAME,"w");
if(fp)
{
printf("文件成功建立!\n");
fclose(fp);
printf("請按任意鍵繼續...");
fflush(stdin);
getch();
system("cls");
}
}
else
{
printf("感謝使用!\n");
exit(0);
}
}
}
void cls()
{
printf("請按任意鍵繼續...");
fflush(stdin);
getch();
system("cls");
}
void Menu()
{
printf("\t\t\t**********************\n");
printf("\t\t\t*----學生成績管理----*\n");
printf("\t\t\t**********************\n");
}
void ReadIn(LinkList L)
{
int i,n;
ElemType e;
LinkList p,q;
system("cls");
Menu();
printf("本次錄入學生人數:");
scanf("%d",&n);
if(n==0)
{
cls();
return;
}
for(i=1;i<=n;++i,++count)
{
printf("請輸入第%d位學生信息:\n",i);
printf("學號:");
scanf("%s",e.num);
if(FindNum(L,e.num,&p,&q))
{
printf("該學號已經存在,請確認重新輸入\n");
--i;
cls();
Menu();
continue;
}
printf("姓名:");
scanf("%s",e.name);
printf("語文成績:");
scanf("%d",&e.score[0]);
printf("數學成績:");
scanf("%d",&e.score[1]);
printf("英語成績:");
scanf("%d",&e.score[2]);
e.total=e.score[0]+e.score[1]+e.score[2];
e.average=e.total/N;
InsertByTotal(L,e);
if(i==n)
{
printf("所有成績錄入完成\n");
cls();
}
else
{ printf("第%d位學生成績成功錄入\n");
cls();
Menu();
}
}
}
void ShowAll(LinkList L)
{
LinkList p=L->next;
system("cls");
Menu();
while(p)
{
if(TAB==FALSE)
{
system("cls");
printf("------------------------所有學生成績名單---------------------------------\n");
printf("學號 姓名 數學 語文 英語 平均 總分\n");
TAB=TRUE;
}
printf("%-10s%-10s%-10d%-10d%-10d%-10d%-10d\n",p->data.num,p->data.name,p->data.score[0],p->data.score[1],\
p->data.score[2],p->data.average,p->data.total);
p=p->next;
}
printf("\n\n說明:成績按照由高到低的順序排列\n");
TAB=FALSE;
cls();
}
void SearchNum(LinkList L)
{
char num[MAX];
LinkList p,q;
system("cls");
Menu();
printf("輸入學號:");
scanf("%s",num);
if(!FindNum(L,num,&p,&q))
printf("沒有學號位%s的學生",num);
else
{
printf("學號位%s的學生信息如下\n",num);
printf("學號 姓名 數學 語文 英語 平均 總分\n");
printf("%-10s%-10s%-10d%-10d%-10d%-10d%-10d\n",q->data.num,q->data.name,q->data.score[0],q->data.score[1],\
q->data.score[2],q->data.average,q->data.total);
}
cls();
}
void SearchName(LinkList L)
{
char name[MAX];
int FIRST=FALSE;
LinkList p=L->next;
system("cls");
Menu();
printf("輸入姓名:");
scanf("%s",name);
while(p)
{
if(!strcmp(p->data.name,name))
{
if(FIRST==FALSE)
{
printf("所有姓名為%s的學生信息如下:\n");
printf("學號 姓名 數學 語文 英語 平均 總分\n");
FIRST=TRUE;
}
printf("%-10s%-10s%-10d%-10d%-10d%-10d%-10d\n",p->data.num,p->data.name,p->data.score[0],p->data.score[1],\
p->data.score[2],p->data.average,p->data.total);
}
p=p->next;
}
if(FIRST==FALSE)
printf("沒有姓名為%s的學生",name);
cls();
}
void SaveData()
{
fp=fopen(FILE_PATH_NAME,"wb");
if(!fp)
{
printf("保存失敗\n");
return;
}
else
{
ListTraverse(L,WriteToFile);
fclose(fp);
printf("保存完成\n");
cls();
}
}
int main()
{
int EXIT=FALSE;
int i,SUM;
ElemType e;
BuildFile();
ListInit(&L);
SUM=0;
fp=fopen(FILE_PATH_NAME,"rb");
if(!fp)
{
printf("數據讀取失敗");
cls();
}
else
{
while(ReadFromFile(&e))
{
InsertByTotal(L,e);
SUM++;
}
fclose(fp);
if(SUM>0)
printf("%d條數據成功讀取\n",SUM);
else
printf("無任何數據可以讀入\n");
cls();
}
while(EXIT==FALSE)
{
Menu();
fflush(stdin);
printf("(1):錄入成績\n");
printf("(2):學號查詢\n");
printf("(3):姓名查詢\n");
printf("(4):顯示成績\n");
printf("(5):保存成績\n");
printf("(6):退出系統\n");
printf("請選擇功能:");
scanf("%d",&i);
switch(i)
{
case 1:ReadIn(L);
break;
case 2:SearchNum(L);
break;
case 3:SearchName(L);
break;
case 4:ShowAll(L);
break;
case 5:SaveData();
break;
case 6:EXIT=TRUE;
printf("謝謝使用!\n");
break;
default:printf("非法輸入,請輸入1-6\n");
cls();
break;
}
}
}

c語言鏈表的建立和順序訪問各節點的數據域

#include<stdio.h>
#include<stdlib.h>
typedefstructstudent
{
intscore;
structstudent*next;
}student;

student*creatlist()
{
inti=0;
student*head,*p,*q;
head=(student*)malloc(sizeof(student));
p=head;
scanf("%d",&i);
while(i!=-1)
{
q=(student*)malloc(sizeof(student));
q->score=i;
p->next=q;
p=q;
scanf("%d",&i);
}
p->next=NULL;
returnhead;
}
voidprint(student*head)
{
if(!head)return;
student*p=head->next;
while(p)
{
printf("%d",p->score);
p=p->next;
}
}
intmain()
{
student*head;
head=creatlist();
print(head);
system("pause");
return0;
}

㈢ iOS - 鏈表

鏈表最基本的結構是在每個節點保存數據到下一個節點的地址,在最後一個節點保存一個特殊的結束標記。另外在一個固定的位置保存指向第一個節點的指針,有的時候也會同時儲存指向最後一個節點的指針。但是也可以提前把一個節點的位置另外保存起來,然後直接訪問,當然如果只是訪問數據就沒必要了,不如在鏈表上出錯指向實際數據的指針。這樣一般是為了訪問鏈表中下一個或者前一個節點

優勢 :
可以克服數組鏈表需要預先知道數據大小的缺點,鏈表結構可以充分利用計算機內存空間,實現靈活的內存動態管理
鏈表最明顯的好處是,常規數組排列關聯項目的方式可能不同於這些數據項目在記憶體或磁碟上順序,數組的存取往往要在不同的排列順序中轉換。而列表是一種自我指示數據類型,因為它包含指向另一個相同類型的數據的指針(鏈接),同時,鏈表允許插入和移除表上任意位置上的節點.

劣勢
鏈表由於增加了節點的指針域,空間開銷比較大;另外,鏈表失去了數組隨機讀取的優點,一般查找一個節點的時候需要從第一個節點開始每次訪問下一個節點,一直訪問到需要的位置

鏈表中最簡單的一種是單向鏈表

一個單向鏈表的節點被分成兩個部分,它包含兩個域,一個信息域和一個指針域,第一個部分保存或者顯示關於節點的信息,第二個節點存儲下一個節點的地址,而最後一個節點則指向一個空值。單向鏈表只可向一個方向遍歷

單鏈表有一個頭節點 head ,指向鏈表在內存的首地址,鏈表中的每一個節點的數據類型為結構體類型,節點有兩個成員:整型成員(實際需要保存的數據)和指向下一個結構體類型節點的指針即下一個節點的地址(事實上,此單鏈表是用於存放整型數據的動態數組)。鏈表按此結構對各節點的訪問需從鏈表的頭找起,後續節點的地址由當前節點給出。無論在表中訪問哪一個節點,都需要從鏈表的頭開始,順序向後查找。鏈表的尾節點由於無後續節點,其指針域為空,寫作為NULL

上圖還給出這樣一層含義,鏈表中的各節點在內存的存儲地址不是連續的,其各節點的地址是在需要時向系統申請分配的,系統根據內存當前的情況,即可以連續的分配地址,也可以跳躍式分配地址

單向列表程序的實現

在鏈表節點的定義中,除一個整形的成員外,成員 next 是指向與節點類型完全相同的指針

在鏈表節點的數據結構中,非常特殊的一點就是結構體內的指針域的數據類型使用了未定義成功的數據類型。 這是C中唯一規定可以先使用後定義的數據結構

創建一個存放正整數單鏈表,輸入0或小於0的數,結束創建鏈表,並列印鏈表中的

在鏈表的創建過程中,鏈表的頭指針是非常重要的參數,因為對鏈表的輸出和查找都要從鏈表的頭開始,所以鏈表創建成功後,要返回一個鏈表節點的地址,即頭指針
程序執行流程:

雙向鏈表其實是單向鏈表的改進,當我們對單鏈表進行操作時,有時你要對某個節點的直接前驅進行操作時,又必須從表頭開始查找。這是由單鏈表節點的結構所限制的,因為單鏈表每個節點只有一個存儲直接後繼節點地址的鏈域,那麼能不能定義一個既有存儲直接後繼節點地址的鏈域,又有存儲直接前驅節點地址的鏈域的這樣一個雙鏈節點結構呢? 這就是雙向鏈表

在雙向鏈表中,節點除含有數據域外,還有兩個鏈域,一個存儲直接後繼節點地址,一般稱為右鏈域(當此"連接"為最後一個"連接"時,指向空值或空列表);一個存儲直接前驅節點地址,稱為左鏈域(當此"連接"為第一個"連接"時,指向空值或空列表)
雙向鏈表節點定義

當然,也可以把一個雙向鏈表構成一個雙向循環鏈表。
雙向列表與單向鏈表一樣,也有三種基本運算:查找、插入和刪除

循環鏈表是與單向鏈表一樣,是一種鏈式的存儲結構,所不同的是,循環鏈表的最後一個節點的指針是指向該循環鏈表的第一個節點或者頭節點,從而構成一個環形的鏈

循環鏈表的運算與單鏈表的運算基本一致,所不同的有以下幾點:

塊狀鏈表本身是一個鏈表,但是鏈表存儲的不是一般的數據,而是由這些數據組成的順序表。每一個塊狀鏈表的節點,也就是順序表,可以被叫做一個塊

塊狀鏈表另一個特點是相對於普通鏈表來說節省內存,因為不用保存指向每一個數據節點的指針

參考: ios -鏈表的簡單認識

㈣ 怎麼訪問單鏈表的節點,希望大家給我回復喔

while(head != null){
if(head->data == XX){
return head;

}
head = head -> next;

}
return null;

㈤ 怎樣訪問鏈表中的各結點

指針指向第一個節點(p=head->next) 讀出它的數據(p->data) 然後指向下一個節點(p=p->next;)
重復上面步驟 循環條件p不空(p!=NULL)

㈥ C++類為鏈表結點怎麼訪問數據成員

法1:使用友元(友元類或者友元函數)
法2:在people類中定義一個方法,用來比較兩個people對象的age大小。
法3:在people類中提供一個公共方法訪問的age成員的值。
法4:直接公開people類的age成員。
法5:還沒想到……

㈦ Java中如何訪問鏈表中的數組

數組就像身上編了號站成一排的人,要找第10個人很容易,根據人身上的編號很快就能找到。但插入、刪除慢,要望某個位置插入或刪除一個人時,後面的人身上的編號都要變。當然,加入或刪除的人始終末尾的也快。

鏈表就像手牽著手站成一圈的人,要找第10個人不容易,必須從第一個人一個個數過去。但插入、刪除快。插入時只要解開兩個人的手,並重新牽上新加進來的人的手就可以。刪除一樣的道理。

Java中,ArrayList、LinkedList就是分別用數組和鏈表做內部實現的。
沒有誰好誰壞,根據不同情況下,用適合自己的。

㈧ c++鏈表的創建和訪問

語法上的錯誤,

main修改成:

int main(){
student *head;//定義student類型的指針head,也就是鏈表頭指針
head=createList();//調用createList函數錄入學生信息
printList(head);//調用printList輸出學生信息
}

㈨ 單雙向鏈表原理

雙向鏈表也叫雙鏈表,是鏈表的一種,它的每個數據結點中都有兩個指針,分別指向直接後繼和直接前驅。所以,從雙向鏈表中的任意一個結點開始,都可以很方便地訪問它的前驅結點和後繼結點。一般我們都構造雙向循環鏈表。
1鏈表操作編輯
雙向鏈表
雙向鏈表
線性表的雙向鏈表存儲結構:

帶頭結點的雙向循環鏈表的基本操作:

銷毀雙向循環鏈表L:

重置鏈表為空表:

驗證是否為空表:

2元素操作編輯
計算表內元素個數

賦值:

查找元素:

查找元素前驅:

查找元素後繼:

查找元素地址:

元素的插入:

元素的刪除:

正序查找:

逆序查找:

3循環鏈表編輯
循環鏈表是一種鏈式存儲結構,它的最後一個結點指向頭結點,形成一個環。因此,從循環鏈表中的任何一個結點出發都能找到任何其他結點。循環鏈表的操作和單鏈表的操作基本一致,差別僅僅在於演算法中的循環條件有所不同。

㈩ 如何在子進程中訪問父進程創建的鏈表

子進程要訪問的話,把鏈表設置成公共可見的試試。比較好的方式應該是把鏈表設置成入參,傳給子進程,子進程修改後返回

熱點內容
安卓如何修改cpu 發布:2025-05-16 21:58:20 瀏覽:364
pythonainb 發布:2025-05-16 21:45:56 瀏覽:855
淘汰伺服器可以做家用電腦嗎 發布:2025-05-16 21:41:31 瀏覽:842
遊程編碼c語言 發布:2025-05-16 21:26:51 瀏覽:586
帝來哪個配置值得購買 發布:2025-05-16 21:12:29 瀏覽:462
什麼是nodejs前端伺服器 發布:2025-05-16 21:12:17 瀏覽:405
編譯選項立即綁定未定義符號 發布:2025-05-16 20:55:13 瀏覽:907
linuxmysql慢日誌 發布:2025-05-16 20:47:58 瀏覽:272
村兩委有哪些配置 發布:2025-05-16 20:34:47 瀏覽:294
我的世界有什麼伺服器好玩的 發布:2025-05-16 20:28:57 瀏覽:484