當前位置:首頁 » 編程語言 » c語言鏈表思路
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言鏈表思路

發布時間: 2023-01-14 01:46:04

c語言鏈表原理

每個節點有一個數據域num保存該節點的數據,以及一個next域指向下一個節點的地址。假設某時刻指針p指向鏈表頭結點,通過一個循環不停地將p賦值為p指向的節點的next域的值,即該節點的下一個節點的地址,即可遍歷整個列表。

Ⅱ 怎樣在C語言中正確運用鏈表鏈表的使用需要注意哪些要點

1.使用鏈表時候,先確認要使用的是單向鏈表,還是雙向鏈表,或者是循環鏈表。一定要初始化。
2.添加節點時候,要注意是否隊列已滿。
3.刪除節點的時候,要注意隊列是否為空。
4.要有可以判斷鏈表是否為空的函數。
5.要有可以判斷鏈表節點個數的函數。

Ⅲ 如何用C語言編寫一個鏈表

#include "stdio.h"
#include "stdlib.h"
#include "malloc.h"

struct Node
{
int data;//數據域
struct Node * next;//指針域
};

/*************************************************************************************
*函數名稱:Create
*函數功能:創建鏈表.
*輸入:各節點的data
*返回值:指針head
*************************************************************************************/
struct Node * Create()
{
struct Node *head,*p1,*p2;
head = NULL;
p1 = p2 = (struct Node *)malloc(sizeof(struct Node));
printf("Input the linklist (Input 0 to stop):\n");
scanf("%d",&p1->data);
while(p1->data!=0)
{
if(head == NULL){
head = p1;
}else{
p2->next = p1;
p2 =p1;
}
p1 = (struct Node *)malloc(sizeof(struct Node));
scanf("%d",&p1->data);
}
p2->next = NULL;
return head;
}
/*************************************************************************************
*函數名稱:insert
*函數功能:在鏈表中插入元素.
*輸入:head 鏈表頭指針,p新元素插入位置,x 新元素中的數據域內容
*返回值:無
*************************************************************************************/
void insert(struct Node * head,int p,int x)
{
struct Node * tmp = head;
struct Node * tmp2 ;
int i ;
for(i = 0;i<p;i++)
{
if(tmp == NULL)
return ;
if(i<p-1)
tmp = tmp->next;
}
tmp2 = (struct Node *)malloc(sizeof(struct Node));
tmp2->data = x;
tmp2->next = tmp->next;
tmp->next = tmp2;
}
/**************************************************************************************
*函數名稱:del
*函數功能:刪除鏈表中的元素
*輸入:head 鏈表頭指針,p 被刪除元素位置
*返回值:被刪除元素中的數據域.如果刪除失敗返回-1
**************************************************************************************/
int del(struct Node * head,int p)
{
struct Node * tmp = head;
int ret , i;
for(i = 0;i<p;i++)
{
if(tmp == NULL)
return -1;
if(i<p-1)
tmp = tmp->next;
}
ret = tmp->next->data;
tmp->next = tmp->next->next;
return ret;
}
/**************************************************************************************
*函數名稱:print
*函數功能:列印鏈表中的元素
*輸入:head 鏈表頭指針
*返回值:無
**************************************************************************************/
void print(struct Node *head)
{
struct Node *tmp;
for(tmp = head; tmp!=NULL; tmp = tmp->next)
printf("%d ",tmp->data);
printf("\n");
}
/**************************************************************************************
*函數名稱:main
*函數功能:主函數創建鏈表並列印鏈表。
**************************************************************************************/
int main(){
struct Node * head = Create();
print(head);
return 0;
}

Ⅳ 用C語言實現鏈表的演算法

