c語言鏈表代碼
㈠ 用c語言創建鏈表
主函數這里
LinklistList;
printf("輸入創建鏈表的長度:");
scanf("%d",&num);
CreateList_H(List,num); //創建鏈表
改為
LNodeList;
printf("輸入創建鏈表的長度:");
scanf("%d",&num);
CreateList_H(&List,num); //創建鏈表
函數內在堆上分配好內存,但是 沒有傳遞到棧上
另外你的變數名很迷人
㈡ C語言創建鏈表,函數調用部分
#include<stdio.h>
#include<windows.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!=NULL&&j<i)
{
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*******
");
printf("**創建**********1*
");
printf("**插入**********2*
");
printf("**刪除**********3*
");
printf("**表長**********4*
");
printf("**清屏**********5*
");
printf("**列印**********6*
");
printf("**退出******other*
");
printf("******************
");
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
",p->data);
p=p->next;}
break;
default :i=0;
}
}
}
我把創建給改了一下
㈢ 怎樣創建一個線性鏈表(C語言)
/*線性鏈表的構建*/
#include<stdio.h>
#include<stdlib.h>
typedefstructLnode
{
intdata;
structLnode*next;
}Lnode;
intmain()
{
Lnode*H,*p1,*p2,*p3,*p4;
H=(Lnode*)malloc(sizeof(Lnode));
p1=(Lnode*)malloc(sizeof(Lnode));
p2=(Lnode*)malloc(sizeof(Lnode));
p3=(Lnode*)malloc(sizeof(Lnode));
p4=(Lnode*)malloc(sizeof(Lnode));
p1->data=132;
p1->next=p2;
p2->data=942;
p2->next=p3;
p3->data=158;
p3->next=182;
p4->data=231;
p4->next=NULL;
printf("%d,%d ",p1->data,p3->data);
printf("%d",p1->next->data);
return0;
}
㈣ 如何用C 實現鏈表的查找、插入和刪除
如何用C語言實現鏈表的查找、插入和刪除,用C語言實現鏈表的查找、插入和刪除的方法。
鏈表
C語言中鏈表有很多種,我們來講C語言中最主要的鏈表——單向鏈表和雙向鏈表的查找,插入,刪除的實現方法。
單向鏈表
單鏈表使用按值查找,從鏈表的首元結點出發,依次將結點值和給定值e進行比較,返回查找結果。
其中單鏈表的查找的演算法步驟是: 1.使用指針P指向首元結點 2.從首元結點開始依次順著鏈域next向下查找,只要指向當前結點的指針P不為空,並且P所指結點的數據域不等於給定的值e,則循環執行「p指向下一個結點操作。 3.返回P。若查找成功,p此時即為結點的地址值,若查找失敗,P返回NULL 具體代碼如下。
SingleLinkList.h typedef int status;typedef int ElemType; //鏈表節點及鏈表數據表示定義typedef struct SingleLinkNode{ElemType data;struct SingleLinkNode *next;}SingleLinkNode,*SingleLinkList;//以下是單向鏈表操作函數原型 //初始化操作status InitSingleLinkList(SingleLinkList l);//鏈表銷毀操作void DestroySingleLinkList(SingleLinkList l);//鏈表清除操作void ClearSingleLinkList(SingleLinkList l);//鏈表長度int SingleLinkListLength(SingleLinkList l); //鏈表是否為空bool SingleLinkListEmpty(SingleLinkList l); //取鏈表中的第i個元素status GetSingleLinkListElem(SingleLinkList l,int i,ElemType e); //在鏈表的第i個位置插入元素status InsertSingleLinkList(SingleLinkList l,int i,ElemType e);//刪除鏈表的第i個元素status DeleteSingleLinkList(SingleLinkList l,int i); //列印鏈表void PrintSingleLinkList(SingleLinkList l);
SingleLinkList //必須包含此文件,因為它包含此文件中要用到的數據表示定義//以下實現的是帶頭節點的單向鏈表#include"SingleLinkList.h"#include"stdlib.h"#include"iostream.h"//初始化操作status InitSingleLinkList(SingleLinkList l){ //if(l)free(l); if(l=(SingleLinkList)malloc(sizeof(SingleLinkNode)))//如果分配成功,設置節點{l-next=NULL;return 1;}elsereturn 0;//表示失敗 }//鏈表銷毀操作void DestroySingleLinkList(SingleLinkList l){SingleLinkList p=l,q;while(p){q=p-next ;free(p);p=q;} }//鏈表清除操作void ClearSingleLinkList(SingleLinkList l){SingleLinkList p=l-next ,q;while(p){q=p-next ;free(p);p=q;}l-next =NULL; }//鏈表長度int SingleLinkListLength(SingleLinkList l){SingleLinkList p=l-next ;int i=0;if(l==NULL)return 0;while(p)i++,p=p-next; return i; } //鏈表是否為空bool SingleLinkListEmpty(SingleLinkList l){ return (l-next==NULL); } //取鏈表中的第i個元素status GetSingleLinkListElem(SingleLinkList l,int i,ElemType e){ int k=0;SingleLinkList p=l-next;if(i1||iSingleLinkListLength(l)) return 0;//1,尋找第i個節點 while(pki)k++,p=p-next; e =p-data ;return 1; } //在鏈表的第i個位置插入元素status InsertSingleLinkList(SingleLinkList l,int i,ElemType e){int k=0;SingleLinkList p,q ;if(SingleLinkListLength(l)==0)InitSingleLinkList(l);p=l ;if(i1||iSingleLinkListLength(l)+1) return 0;//1,尋找第i-1個節點 while(p-next ki-1)k++,p=p-next; //2,構造節點if(!(q=(SingleLinkList)malloc(sizeof(SingleLinkNode))))return 0;//3,設置節點並將節點鏈入q-data =e;q-next =p-next ;p-next =q;return 1;}//刪除鏈表的第i個元素status DeleteSingleLinkList(SingleLinkList l,int i){ int k=0;SingleLinkList p=l-next;if(i1||iSingleLinkListLength(l)) return 0;//1,尋找第i-1個節點 while(pki-1)k++,p=p-next; p-next =p-next-next ;free(p-next );return 1; } //列印鏈表void PrintSingleLinkList(SingleLinkList l){SingleLinkList p=l-next ;int i=1;while(p){coutp-data" " ;if(i%5==0)coutendl;p=p-next,i++ ;} }
Test #include"SingleLinkList.h"#includeiostream.h#includestdlib.h void main(void){ }
雙鏈表
雙鏈表的定義和各種操作實現方法,代碼如下;
DualLinkList.h typedef int status;typedef int ElemType; //鏈表節點及鏈表數據表示定義typedef struct DualLinkListNode{ElemType data;struct DualLinkListNode *next;}DualLinkListNode,*DualLinkListList;//以下是單向鏈表操作函數原型 //初始化操作status InitDualLinkListList(DualLinkListList l);//鏈表銷毀操作void DestroyDualLinkListList(DualLinkListList l);//鏈表清除操作void ClearDualLinkListList(DualLinkListList l);//鏈表長度int DualLinkListListLength(DualLinkListList l); //鏈表是否為空bool DualLinkListListEmpty(DualLinkListList l); //取鏈表中的第i個元素status GetDualLinkListListElem(DualLinkListList l,int i,ElemType e); //在鏈表的第i個位置插入元素status InsertDualLinkListList(DualLinkListList l,int i,ElemType e);//刪除鏈表的第i個元素status DeleteDualLinkListList(DualLinkListList l,int i); //列印鏈表void PrintDualLinkListList(DualLinkListList l);