c語言函數(shù)中調(diào)用鏈表,鏈表操作c語言

怎樣在C語言中正確運(yùn)用鏈表??鏈表的使用需要注意哪些要點(diǎn)??

1.使用鏈表時(shí)候,先確認(rèn)要使用的是單向鏈表,還是雙向鏈表,或者是循環(huán)鏈表。一定要初始化。

公司主營業(yè)務(wù):網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)公司推出召陵免費(fèi)做網(wǎng)站回饋大家。

2.添加節(jié)點(diǎn)時(shí)候,要注意是否隊(duì)列已滿。

3.刪除節(jié)點(diǎn)的時(shí)候,要注意隊(duì)列是否為空。

4.要有可以判斷鏈表是否為空的函數(shù)。

5.要有可以判斷鏈表節(jié)點(diǎn)個(gè)數(shù)的函數(shù)。

C語言:鏈表的常用操作,完成下列子函數(shù),并寫主函數(shù)調(diào)用。

const int NULL =0;

template class T

struct Node

{

T data; //數(shù)據(jù)域

struct Node T * next; //指針域,在這里T可省略

};

template class T

class LinkList

{

public:

LinkList(){first = new Node T; first-next = NULL;}//無參構(gòu)造函數(shù)

LinkList(T a [], int n);//有參構(gòu)造函數(shù),使用含有n個(gè)元素的數(shù)組a初始化單鏈表

~LinkList(); //析構(gòu)函數(shù)

int GetLength(); //獲取線性表的長度

Node T * Get(int i); //獲取線性表第i個(gè)位置上的元素結(jié)點(diǎn)地址

int Locate (T x); //查找線性表中值為x的元素,找到后返回其位置

void Insert (int i, T x);//在線性表的第i個(gè)位置上插入值為x的新元素

T Delete(int i); //刪除線性表第i個(gè)元素,并將該元素返回

void PrintList(); //按次序遍歷線性表中的各個(gè)數(shù)據(jù)元素

Node T * GetFirst(){return first;}

private:

Node T * first; //頭指針

};

#include "linklist.h"

#include "iostream"

using namespace std;

/*

template class T

LinkListT::LinkList(T a [], int n) //頭插法建立單鏈表

{

first = new Node T;

first -next = NULL; //構(gòu)造空單鏈表

for (int i=n-1;i=0;i--)

{

Node T * s = new Node T;//①建立新結(jié)點(diǎn)

s-data = a[i]; //②將a[i]寫入到新結(jié)點(diǎn)的數(shù)據(jù)域

s-next = first-next; //③修改新結(jié)點(diǎn)的指針域

first-next = s; //④修改頭結(jié)點(diǎn)的指針域,將新結(jié)點(diǎn)加入到鏈表中

}

}

*/

template class T

LinkListT::LinkList(T a [], int n) //尾插法建立單鏈表

/*

① 在堆中建立新結(jié)點(diǎn):Node T * s = new Node T;

② 將a[i]寫入到新結(jié)點(diǎn)的數(shù)據(jù)域:s-data = a[i];

③ 將新結(jié)點(diǎn)加入到鏈表中: r-next = s;

④ 修改尾指針:r = s;

*/

{

first = new Node T;

Node T * r = first;

for (int i=0;in;i++)

{

Node T * s = new Node T;//①建立新結(jié)點(diǎn)

s-data = a[i]; //②將a[i]寫入到新結(jié)點(diǎn)的數(shù)據(jù)域

r-next = s; //③將新結(jié)點(diǎn)加入到鏈表中

r = s; //④修改尾指針

}

r-next = NULL; //終端結(jié)點(diǎn)的指針域設(shè)為空

}

template class T

LinkListT::~LinkList() //析構(gòu)函數(shù)

{

Node T * p = first; //初始化工作指針p

while (p) //要釋放的結(jié)點(diǎn)存在

{

first = p; //暫存要釋放的結(jié)點(diǎn)

p = p - next; //移動(dòng)工作指針

delete first; //釋放結(jié)點(diǎn)

}

}

template class T

Node T * LinkListT::Get(int i) //獲取線性表第i個(gè)位置上的元素

{

Node T * p = first - next; //初始化工作指針

int j = 1; //初始化計(jì)數(shù)器

while ( p j != i ) //兩個(gè)條件都滿足,則繼續(xù)循環(huán)

{

p = p - next; //工作指針后移

j++;

}

if (!p) throw "查找位置非法"; //工作指針已經(jīng)為空

else return p; //查找到第i個(gè)元素

}

template class T

int LinkListT::Locate (T x) //查找線性表中值為x的元素,找到后返回其位置

{

Node T * p = first -next; //初始化工作指針

int j=1;

while (p)

{

if (p-data == x) return j; //找到被查元素,返回位置

p = p-next;

j++;

}

return -1; //若找不到,返回錯(cuò)誤標(biāo)識-1

}

template class T

void LinkListT::Insert (int i, T x)//在線性表的第i個(gè)位置上插入值為x的新元素

