當前位置:首頁 » 編程語言 » c語言鏈表實例
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言鏈表實例

發布時間: 2022-08-30 10:32:40

A. c語言如何創建單鏈表

C語言創建單鏈表如下:

#include"stdio.h"

#include"stdlib.h"

#include"malloc.h"

#include "iostream.h"

typedef struct node

{

intdata;

node * next;

}node , * List;

void create(int n)

{

int c;

List s,L;

L=(List)malloc(sizeof(node));

L->next=NULL;

printf("請輸入第1個數據:");

scanf("%d",&c);

L->data=c;

for(int i=2;i<=n;i++)

{

s=(List)malloc(sizeof(node));

printf("請輸入第%d個數據:",i);

scanf("%d",&c);

s->data=c;

s->next=L;

L->next =s;

}

printf("鏈表創建成功!");

}

void main()

{

int n;

printf("請你輸入鏈表的個數:");

scanf("%d",&n);

create(n);

}

B. 用c語言建立一個有序鏈表

先按正常流程建立一個鏈表,再按照其某一個成員值進行冒泡排序(排序過程的交換,只交換鏈表指針以外的成員值)。

演示代碼如下:(演示代碼鏈表20個節點,成員值為隨機值)

#include<stdio.h>

#include<stdlib.h>

#include<time.h>

typedef struct slist

{

int a;

struct slist *next;

}SLIST;

SLIST *init();//生成20個節點成員為隨機數的鏈表

void showList(SLIST *slHead);//列印鏈表

void px(SLIST *slHead,int flag);//float=1:降序。=2升序

int main()

{

SLIST *slHead=NULL;

slHead=init();

printf("排序前: ");

showList(slHead);

printf(" 降序排序後: ");

px(slHead,1);

showList(slHead);

printf(" 升序排序後: ");

px(slHead,2);

showList(slHead);

return 0;

}

void px(SLIST *slHead,int flag)//flag=1:降序。=2升序

{

SLIST *sl0=slHead->next,*sl1=NULL,slSave,*pSave=NULL;

while(sl0)

{

sl1=sl0->next;

while(sl1)

{

if((flag==1 && sl0->a<sl1->a)||(flag==2 && sl0->a>sl1->a))

{

slSave=*sl0;

*sl0=*sl1;

sl0->next=slSave.next;

pSave=sl1->next;

*sl1=slSave;

sl1->next=pSave;

}

sl1=sl1->next;

}

sl0=sl0->next;

}

}

void showList(SLIST *slHead)

{

int i=0;

while(slHead->next)

{

printf("節點%d成員值:%d ",++i,slHead->next->a);

slHead=slHead->next;

}

printf(" ");

}

SLIST *init()

{

int num,cnt=20;

static SLIST head;

SLIST *slHead=&head,*slTail=NULL,*slNew=NULL;

slHead->next=NULL;

srand(time(NULL));

while(cnt--)

{

num=rand()%100;

slNew=(SLIST *)malloc(sizeof(SLIST));

if(!slNew)return NULL;

slNew->a=num;

slNew->next=NULL;

if(!slHead->next)

slHead->next=slNew;

else

slTail->next=slNew;

slTail=slNew;

}

return slHead;

}

C. C語言鏈表簡介和舉例!

C語言鏈表有單鏈表、雙向鏈表、循環鏈表。單鏈表由數據域和指針域組成,數據域存放數據,指針域存放該數據類型的指針便於找到下一個節點。雙鏈表則含有頭指針域、數據域和尾指針域,域單鏈表不同,雙鏈表可以從後一個節點找到前一個節點,二單鏈表則不行。循環鏈表就是在單鏈表的基礎上,將頭結點的地址指針存放在最後一個節點的指針域里以,此形成循環。此外還有雙向循環鏈表,它同時具有雙向鏈表和循環鏈表的功能。

單鏈表如:

D. C語言中怎麼定義鏈表,最好把各個代碼都詳細的解釋一下!

