一佣蓉、【鏈表的創(chuàng)建】:
【1】披摄、空鏈表:
Node *createList()
{
Node *head = (Node*)malloc(sizeof(Node));
head->next = NULL;
return head;
}
【2】、頭插法;
#include <stdio.h>
typedef struct node
{
int data;
struct node *next; //next 是指針變量勇凭,指向結(jié)構(gòu)體變量
}Node;
Node *createList()
{
Node *head = (Node *)malloc(sizeof(Node));//申請(qǐng)了堆空間
head->next = NULL;
Node *cur = NULL;
int tmp;
while (1)
{
scanf("%d", &tmp);
if (tmp == 1)
{
break;
}
cur = (Node *)malloc(sizeof(Node));
cur->data = tmp;
cur->next = head->next;
head->next = cur;
}
return head;
}
【3】疚膊、尾插法:
Node * createListByEnd(void)
{
//頭節(jié)點(diǎn)
Node * head=(Node *)malloc(sizeof(Node));
if(NULL == head)
{
printf("mallo failer\n");
return NULL;
}
head->next=NULL;
Node * pre=head;
printf("please input data : ");
//輸入數(shù)據(jù)
int data;
scanf("%d",&data);
while(data)
{
Node * cur=(Node *)malloc(sizeof(Node));
if(NULL == cur)
{
break;
}
cur->data=data;
//連接到鏈表的尾部
cur->next=pre->next;
pre->next=cur;
//更新前面節(jié)點(diǎn)
pre=cur;
//再次輸入數(shù)據(jù)
scanf("%d",&data);
}
return head;
}
二、【鏈表的遍歷和查找】:
鏈表的結(jié)構(gòu)相對(duì)而言比較特殊虾标,在對(duì)鏈表中的結(jié)點(diǎn)進(jìn)行訪問(wèn)和查找的時(shí)候寓盗,必須從鏈表的頭結(jié)點(diǎn)開(kāi)始,按照鏈表結(jié)點(diǎn)指針域所指的順序逐個(gè)查找結(jié)點(diǎn)璧函,直到找到為止傀蚌。和對(duì)數(shù)組元素的訪問(wèn)一樣,利用循環(huán)結(jié)構(gòu)對(duì)鏈表結(jié)點(diǎn) 進(jìn)行遍歷是一種常用的方法蘸吓,中使用的就是while循環(huán)結(jié)構(gòu)善炫,循環(huán)的終止條件便是判斷next指針是否為NULL(即是否已經(jīng)到達(dá)了最終結(jié)點(diǎn))。
【1】鏈表的遍歷:
void traverseList(Node * head)
{
head = head->next;
while(head!=NULL)
{
printf("%d\n",head->data);
head = head->next;
}
}
【2】鏈表的查找:
Node *findNodeList(Node * head, int nfind)
{
while (head->next)
{
if (head->data == nfind)
return head;
head = head->next;
}
return head;
}
三美澳、【鏈表的插入與求長(zhǎng)度】:
/*
插入節(jié)點(diǎn) 暫時(shí)只是頭插入法
*/
void insertLinkNode(Node * head,int insertData)
{
Node * curNode = (Node *)malloc(sizeof(Node));
if(NULL == curNode)
{
printf("malloc is error\n");
return NULL;
}
curNode->data=insertData;
//先保證新節(jié)點(diǎn)指向父節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)
//然父節(jié)點(diǎn)指向新節(jié)點(diǎn)
//這樣做的目的可以保證鏈表不被破壞
curNode->next=head->next;
head->next=curNode;
}
/*
獲取鏈表長(zhǎng)度
*/
int lengthLink(Node * head)
{
int len=0;
//首元節(jié)點(diǎn)
head=head->next;
while(head)
{
head=head->next;
len++;
}
return len;
}
四销部、【鏈表的刪除】:
//刪除鏈表
void deleteList(Node *head ,Node *find)
{
while (head->next != find) head = head->next;
head->next = find->next;
free(find);
find = NULL;
return ;
}
還有一些關(guān)于鏈表的深入摸航,筆者將在以后繼續(xù)講制跟。謝謝哈。