#includestdio.h
成都創(chuàng)新互聯(lián)是一家專業(yè)提供廣宗企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站建設(shè)、成都網(wǎng)站制作、H5建站、小程序制作等業(yè)務(wù)。10年已為廣宗眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站設(shè)計(jì)公司優(yōu)惠進(jìn)行中。
#includestdlib.h
//鏈表定義
typedef int ElemType;
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;
/*************************************
* 鏈表函數(shù) *
*************************************/
//鏈表初始化
void InitLink(LinkList L);
//創(chuàng)建函數(shù),尾插法
void CreateLink_T(LinkList L,int n);
//創(chuàng)建函數(shù),頭插法
void CreateLink_H(LinkList L,int n);
//銷毀函數(shù)
void DestroyLink(LinkList L);
//判斷是否為空函數(shù)
bool EmptyLink(LinkList L);
//獲取函數(shù)
bool GetLink(LinkList L,int i,int e);
//插入函數(shù)
void InsertLink(LinkList L,int i,int e);
//刪除函數(shù)
void DeleteLink(LinkList L,int i,int e);
//遍歷函數(shù)
void TraverseLink(LinkList L);
//鏈表長度函數(shù)
int LengthLink(LinkList L);
//合并函數(shù)
void MergeLink(LinkList L1,LinkList L2);
void main()
{
LinkList L1,L2;
InitLink(L1);
InitLink(L2);
CreateLink_H(L1,2);
CreateLink_T(L2,2);
TraverseLink(L1);
printf("\n");
TraverseLink(L2);
printf("\n");
MergeLink(L1,L2);
TraverseLink(L1);
TraverseLink(L2);
}
//創(chuàng)建函數(shù),尾插法
void InitLink(LinkList L)
{
L=(LinkList)malloc(sizeof(LNode));
if (!L)
{
printf("Init error\n");
return;
}
L-next=NULL;
}
void CreateLink_T(LinkList L,int n)
{
if(n1)
{
printf("n must =1\n");
return ;
}
else
{
// L=(LinkList)malloc(sizeof(LNode));
L-next=NULL;
for(int i=0;in;i++)
{
LinkList p=(LinkList)malloc(sizeof(LNode));// the lower letter p
printf("enter the data :\t");
scanf("%d",(p-data));
p-next=L-next;
L-next=p;
}
}
}
//創(chuàng)建函數(shù),頭插法
void CreateLink_H(LinkList L,int n)
{
if (n1)
{
printf("n must =1\n ");
return;
}
else
{
//L=(LinkList)malloc(sizeof(LNode));
LinkList pre=(LinkList)malloc(sizeof(LNode));
L-next=NULL;
pre=L;
for(int i=0;in;i++)
{
LinkList p=(LinkList)malloc(sizeof(LNode));
printf("enter the data:\t");
scanf("%d",(p-data));
pre-next=p;
pre=p;
}
pre-next=NULL;
}
}
//銷毀函數(shù)
void DestroyLink(LinkList L)
{
LinkList q=L,p=L;
while (p)
{
q=p;
p=p-next;
free(q);
}
L-next=NULL;
}
//判斷是否為空函數(shù)
bool EmptyLink(LinkList L)
{
if (NULL==L-next)
{
return true;
}
else
{
return false;
}
}
//獲取函數(shù)
bool GetLink(LinkList L,int i,int e)
{
if (i1)
{
return false;
}
else
{
if (EmptyLink(L))
{
return false;
}
LinkList p=L-next;
int j=1;
while(pji)
{
p=p-next;
j++;
}
if (!p||ji)
{
return false;
}
else
{
e=p-data;
return true;
}
}
}
//插入函數(shù)
void InsertLink(LinkList L,int i,int e)
{
if (i0||iLengthLink(L))
{
printf("Insert error\n");
return;
}
else
{
LinkList p=L;
int j=0;
while(p(ji))
{
p=p-next;
j++;
}
if (!p||ji)
{
printf("Insert error\n");
return;
}
else
{
LinkList q=(LinkList)malloc(sizeof(LNode));
q-data=e;
q-next=p-next;
p-next=q;
}
}
}
//刪除函數(shù)
void DeleteLink(LinkList L,int i,int e)
{
if(i=0||iLengthLink(L))
{
printf("delete error\n");
return;
}
else
{
LinkList p=L;
int j=0;
while(pji-1)
{
p=p-next;
j++;
}
if(!p||ji)
{
printf("please enter i again\n");
return;
}
else
{
LinkList q=p-next;
e=p-next-data;
p-next=p-next-next;
free(q);
}
}
}
//遍歷函數(shù)
void TraverseLink(LinkList L)
{
LinkList p=L-next;
if(!p)
{
printf("the Link L is empty\n");
}
while(p)
{
printf("%d\n",p-data);
p=p-next;
}
}
//鏈表長度函數(shù)
int LengthLink(LinkList L)
{
int i=0;
LinkList p=L-next;
while(p)
{
p=p-next;
i++;
}
return i;
}
//合并函數(shù)
void MergeLink(LinkList L1,LinkList L2)
{
int i=0,flag=0;
LinkList p1=L1-next,p2=L2-next;
LinkList p=(LinkList)malloc ((LengthLink(L1)+LengthLink(L2)+2)*sizeof(LNode));
LinkList pre=p;
if (!p)
{
printf("MergeLink error\n");
return;
}
p-next=NULL;
while (p1p2)
{
if (p1-data=p2-data)
{
InsertLink(p,i++,p2-data);
p2=p2-next;
}
else
{
InsertLink(p,i++,p1-data);
p1=p1-next;
}
}
while (p1)
{
InsertLink(p,i++,p1-data);
p1=p1-next;
}
while(p2)
{
InsertLink(p,i++,p2-data);
p2=p2-next;
}
while(pre)
{
pre=pre-next;
}
LinkList q=L1;
L1=p;
DestroyLink(q);
DestroyLink(L2);
}
#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)存儲(chǔ)結(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)建給改了一下
包括鏈表的創(chuàng)建刪除添加和釋放操作?。?/p>
#includestdio.h
#includestdlib.h
struct node *create();
void print_list(struct node *head);
struct node * insert_node(struct node *h,int x,int y);
struct node * delete_node(struct node *h,int z);
void shifang(struct node *head);
struct node
{
char data;
struct node *next;
};
void main()
{
struct node *head;
int x,y,z;
head=create();
print_list(head);
printf("\n輸入插入結(jié)點(diǎn)的位置的值和插入的數(shù)值:");
scanf("%d%d",x,y);
head=insert_node(head,x,y);
print_list(head);
printf("\n輸入要?jiǎng)h除的結(jié)點(diǎn):");
scanf("%d",z);
head=delete_node(head,z);
print_list(head);
printf("\n釋放鏈表.\n");
}
struct node *create() //建立鏈表函數(shù)
{
printf("請輸入各節(jié)點(diǎn)(以-1結(jié)尾):\n");
int x;
//定義指針*head,*tail,*s;
struct node *head,*tail,*s;
//head和tail初始化,生成一個(gè)頭結(jié)點(diǎn)
head=tail=(struct node *)malloc(sizeof(struct node));
//在循環(huán)中,生成新結(jié)點(diǎn)、賦值、連接、尾指針后移
scanf("%d",x);
while(x!=-1)
{
s=(struct node *)malloc(sizeof(struct node));
s-data=x;
tail-next=s;
tail=s;
scanf("%d",x);
}
//尾結(jié)點(diǎn)的指針域賦NULL
tail-next=NULL;
return head;
}
void print_list(struct node *head) //輸出鏈表函數(shù)
{
//定義工作指針*p并賦初值p=head-next;即指向第一個(gè)結(jié)點(diǎn)
struct node *p;
p=head-next;
//判斷鏈表是否為空,空:輸出空表的信息,否則:輸出所有結(jié)點(diǎn)
if(p==NULL)
printf("The list is NULL.");
else
//在循環(huán)中輸出當(dāng)前結(jié)點(diǎn),工作指針后移
{
printf("head-");
while(p!=NULL)
{
printf("%d-",p-data);
p=p-next;
}
printf("end.");
}
}
struct node * insert_node(struct node *h,int x,int y) //添加結(jié)點(diǎn)函數(shù)
{
struct node *p,*q,*s;
//生成要插入的新結(jié)點(diǎn)
s=(struct node *)malloc(sizeof(struct node));
s-data=y;
q=h;
p=h-next;
//查找要插入結(jié)點(diǎn)的位置
while((p!=NULL)(p-data!=x))
{
q=p;
p=p-next;
}
//插入結(jié)點(diǎn)
q-next=s;s-next=p;
return(h);
}
struct node * delete_node(struct node *h,int z) //刪除結(jié)點(diǎn)函數(shù)
{
struct node *p,*q;
q=h;
p=h-next ;
//查找要?jiǎng)h除結(jié)點(diǎn)的位置
if(p!=NULL)
{
while((p!=NULL)(p-data!=z))
{
q=p;
p=p-next;
}
//釋放結(jié)點(diǎn)
if(p-data ==z)
{
q-next=p-next ;
free(p);
}
}
return(h);
}
void shifang(struct node *head) //釋放鏈表函數(shù)
{
struct node *p;
//逐個(gè)釋放結(jié)點(diǎn)
while(head!=NULL)
{
p=head;
head=head-next;
free(p);
}
}
答案:
①p0
②p1
③NULL
解析:
p0指向要插入的結(jié)點(diǎn),p1指向要和p0結(jié)點(diǎn)的info進(jìn)行比較的結(jié)點(diǎn),如果找到應(yīng)該插入的位置,p0會(huì)被插入在p1之前,如果沒找到,會(huì)被插入在p1之后。
第一個(gè)if檢查鏈表是否為空,如果為空,直接將p0變?yōu)槭捉Y(jié)點(diǎn)就完成了插入。
while循環(huán)的作用是尋找插入位置,因?yàn)殒湵硪蠼敌?,所以用p1從首結(jié)點(diǎn)開始找,要找到第一個(gè)info小于等于p0結(jié)點(diǎn)的結(jié)點(diǎn)。每次循環(huán)結(jié)束后,p2將指向p1之前的結(jié)點(diǎn),為后面的插入作準(zhǔn)備。
第二個(gè)if檢查之前的while循環(huán)是否找到這樣的結(jié)點(diǎn)。如果沒找到,說明前面從while循環(huán)出來時(shí)p1指向的是尾結(jié)點(diǎn),這時(shí)要將p0插入到鏈表末尾,所以將p0插入到p1之后。p0的后面沒有結(jié)點(diǎn),所以它的link指向NULL,所以第③問填NULL。如果找到了,那么進(jìn)入第三個(gè)if。
第三個(gè)if檢查p1是否剛好為首結(jié)點(diǎn),如果為首結(jié)點(diǎn),說明前的while循環(huán)根本沒進(jìn)去直接就出來了,這時(shí)p1之前沒有結(jié)點(diǎn),p2還沒有指向任何結(jié)點(diǎn),所以還不能使用p2。由于要將p0插入到p1之前,所以必須將p0變?yōu)槭捉Y(jié)點(diǎn),所以第①問填p0。
如果p1不是首結(jié)點(diǎn),進(jìn)行的就是常規(guī)的插入操作了,將p0插入到p1之前,p2之后,所以第②問填p1。注意這里不能填p2-link,因?yàn)檫@里不在第三個(gè)if的else里面,第三個(gè)if出來以后也要經(jīng)過這一步,而之前說了,如果進(jìn)入了第三個(gè)if,p2是不能使用的。
本文名稱:c語言鏈表函數(shù) c語言鏈表什么意思
網(wǎng)站URL:http://jinyejixie.com/article24/doseije.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營銷、手機(jī)網(wǎng)站建設(shè)、全網(wǎng)營銷推廣、移動(dòng)網(wǎng)站建設(shè)、自適應(yīng)網(wǎng)站、關(guān)鍵詞優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(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)