這個是我們數據結構上機實驗的鏈表問題,
#include<stdio.h>
#include<malloc.h>
#define
LEN
sizeof(LinkNode)
typedef
int
Datatype;
typedef
int
Status;
typedef
struct
LinkNode{
Datatype
data;
struct
LinkNode
*next;
}
LinkNode,*LinkList;
typedef
struct
OrderedList
{
LinkNode
*head,*tail;
int
Listsize;
}
OrderedList;//有序循環鏈表的頭節點head,尾接接節點
tail及長度Listsize
Status
InitList(OrderedList
*List)//生成循環鏈表頭節點
{
List->tail=List->head=(LinkList)malloc(LEN);
if(List->head==NULL)
return
0;
else
{
List->head->next=List->tail;
List->tail->next=List->head;
List->Listsize=0;
return
1;
}
}
void
OrderedInsert(OrderedList
*List,Datatype
data)//每調用一次有序插入data形成有序的(從小到大)的鏈表
{
LinkNode
*p
,*q;
if(List->head==List->tail->next)
{
p=(LinkNode*)malloc(LEN);
p->data
=
data;
List->head->next=p;
p->next=List->tail;
List->Listsize++;
}
else
{
p=List->head->next;
q
=
List->head;
while(p->data<data&&p!=List->tail)
{
q
=
p;
p=p->next;
}
if(p->data==data)
{printf("YOu
have
input
the
same
datas
%d\n\t
YOu
should
input
another
data
\n",data);
scanf("%d",&data);
OrderedInsert(List,data);
}
else
{
p=(LinkNode*)malloc(LEN);
p->data
=
data;
p->next
=
q->next;
q->next
=
p;
List->Listsize++;
}
}
}
void
Creatset(OrderedList
*List)//多次調用OrderedInsert()生成有序鏈表即集合List
{
Datatype
data;
int
setsize
,
i=0;
printf("Please
input
the
setsize
you
want
to
creat:\n");
scanf("%d",&setsize);
InitList(List);
if(setsize==0)
printf("You
needen't
input
any
data\n");
else
if(setsize==1)
printf("Please
input
a
single
data\n");
else
printf("Please
input
%d
different
datas;\n",setsize);
while(i<setsize||setsize>List->Listsize)//當循環次數i小於setsize或者集合內實際元素數List.Listsize小於setsize時一直循環下去
{
scanf("%d",&data);
OrderedInsert(List,data);
i++;
}
}
void
Append(OrderedList
*List,Datatype
data)//在循環鏈表的最後面追加
一個data
{
LinkNode
*p;
p=(LinkNode*)malloc(LEN);
p->data=data;
List->tail=List->tail->next=p;
List->tail->next=List->head;
List->Listsize+=1;
}
void
MergeList(OrderedList
La,OrderedList
Lb,OrderedList
*Lc)//有序循環鏈表ListLa,ListLb求並集生成ListLc
{
LinkList
Pa,Pb;
Pa=La.head->next;Pb=Lb.head->next;
while(Pa!=La.tail&&Pb!=Lb.tail)
{
if(Pa->data<=Pb->data)
{
Append(Lc,Pa->data);
Pa=Pa->next;
}
else
{
Append(Lc,Pb->data);Pb=Pb->next;
}
}
while(Pa!=La.tail)
{
Append(
Lc,Pa->data);Pa=Pa->next;}
while(Pb!=Lb.tail)
{
Append(Lc,Pb->data);Pb=Pb->next;}
}
void
Print(OrderedList
List)
{
LinkNode
*p;
p=List.head->next;
if(p->next==List.head)
printf("No
Elem\n");
while(p!=List.head)
{
printf("%5d",p->data);p=p->next;
}
printf("\n");
}
void
main()
{
OrderedList
ListLa,ListLb,ListLc;
Creatset(&ListLa);
Creatset(&ListLb);
InitList(&ListLc);
MergeList(ListLa,ListLb,&ListLc);
printf("The
orgnial
list
ListLa,ListLb:\n");
Print(ListLa);
Print(ListLb);
printf("The
Merge
list
ListLc;\n");
Print(ListLc);
}

Ⅳ 求解C語言數據結構鏈表倒序思路

循環執行下列操作:

從舊鏈表頭部抽走一個節點
再將這個節點壓入新鏈表頭部

舊鏈表:1--->2--->3--->4--->
新鏈表:

舊鏈表:2--->3--->4--->
新鏈表:1--->

舊鏈表:3--->4--->
新鏈表:2--->1--->

舊鏈表:4--->
新鏈表:3--->2--->1--->

舊鏈表:
新鏈表:4--->3--->2--->1--->

Ⅵ 求c語言鏈表的詳細講解

鏈表是一種常見的重要的數據結構.它是動態地進行存儲分配的一種結構.我們知道,用數組存放數據時,
必須事先定義固定的長度(即元素個數).比如,有的班級有100人,而有的班只有30人,如果要用同一個數組先後存放不同班級的學生數據,則必須定義長度為100的數組.如果事先難以確定一個班的最多人數,則必須把數組定得足夠大,以能存放任何班級的學生數據.顯然這將會浪費內存.鏈表則沒有這種缺點,它根據需要開辟內存單元.圖10.11表示最簡單的一種鏈表(單向鏈表)的結構.鏈表有一個"頭指針"變數,圖中以head表示,它存放一個地址.
該地址指向一個元素.鏈表中每一個元素稱為"結點",每個結點都應包括兩個部分:一為用戶需要用的實際數據,二為下一個結點的地址.課以看出,head指向第一個元素;第一個元素又指向第二個元素;……,直到最後一個元素,該元素不再指向其它元素,它稱為'表尾",它的地址部分放一個"NULL"(表示"空地址").鏈表到此結束.
可以看到:鏈表中各元素在內存中可以不是連續存放的.要找某一元素,必須先找到上一個元素,根據它提供的下一元素地址才能找到下一個元素.
如果不提供"頭指針"(head),則整個鏈表都無法訪問.鏈表如同一條鐵鏈一樣,一環扣一環,中間是不能斷開的.打個通俗的比方:幼兒園的老師帶領孩子出來散步,老師牽著第一個小孩的手,第一個小孩的另一隻手牽著第二個孩子,……,這就是一個"鏈",最後一個孩子有一隻手空著,他是"鏈尾".要找這個隊伍,必須先找到老師,然後順序找到每一個孩子.

Ⅶ c語言鏈表的思路是什麼,動態鏈表到後面的代碼是什麼意思

結點就是鏈表的基本單元。鏈表的結點就是一組指針的集合,這些指針中存儲的是鏈表中其它結點的位置或者結點對應的數據的位置。
一般情況下,鏈表的結點存儲了它的相鄰結點的地址,也只有這樣,它才能說是個鏈表,但有些鏈表為了便於訪問其它元素,或者實現跳躍式訪問,可能會存儲一些特殊位置,如表頭或表尾(不過正常人都會把它放在鏈表外,用結構體包裝起來)。
鏈表的意義在於,可以很方便地動態管理內存,不必要求大塊的連續空間。在只需增刪或移動部分數據時,能提高讀寫效率,尤其是數據較大的排序等管理過程時,能大大提高內存處理效率,減少不必要的操作。
至於動態鏈表後面的代碼,你是指什麼?煩請具體陳述,或者給個源碼,我可以給你加上注釋。也可以函至[email protected]

Ⅷ C語言中鏈表的原理該如何使用坐等指教 多謝啦

一樓的答案很標准了,我再通俗地說明下-----你把鏈表看成一輛火車,火車頭就是頭結點,然後每節車廂有號碼標識,比如1號車廂車尾就連上2號車廂車頭,這就像1號節點的指針域裡面存儲的是下一個節點的地址,每節車廂裡面容納乘客的地方就相當於數據域。
至於鏈表的種類有很多,有單鏈表的,雙連表的,循環鏈表的,還有有頭結點和無頭節點的。總之原理都大同小異。
對於鏈表的操作主要有插入和刪除:
插入:在第i個節點之前插入一個節點:
1、首先查找第i-1個節點 if(p滿足條件)
2、給新節點分配空間q =(Node*)malloc(sizeof(Node));給q數據域賦值。
3、q->next = p->next;
4、p->next = q;
刪除:如果要刪除符合條件的節點(刪除q所指節點)
1、首先找到要刪除節點的前驅節點 if(p->next->data滿足條件)
2、用q指向要刪除的節點 q = p->next;
3、p->next = q->next;
4、free(q);
說再多不如你實際操作,你可以寫一個很簡單的鏈表數據試試...
希望對你有所幫助!

Ⅸ 一道C語言中關於鏈表排序的代碼的思路與步驟

/*代碼的整體思路是分為3個函數,一個建立鏈表,一個鏈表排序,最後一個是輸出鏈表,
而程序調用也是根據這個順序來調用的,詳細說明在下面*/
#include
#include
#define
LEN
sizeof(struct
number)
struct
number
{
int
num;
struct
number
*next;
};
int
n=0,sum=0;
void
main()
{
struct
number
*creat();
void
print(struct
number
*head);
struct
number
*change(struct
number
*head);
struct
number
*ahead;
ahead=creat();
sum+=n;
//sum計算結點的總數
change(ahead);
print(ahead);
}
struct
number
*creat()
//創建鏈表
{
struct
number
*p1,*p2,*head;
p1=p2=(struct
number*)malloc(LEN);
//LEN就是define定義的sizeof(struct
number)
printf("input
a
number,not
zero\n");
scanf("%d",&p1->num);
//將p1的num賦值為輸入的數
while(p1->num!=0)
//如果輸入的數不是0
{
n++;
//是記錄鏈表節點的數量
if(n==1)
//如果n是建立的第一個結點,也就是鏈表的頭
head=p1;
else
//否則p2的next指針指向p1,也就是原來鏈表最後一個結點的next指向新結點p1
p2->next=p1;
p2=p1;
//p2指向p1,每次p2都指向鏈表的結尾
p1=(struct
number*)malloc(LEN);
//申請內存,建立新結點
scanf("%d",&p1->num);
//再輸入號
}
p2->next
=NULL;
//將尾結點的next指針指向NULL
return
head;
//返回頭指針
}
struct
number
*change(struct
number
*head)
{
struct
number
*p,*h;
int
i;
for(i=1;i
next;p->next!=NULL;p=p->next,h=h->next)
//p指向頭結點,h指向p的後一個結點,每循環一次p和h都往後指一個結點
if(p->num>h->num)
//如果前面的結點比後面結點大,就交換,只交換num的值
{
int
t;
t=p->num;
p->num=h->num;
h->num=t;
}
return
head;
}
void
print(struct
number
*head)
//鏈表的便利,只便利num值
{
struct
number
*p;
p=head;
while(p!=NULL)
{
printf("%d",p->num
);
p=p->next
;
}
}