{

Node T * p = first; //初始化工作指針

if (i != 1) p = Get(i-1); //若不是在第一個(gè)位置插入,得到第i-1個(gè)元素的地址。

Node T * s = new Node T;//建立新結(jié)點(diǎn)

s-data = x;

s-next = p-next;

p-next = s; //將新結(jié)點(diǎn)插入到p所指結(jié)點(diǎn)的后面

}

template class T

T LinkListT::Delete(int i) //刪除線性表第i個(gè)元素,并將該元素返回

{

Node T * p = first; //初始化工作指針

if (i != 1) p = Get(i-1); //若不是在第一個(gè)位置插入,得到第i-1個(gè)元素的地址。

Node T * q = p-next;

p-next = q-next;

T x = q-data;

delete q;

return x;

}

template class T

void LinkListT::PrintList() //按次序遍歷線性表中的各個(gè)數(shù)據(jù)元素

{

Node T * p = first-next ; //初始化工作指針

while (p){

cout p-data endl;

p = p- next;

}

}

關(guān)于C語言一個(gè)單鏈表函數(shù)調(diào)用的問題,求解答?。。?!

LinkList

*q=L,*p;

//這里,你的p沒有賦值,當(dāng)然p=p-next會出錯(cuò)了?。?/p>

程序?qū)憣α说脑?,按你的情況是可以去掉那個(gè)的

修改:

LinkList

*q,*p=L;

用C語言編程實(shí)現(xiàn)單鏈表的基本操作

運(yùn)行結(jié)果如下:

完整代碼如下:

#includestdio.h

#includestdlib.h

typedef struct LNode

{

char data;

LNode *next;

}* LNodePtr;

LNodePtr CreateList()

{

//初始化頭節(jié)點(diǎn)

LNodePtr head = (LNodePtr)malloc(sizeof(LNode));

head-data = 0;

head-next = NULL;

LNodePtr tNode;//臨時(shí)節(jié)點(diǎn)

char data;

while(true)

{

scanf("%c",data);

if(data == '\0' || data == '\n' || data == '\r' || data == '\t')

{

continue;

}

if(data == '!')//輸入感嘆號停止插入節(jié)點(diǎn)

{

printf("輸入鏈表元素結(jié)束。\n");

break;

}

if(data = 'A' data = 'Z')

{

tNode = (LNodePtr)malloc(sizeof(LNode));

tNode-data = data; ? ? /* ?數(shù)據(jù)域賦值 ?*/

tNode-next = head-next;

head-next = tNode;

}

else

{

printf("輸入字符需為大寫字母。\n");

}

}

return head;

}

/**

加密函數(shù),加密的方式為鏈接head的所有節(jié)點(diǎn)前移offset位,但是不支持offset比鏈表的節(jié)點(diǎn)數(shù)多

@param head 鏈表頭節(jié)點(diǎn)

@param offset 節(jié)點(diǎn)前移的位數(shù)

*/

void EncryptList(LNodePtr head,int offset)

{

LNodePtr tNode = head-next;

int i;

for(i = 0; i offset; i++)

{

if(tNode-next != NULL)

{

tNode = tNode-next;

}

}

if(i == offset)

{

LNodePtr newHead = tNode;

LNodePtr tail = tNode;

while (tail-next != NULL)

{

tail = tail-next;

}

tail-next = head-next;

while(tNode-next != NULL)

{

if(tNode-next != newHead)

{

tNode = tNode-next;

}

else

{

tNode-next = NULL;

break;

}

}

head-next = newHead;

}

else

{

printf("不支持移動(dòng)");

}

}

void ListPrint(LNodePtr head)

{

if(head-next != NULL)

{

LNodePtr tNode = head-next;

while (tNode-next != NULL)

{

printf("%c ",tNode-data);

tNode = tNode-next;

}

printf("%c",tNode-data);

}

}

int main()

{

LNodePtr list = CreateList();

printf("\n創(chuàng)建的鏈表如下:\n");

ListPrint(list);

EncryptList(list,3);

printf("\n所有節(jié)點(diǎn)前移了3位之后的鏈表如下:\n");

ListPrint(list);

printf("\n");

return 0;

}

如果看不懂代碼可以問我

C語言中鏈表是怎樣調(diào)用的?

-運(yùn)算是間接尋址,你用多指針的話會發(fā)現(xiàn)指針用-這種調(diào)用方式更簡潔

鏈表指針是C語言的一個(gè)難點(diǎn),但也是重點(diǎn),學(xué)懂了非常有用。要仔細(xì)講就必須先講變量、指針。

什么是變量?所謂變量,不要淺顯的認(rèn)為會變得量就是變量。舉個(gè)例子:“教室變不變?”變,因?yàn)槊刻煊胁煌娜嗽诶锩嫔险n,但又不變,因?yàn)榻淌沂冀K在那,沒有變大或變小。這就是變量:有一個(gè)不變的地址和一塊可變的存儲空間。正常情況下,我們只看到變量這個(gè)房間里面的東西,也就是其內(nèi)容,但不會關(guān)注變量的地址,但是C語言的指針,就是這個(gè)房間的地址。我們聲明變量就相當(dāng)于蓋了間房子存放東西,我們可以直接觀看房子里的東西,而聲明指針,就是相當(dāng)于獲得了一個(gè)定位器,當(dāng)用指針指向某個(gè)變量時(shí),就是用指針給變量定位,以后我們就可以用指針找到他所“跟蹤”的變量并可以獲得里面的內(nèi)容。

