1. 程式人生 > >C程式設計--結構體+單向連結串列

C程式設計--結構體+單向連結串列

連結串列

head指向第一個元素,第一個元素又指向第二個元素 … … 直到最後一個元素,該元素不再指向全體元素,它稱為“表尾”,它的地址部分放一個“NULL”(表示“空地址”),連結串列到此結束。

在這裡插入圖片描述

1. 建立一個簡單的靜態連結串列:

案例:如上圖所示的簡單鏈表,並輸出各節點中的資料

程式碼實現

#include<stdio.h>

struct Student{//宣告結構體
	int num;
	float score;
	struct Student *next;
};

int main(){
	struct Student a,
b,c,*head,*p; head=&a; a.num=10101; a.score=98.5; a.next=&b; b.num=10103; b.score=90; b.next=&c; c.num=10107; c.score=85; c.next=NULL; p=head; do{ printf("%d,%5.1f\n",p->num,p->score); p=p->next; }while(p!=NULL); return 0; }

執行結果:
在這裡插入圖片描述

程式碼說明:
上述程式中,所有的結點都是在程式中定義的,不是臨時開闢的,也不能用完後釋放。這種連結串列成為“靜態連結串列”。

2. 建立一個動態連結串列(需要標頭檔案:<stdlib.h>):

案例:建立一個單向連結串列,並用函式實現 輸入、輸出 各節點中的資料

程式碼實現:

#include<stdio.h>
#include<stdlib.h>

#define LEN sizeof(struct Student)

struct Student{
	long num;
	float score;
	struct Student *next;
};

int n;//輸入的個數,定義為全域性變數

struct Student* creat(){//返回一個指向struct Student型別元素的指標,即返回頭指標
struct Student *head; struct Student *p1,*p2; n=0; p1=p2=(struct Student *)malloc(LEN); scanf("%ld %f",&p1->num,&p1->score); head=NULL; while(p1->num!=0){ n++; if(n==1) head=p1; else p2->next=p1; p2=p1; p1=(struct Student *)malloc(LEN); scanf("%ld %f",&p1->num,&p1->score); } p2->next=NULL; return head; } void print(struct Student *head){ struct Student *p; printf("\nNow,Three %d records are:\n",n); p=head; if(head!=NULL){ do{ printf("%ld %5.1f\n",p->num,p->score); p=p->next; }while(p!=NULL); } } int main(){ struct Student *head; head=creat(); print(head); return 0; }

執行結果:
在這裡插入圖片描述
輸入函式:

struct Student* creat(){//返回一個指向struct Student型別元素的指標,即返回頭指標
	struct Student *head;
	struct Student *p1,*p2;
	n=0;
	p1=p2=(struct Student *)malloc(LEN);
	scanf("%ld %f",&p1->num,&p1->score);
	head=NULL;
	while(p1->num!=0){
		n++;
		if(n==1) head=p1;
		else p2->next=p1;
		p2=p1;
		p1=(struct Student *)malloc(LEN);
		scanf("%ld %f",&p1->num,&p1->score);
	}
	p2->next=NULL;
	return head;
}

輸出函式:

void print(struct Student *head){
	struct Student *p;
	printf("\nNow,Three %d records are:\n",n);
	p=head;
	if(head!=NULL){
		do{
			printf("%ld %5.1f\n",p->num,p->score);
			p=p->next;
		}while(p!=NULL);
	}
}

注:本部落格知識點較為簡單。如想了解更多關於連結串列的知識,建議閱讀以下文章

1.https://blog.csdn.net/huangjh2017/article/details/73818062
2.https://www.cnblogs.com/maluning/p/7966875.html
3.https://blog.csdn.net/m_zhurunfeng/article/details/54809821
4. … …等等