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ù)。
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;
}
}
LinkList
*q=L,*p;
//這里,你的p沒有賦值,當(dāng)然p=p-next會出錯(cuò)了?。?/p>
程序?qū)憣α说脑?,按你的情況是可以去掉那個(gè)的
修改:
LinkList
*q,*p=L;
運(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;
}
如果看不懂代碼可以問我
-運(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è)定位器
#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)