至于我們寫代碼的結(jié)構(gòu)體就相當(dāng)于是有好幾個(gè)房子組成的別墅,幾個(gè)房子綁定在一起使用。假設(shè)現(xiàn)在有很多這種別墅分布在一個(gè)大迷宮里,每間別墅里都有一間房子。里面放了另一個(gè)別墅的位置信息,現(xiàn)在你手拿定位器找到了第一棟別墅,從里面得到了你想要的東西(鏈表的數(shù)據(jù)部分),然后把下一棟別墅的位置計(jì)入你的定位器(p

=

p-next),再走向下一棟別墅……如此走下去,知道走到某地下一棟別墅信息沒有了(p-next

==

NULL),你的旅行結(jié)束。這就是鏈表一次遍歷的過程。

aTdPage[ucTdPageIndex]-OnInit

();就相當(dāng)于一個(gè)定位器

C語言創(chuàng)建鏈表,函數(shù)調(diào)用部分

#includestdio.h

#includewindows.h

#include stdio.h

#include malloc.h

#include stdlib.h

//定義數(shù)據(jù)類型名稱

typedef int DataType;

#define flag -1?? ??? ?//定義數(shù)據(jù)輸入結(jié)束的標(biāo)志數(shù)據(jù)

//單鏈表結(jié)點(diǎn)存儲結(jié)構(gòu)定義

typedef struct Node

{

DataType data;

struct Node *next;

}LNode ,*LinkList;

//建立單鏈表子函數(shù)

LNode *Create_LinkList()

{

LNode *s,*head,*L;int i=0,x;?? ??? ?//定義指向當(dāng)前插入元素的指針

while(1)

{

scanf("%d",x);

if(-1==x)

{?? return head;

break;}

s= (LNode *)malloc(sizeof(LNode));?? ??? ?//為當(dāng)前插入元素的指針分配地址空間

s-data =x;

s-next =NULL;

i++;

if(i==1)

head=s;

else

L-next =s;

L=s;

}

}

//查找子函數(shù)(按序號查找)

LNode *Get_LinkList(LinkList L,int i)

{

LNode *p;

int j;?? ??? ?//j是計(jì)數(shù)器,用來判斷當(dāng)前的結(jié)點(diǎn)是否是第i個(gè)結(jié)點(diǎn)

p=L;

j=1;

while(p!=NULLji)

{

p=p-next ;?? ??? ?//當(dāng)前結(jié)點(diǎn)p不是第i個(gè)且p非空,則p移向下一個(gè)結(jié)點(diǎn)

j++;

}

return p;

}

//插入運(yùn)算子函數(shù)

void Insert_LinkList(LinkList L,int i,DataType x)?? ??? ?//在單鏈表L中第i個(gè)位置插入值為x的新結(jié)點(diǎn)

{

LNode *p,*s;

p =Get_LinkList(L,i);?? ??? ?//尋找鏈表的第i-1個(gè)位置結(jié)點(diǎn)

if(p==NULL)

{

printf("插入位置不合法!");

exit(-1);

}

else

{

s= (LinkList)malloc(sizeof(LNode));?? ??? ?//為當(dāng)前插入元素的指針分配地址空間

s-data =x;

s-next =p-next ;

p-next =s;

}

}

//單鏈表的刪除運(yùn)算子函數(shù)

void Delete_LinkList(LinkList L,int i)?? ??? ?//刪除單鏈表上的第i個(gè)結(jié)點(diǎn)

{

LNode *p,*q;

p=Get_LinkList(L,i-1);?? ??? ?//尋找鏈表的第i-1個(gè)位置結(jié)點(diǎn)

if(p==NULL)

{

printf("刪除的位置不合法!");?? ??? ?//第i個(gè)結(jié)點(diǎn)的前驅(qū)結(jié)點(diǎn)不存在,不能執(zhí)行刪除操作

exit(-1);

}

else

{

if(p-next ==NULL)

{

?printf("刪除的位置不合法!");?? ??? ?//第i個(gè)結(jié)點(diǎn)不存在,不能執(zhí)行刪除操作

?exit(-1);

}

else

{

?q=p-next ;

?p-next =p-next-next;

?free(q);

}

}

}

//求表長運(yùn)算子函數(shù)

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("**創(chuàng)建**********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("請輸入選項(xiàng):");

scanf("%d",i);

switch(i)

{

case 1:head=Create_LinkList(); getchar();break;

case 2:printf("請輸入位置和數(shù)據(jù);");

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;

}

}

}

我把創(chuàng)建給改了一下

網(wǎng)頁標(biāo)題:c語言函數(shù)中調(diào)用鏈表,鏈表操作c語言
文章位置:http://muchs.cn/article0/hcjjio.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google網(wǎng)站制作、網(wǎng)站營銷微信公眾號、建站公司網(wǎng)站改版

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

營銷型網(wǎng)站建設(shè)