/*creat
a
list*/
#include
"stdlib.h"
#include
"stdio.h"
struct
list
{
int
data;
struct
list
*next;
};
typedef
struct
list
node;
typedef
node
*link;
void
main()
{
link
ptr,head;
int
num,i;
ptr=(link)malloc(sizeof(node));
ptr=head;
printf("please
input
5
numbers==>\n");
for(i=0;i<=4;i++)
{
scanf("%d",&num);
ptr->data=num;
ptr->next=(link)malloc(sizeof(node));
if(i==4)
ptr->next=NULL;
else
ptr=ptr->next;
}
ptr=head;
while(ptr!=NULL)
{
printf("The
value
is
==>%d\n",ptr->data);
ptr=ptr->next;
}
}
上面是一個簡單的創建鏈表的C程序。所謂鏈表形象的講就是一個數據塊裡面存有數據,並且存有下一個數據的指針,這樣一個指一個形成一個數據鏈。這個數據鏈可以被操作,例如插入數據,刪除數據,等。至於指令,首先定義一個結構體,它存有數據和指向下一個數據塊的指針。然後分配空間。注意最後一個為NULL,當然你也可以指向開頭一個數據塊形成一個循環鏈表。

E. C語言中鏈表主要應用於哪些實際問題的解決

鏈表可以解決很多實際問題,比如數據結構課程上講的多項式運算、求解約瑟夫問題,操作系統原理中的內存管理器實現等等。舉一個在Windows通過鏈表搜索文件的實例,代碼如下(vc6.0中編譯通過)。

#include<stdio.h>
#include<windows.h>
structDirList{
chartable[256];
DirList*pNext;
};
DirList*first,*newlist,*last;
//加入文件夾鏈表
voidAddList(char*list)
{
newlist=newDirList;
strcpy(newlist->table,list);
newlist->pNext=NULL;
//假如文件鏈表為空,那麼第一個和最後一個節點都指向新節點
if(first==NULL)
{
first=newlist;
last=newlist;
}
//不為空,則原來最後一個節點指向新節點
else
{
last->pNext=newlist;
last=newlist;
}
}
//查找文件,並把找到的文件夾加入文件夾鏈表
voidFindFile(char*pRoad,char*pFile)
{
charFileRoad[256]={0};
charDirRoad[256]={0};
charFindedFile[256]={0};
charFindedDir[256]={0};
strcpy(FileRoad,pRoad);
strcpy(DirRoad,pRoad);
strcat(DirRoad,"\*.*");
WIN32_FIND_DATAfindData;
HANDLEhFindFile;
hFindFile=FindFirstFile(DirRoad,&findData);
if(hFindFile!=INVALID_HANDLE_VALUE)
{
do
{
if(findData.cFileName[0]=='.')
continue;
//假如是文件夾,則假如文件夾列表
if(findData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
{
strcpy(FindedDir,pRoad);
strcat(FindedDir,"\");
strcat(FindedDir,findData.cFileName);
//加入文件夾列表
AddList(FindedDir);
memset(FindedDir,0x00,256);
}
//繼續查找
}while(FindNextFile(hFindFile,&findData));
}
strcat(FileRoad,"\");
strcat(FileRoad,pFile);
//查找要查找的文件
hFindFile=FindFirstFile(FileRoad,&findData);
if(hFindFile!=INVALID_HANDLE_VALUE)
{
do
{
strcpy(FindedFile,pRoad);
strcat(FindedFile,"\");
strcat(FindedFile,findData.cFileName);
//輸出查找到的文件
printf("%s ",FindedFile);
memset(FindedFile,0x00,256);
}while(FindNextFile(hFindFile,&findData));
}
}
intSeachFile(char*Directory,char*SeachFile)
{
DirListNewList;
strcpy(NewList.table,Directory);
NewList.pNext=NULL;
last=&NewList;
first=&NewList;
while(true)
{
DirList*Find;
//假如鏈表不為空,提取鏈表中的第一個節點,並把第一個節點指向原來第二個
if(first!=NULL)
{
//提取節點
Find=first;
//並把第一個節點指向原來第二個
first=first->pNext;
//在提取的節點的目錄下查找文件
FindFile(Find->table,SeachFile);
}
//為空則停止查找
else
{
printf("文件搜索完畢 ");
return0;
}
}
return0;
}
intmain(intargc,char*argv[])
{
if(argc!=3){
printf("程序名文件目錄要搜索的文件名 ");
return0;
}
SeachFile(argv[1],argv[2]);
return0;
}

執行效果如下,測試搜索c:windows目錄中的記事本程序notepad.exe。

F. 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;
}
}
}

我把創建給改了一下

G. 用c語言寫一個簡單的鏈表,具體要怎麼用代碼實現

可以用結構體和指針來實現
定義:
定義一個單個元素的結構

typedef struct Chain_tag { // 這里用typedef來定義,方便使用 int data; // 這里的數據可以是任意類型 //其他數據 struct Chain_tag *prev, *next;// 由於Chain為不完全類型,故只能用指針的方式聲明} Chain;

使用:
用單個結構體的指針作為head

#include <malloc.h> //Chain的定義寫在這里 Chain *alloc_single_chain(int data /*, (其他參數)*/){ Chain *tmp; tmp = malloc(sizeof(Chain)); tmp.data = data; //...其餘數據初始化 tmp.prev = tmp.next = NULL; // 將前後指針置為NULL return tmp;} voiddispose_chain(Chain *target) //其實這里功能簡單,用宏實現也可以{ free(target); return;} int main(){ Chain *head; Chain *pos; head = alloc_single_chain(10);//初始化起始結點 head->next = alloc_single_chain(11);//同理。。下一個結點 for (pos = head; pos; pos = pos->next)//清理垃圾好習慣 { dispose_chain(pos); } return 0;}

H. 如何用C語言編寫一個鏈表

#include "stdio.h"
#include "stdlib.h"
#include "malloc.h"

struct Node
{
int data;//數據域
struct Node * next;//指針域
};

/*************************************************************************************
*函數名稱:Create
*函數功能:創建鏈表.
*輸入:各節點的data
*返回值:指針head
*************************************************************************************/
struct Node * Create()
{
struct Node *head,*p1,*p2;
head = NULL;
p1 = p2 = (struct Node *)malloc(sizeof(struct Node));
printf("Input the linklist (Input 0 to stop):\n");
scanf("%d",&p1->data);
while(p1->data!=0)
{
if(head == NULL){
head = p1;
}else{
p2->next = p1;
p2 =p1;
}
p1 = (struct Node *)malloc(sizeof(struct Node));
scanf("%d",&p1->data);
}
p2->next = NULL;
return head;
}
/*************************************************************************************
*函數名稱:insert
*函數功能:在鏈表中插入元素.
*輸入:head 鏈表頭指針,p新元素插入位置,x 新元素中的數據域內容
*返回值:無
*************************************************************************************/
void insert(struct Node * head,int p,int x)
{
struct Node * tmp = head;
struct Node * tmp2 ;
int i ;
for(i = 0;i<p;i++)
{
if(tmp == NULL)
return ;
if(i<p-1)
tmp = tmp->next;
}
tmp2 = (struct Node *)malloc(sizeof(struct Node));
tmp2->data = x;
tmp2->next = tmp->next;
tmp->next = tmp2;
}
/**************************************************************************************
*函數名稱:del
*函數功能:刪除鏈表中的元素
*輸入:head 鏈表頭指針,p 被刪除元素位置
*返回值:被刪除元素中的數據域.如果刪除失敗返回-1
**************************************************************************************/
int del(struct Node * head,int p)
{
struct Node * tmp = head;
int ret , i;
for(i = 0;i<p;i++)
{
if(tmp == NULL)
return -1;
if(i<p-1)
tmp = tmp->next;
}
ret = tmp->next->data;
tmp->next = tmp->next->next;
return ret;
}
/**************************************************************************************
*函數名稱:print
*函數功能:列印鏈表中的元素
*輸入:head 鏈表頭指針
*返回值:無
**************************************************************************************/
void print(struct Node *head)
{
struct Node *tmp;
for(tmp = head; tmp!=NULL; tmp = tmp->next)
printf("%d ",tmp->data);
printf("\n");
}
/**************************************************************************************
*函數名稱:main
*函數功能:主函數創建鏈表並列印鏈表。
**************************************************************************************/
int main(){
struct Node * head = Create();
print(head);
return 0;
}