單向鏈表c語言
① c語言單向鏈表
name 保存在結構體單元的name[20] 數組里;
typedef struct node
{
char name[20];
struct node *link;
}stud;
這是你前面定義的結構體變數,一個單元包含兩個部分,一個用來存儲name的數組name[20],一個用來存放下一個單元地址的指向結構體node的指針。
假設該單元的地址是p,那麼p->name 表示第一部分name[20]的地址,p->link表示第二部分,作用是存放下一個單元的地址。
--------------》你看不懂的部分如下《-----------------
p->link=s; /*把s的地址賦給p所指向的結點的鏈域,這樣就把p和s所指向的結點連接起來了*/
printf("請輸入第%d個人的姓名",i+1);
scanf("%s",s->name); /*在當前結點s的數據域中存儲姓名*/
s->link=NULL;
p=s;
}
在這段代碼前面是分配一個結構體單元空間,s是這個新分配空間的地址,p是鏈表的尾節點的地址,以鏈表形式說,新分配的應當跟在它後面。
按上面所講,p->link用來存放下一單元的地址,因此有:
p->link=s; 這樣新節點就成為鏈表的一部分了。
printf("請輸入第%d個人的姓名",i+1);
scanf("%s",s->name);
這兩句,是對將需要輸入的名字讀入並且存放在新節點用於存放name 的數組中。
此時,剛開辟的新節點成了尾節點,尾節點不指向任何其它節點,因此s->link=NULL;(NULL是空指針)
(C中處理指針需要小心行事)
p=s; 將p變數賦值為s,即讓其為尾節點的地址,便於繼續添加節點。
② C語言實現一個單向鏈表linked List
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
structnode
{
intdata;
structnode*next;
};
intmain()
{
structnode*h=NULL,*p;
inti;
ints1,s2,s3;
srand(time(NULL));
for(i=0;i<5;i++)
{
if(h==NULL)
h=p=(structnode*)malloc(sizeof(structnode));
else
p=p->next=(structnode*)malloc(sizeof(structnode));
p->data=rand()%10+1;
}
p->next=NULL;
s1=s2=s3=0;
for(p=h;p;p=p->next)
{
if(p->data%2==1)s1+=p->data;
elses2+=p->data;
s3+=p->data;
}
printf("all=%dodd=%deven=%d ",s3,s1,s2);
while(h)
{
p=h->next;
free(h);
h=p;
}
return0;
}
③ C語言單鏈表
C語言創建單鏈表如下:
#include"stdio.h"
#include"stdlib.h"
#include"malloc.h"
#include "iostream.h"
typedef struct node
{
intdata;
node * next;
}node , * List;
void create(int n)
{
int c;
List s,L;
L=(List)malloc(sizeof(node));
L->next=NULL;
printf("請輸入第1個數據:");
scanf("%d",&c);
L->data=c;
for(int i=2;i<=n;i++)
{
s=(List)malloc(sizeof(node));
printf("請輸入第%d個數據:",i);
scanf("%d",&c);
s->data=c;
s->next=L;
L->next =s;
}
printf("鏈表創建成功!");
}
void main()
{
int n;
printf("請你輸入鏈表的個數:");
scanf("%d",&n);
create(n);
}
④ 求問c語言單向鏈表和雙向鏈表與循環鏈表的區別
打個比方。把鏈表節點看作是一個人,把鏈表指針看作是人的手(左手是前向指針,右手是後向指針)。
非循環的單向鏈表是這樣的:若干個人排成一排,每個人都抬起右手指向他右邊的人,最右邊的人的右手指向了空氣(NULL)。如果要想找到這一排中任意一個人,必須從排頭(鏈表頭)開始沿手指的方向挨個查找。
循環單向鏈表是這樣的:若干個人圍成一圈,每個人都抬起右手指向他右邊的人,這樣每個人的右手都能指到一個人(如果只有一個人,那麼他的右手指向自己)。從任意一個人開始,沿著手指的方向,可以不停地循環找到每一個人。
非循環的雙向鏈表是這樣的:若干個人排成一排,每個人都抬起左手指向他左邊的人,並且每個人都抬起右手指向他右邊的人,那麼最左邊的人的左手指向了空氣(NULL),最右邊的人的右手指向了空氣(NULL)。如果要想找到這一排中某個目標人,從任意一個人開始,可以沿左手方向嘗試查找,如果找不到,可以繼續沿右手方向查找,直到找到目標人。
循環雙向鏈表是這樣的:若干個人圍成一圈,每個人都抬起左手指向他左邊的人,並且每個人都抬起右手指向他右邊的人,這樣每個人的左右手都可以指到一個人(如果只有一個人,那麼他的左右手都指向自己)。無論選擇左手方向還是右手方向,都可以不停地循環找到每一個人。
⑤ 用C語言編程(創建一個單向鏈表)
設計程序
創建一個
單向鏈表
,並輸出鏈表中數據。要求:從鍵盤
輸入數據
元素個數
和值
,並在此基礎上實現單
⑥ C語言 單向鏈表如何排序
void link_order(STU *p_head)
{
STU *pb, *pf, temp;
pf = p_head;
if(p_head == NULL) {//鏈表為空
printf("needn't order. ");
return ;
}
if(p_head->next == NULL) {//鏈表有1個節點
printf("only one print, needn't order. ");
return ;
}
while(pf->next != NULL) {//以pf指向的節點為基準節點
pb = pf->next;//pb從基準點的下一個節點開始
while(pb != NULL) {
if(pf->num > pb->num) {
temp = *pf;
*pf = *pb;
*pb = temp;
temp.next = pf->next;
pf->next = pb->next;
pb->next = temp.next;
}
pb = pb->next;
}
pf = pf->next;
}
return ;
}
(6)單向鏈表c語言擴展閱讀:
鏈表的排序有三種情況:
1、鏈表為空時:不用排序;
2、鏈表中有一個節點:不用排序;
3、鏈表中兩個及其以上節點時:排序。
return 0代表程序正常退出。return是C++預定義的語句,它提供了終止函數執行的一種方式。當return語句提供了一個值時,這個值就成為函數的返回值。
return語句用來結束循環,或返回一個函數的值。
1、return 0,說明程序正常退出,返回到主程序繼續往下執行。
2、return 1,說明程序異常退出,返回主調函數來處理,繼續往下執行。return 0或return 1對程序執行的順序沒有影響,只是大家習慣於使用return(0)退出子程序而已。