本文目錄一覽:
- 1、C語言創建鏈表,函數調用部分
- 2、C語言中鏈表是怎樣調用的?
- 3、用C語言實現鏈表的算法
- 4、C語言鏈表的使用方法
- 5、鏈表的使用,c語言
- 6、C語言鏈表操作
C語言創建鏈表,函數調用部分
#includestdio.h
#includewindows.h
#include stdio.h
#include malloc.h
#include stdlib.h
//定義數據類型名稱
typedef int DataType;
#define flag -1 //定義數據輸入結束的標誌數據
//單鏈表結點存儲結構定義
typedef struct Node
{
DataType data;
struct Node *next;
}LNode ,*LinkList;
//建立單鏈表子函數
LNode *Create_LinkList()
{
LNode *s,*head,*L;int i=0,x; //定義指向當前插入元素的指針
while(1)
{
scanf(“%d”,x);
if(-1==x)
{ return head;
break;}
s= (LNode *)malloc(sizeof(LNode)); //為當前插入元素的指針分配地址空間
s-data =x;
s-next =NULL;
i++;
if(i==1)
head=s;
else
L-next =s;
L=s;
}
}
//查找子函數(按序號查找)
LNode *Get_LinkList(LinkList L,int i)
{
LNode *p;
int j; //j是計數器,用來判斷當前的結點是否是第i個結點
p=L;
j=1;
while(p!=NULLji)
{
p=p-next ; //當前結點p不是第i個且p非空,則p移向下一個結點
j++;
}
return p;
}
//插入運算子函數
void Insert_LinkList(LinkList L,int i,DataType x) //在單鏈表L中第i個位置插入值為x的新結點
{
LNode *p,*s;
p =Get_LinkList(L,i); //尋找鏈表的第i-1個位置結點
if(p==NULL)
{
printf(“插入位置不合法!”);
exit(-1);
}
else
{
s= (LinkList)malloc(sizeof(LNode)); //為當前插入元素的指針分配地址空間
s-data =x;
s-next =p-next ;
p-next =s;
}
}
//單鏈表的刪除運算子函數
void Delete_LinkList(LinkList L,int i) //刪除單鏈表上的第i個結點
{
LNode *p,*q;
p=Get_LinkList(L,i-1); //尋找鏈表的第i-1個位置結點
if(p==NULL)
{
printf(“刪除的位置不合法!”); //第i個結點的前驅結點不存在,不能執行刪除操作
exit(-1);
}
else
{
if(p-next ==NULL)
{
printf(“刪除的位置不合法!”); //第i個結點不存在,不能執行刪除操作
exit(-1);
}
else
{
q=p-next ;
p-next =p-next-next;
free(q);
}
}
}
//求表長運算子函數
int Length_LinkList(LinkList L)
{
int l; //l記錄L的表長
LNode *p;
p=L;
l=1;
while(p-next)
{
p=p-next;
l++;
}
return l;
}
int main ()
{
LNode *head,*p;
head=(LinkList)malloc(sizeof(LNode));
int x,y;
a:
printf(“*******menu*******\n”);
printf(“**創建**********1*\n”);
printf(“**插入**********2*\n”);
printf(“**刪除**********3*\n”);
printf(“**表長**********4*\n”);
printf(“**清屏**********5*\n”);
printf(“**打印**********6*\n”);
printf(“**退出******other*\n”);
printf(“******************\n”);
int i=1;
while(i)
{
printf(“請輸入選項:”);
scanf(“%d”,i);
switch(i)
{
case 1:head=Create_LinkList(); getchar();break;
case 2:printf(“請輸入位置和數據;”);
scanf(“%d%d”,x,y);
Insert_LinkList(head,x,y);break;
case 3:printf(“請輸入位置;”);
scanf(“%d”,x);
Delete_LinkList(head,x);break;
case 4:printf(“%d”,Length_LinkList(head));break;
case 5:system(“cls”);goto a;
case 6:p=head;
while(p!=NULL)
{printf(“%d\n”,p-data);
p=p-next;}
break;
default :i=0;
}
}
}
我把創建給改了一下
C語言中鏈表是怎樣調用的?
-運算是間接尋址,你用多指針的話會發現指針用-這種調用方式更簡潔
鏈表指針是C語言的一個難點,但也是重點,學懂了非常有用。要仔細講就必須先講變量、指針。
什麼是變量?所謂變量,不要淺顯的認為會變得量就是變量。舉個例子:「教室變不變?」變,因為每天有不同的人在裏面上課,但又不變,因為教室始終在那,沒有變大或變小。這就是變量:有一個不變的地址和一塊可變的存儲空間。正常情況下,我們只看到變量這個房間裏面的東西,也就是其內容,但不會關注變量的地址,但是C語言的指針,就是這個房間的地址。我們聲明變量就相當於蓋了間房子存放東西,我們可以直接觀看房子里的東西,而聲明指針,就是相當於獲得了一個定位器,當用指針指向某個變量時,就是用指針給變量定位,以後我們就可以用指針找到他所「跟蹤」的變量並可以獲得裏面的內容。
至於我們寫代碼的結構體就相當於是有好幾個房子組成的別墅,幾個房子綁定在一起使用。假設現在有很多這種別墅分佈在一個大迷宮裡,每間別墅里都有一間房子。裏面放了另一個別墅的位置信息,現在你手拿定位器找到了第一棟別墅,從裏面得到了你想要的東西(鏈表的數據部分),然後把下一棟別墅的位置計入你的定位器(p
=
p-next),再走向下一棟別墅……如此走下去,知道走到某地下一棟別墅信息沒有了(p-next
==
NULL),你的旅行結束。這就是鏈表一次遍歷的過程。
aTdPage[ucTdPageIndex]-OnInit
();就相當於一個定位器
用C語言實現鏈表的算法
這個是我們數據結構上機實驗的鏈表問題,
#includestdio.h
#includemalloc.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-datadatap!=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(isetsize||setsizeList-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.tailPb!=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語言鏈表的使用方法
下面的程序是單鏈表的建立與輸出,都有詳細的注釋,相信你能看的懂
但要想學習鏈表必須得掌握了一定的C語言基礎
下面這個鏈表的作用是建立5個結點的單鏈表,5個結點的值輸入以後,依次輸出各個結點的值
#includestdio.h
#includestdlib.h
//鏈表的建立與輸出
struct node//定義結點的類型
{
int num,score;
node*link;
};
void main()
{
node*creat(int n);//函數原型聲明
void print(node*h);//函數原型聲明
node*head=0;//定義鏈頭指針並初始化
head=creat(5);//調用creat函數創建鏈表
print(head);//調用print函數輸出鏈表
}
node*creat(int n)
{
node*h=0,*p,*q;
int i;
for(i=1;i=n;i++)
{
q=(node*)malloc(sizeof(node));//分配一個結點空間
scanf(“%d%d”,q-num,q-score);//輸入新結點的值
q-link=0;//新結點的指針域置0
if(h==0)
h=q;//第一個結點作為鏈頭結點
else
p-link=q;//新結點添加到鏈表的末尾
p=q;
}
return h;//返回鏈頭指針
}
void print(node*h)//鏈表輸出函數的定義
{
while(h)//當指針h非空時輸出h所指結點的值
{
printf(“num=%d\tscore=%d\n”,h-num,h-score);
h=h-link;//使h指向下一個結點
}
}
鏈表的使用,c語言
#includestdio.h
#includestdlib.h
typedef struct Node
{
int data;
struct Node*next;
}node,*Llist;
Llist creat(int n)
{
int i;
Llist head,p,q;
head=(node*)malloc(sizeof(node));
p=q=head;
head-next=NULL;
for(i=0;in;i++)
{
p=(node*)malloc(sizeof(node));
scanf(“%d”,p-data);
p-next=q-next;
q-next=p;
q=p;
}
return head;
}//建立鏈表函數//
int main()
{
Llist la,lb,lc;
node *p,*q,*r;
int m,n;
printf(“請分別輸入A與B鏈表的長度:”);
scanf(“%d%d”,m,n);
printf(“請輸入A鏈表的數據(遞增):”);
la=creat(m);
printf(“請輸入B鏈表的數據(遞增):”);
lb=creat(n);
q=la;
p=la-next;
r=lb-next;
while(p!=NULLr!=NULL)
{
if((p-data)==(r-data))
{
q-next=p-next;
free(p);
p=q-next;
r=r-next;
}//當兩值相等時均向後移動一位,並釋放A中相等結點//
else if((p-data)(r-data))
{
q=p;
p=p-next;
}//a鏈表中結點小於b時,a向後移動一位//
else
r=r-next;//b鏈表中結點小於a時,b向後移動一位//
}
lc=la;
p=lc-next;
printf(“A-B的結果為:”);
while(p!=NULL)
{
printf(“%d “,p-data);
p=p-next;
}
return 0;
}
C語言鏈表操作
typedefstruct_List{intdata;struct_List*next;}List;intQuery(List**head,intx){List*p=(*head)-next;intn=1;while(pp-data!=x){p=p-next;n++;}if(p)returnn;elsereturn-1;}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/271708.html