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

單向鏈表的建立c語言

發布時間: 2023-05-23 18:38:42

A. c語言建立帶頭結點的單鏈表

單鏈表的生成有2種方式:頭插法和尾插法。

1、頭插法

/*********************************************************************
*函數名稱:linklist*CreateLinklistHead()
*函數功能:利用頭插法創建鏈表
*參數:無
*返回值:創建完鏈表後的鏈表頭結點
*說明:無
*********************************************************************/
externlinklist*CreateLinklistHead()
{
intx,i,nodeNum;
linklist*head,*temp;//頭結點與臨時結點
head=(linklist*)malloc(sizeof(linklist));//生成表頭結點
head->next=NULL;//給表頭結點的指針域賦值
printf("請輸入鏈表中結點的個數:");
scanf("%d",&nodeNum);
for(i=1;i<=nodeNum;i++)
{
printf("請輸入第%d個結點的數據:",i);
scanf("%d",&x);
temp=(linklist*)malloc(sizeof(linklist));//生成新的結點
temp->data=x;//對新結點的數據域賦值
//將新結點插到頭結點之後
temp->next=head->next;
head->next=temp;
}
returnhead;//返回新建鏈表的頭結點
}

2、尾插法

/*********************************************************************
*函數名稱:linklist*CreateLinklistRear()
*函數功能:利用尾插法創建鏈表
*參數:無
*返回值:創建完鏈表後的鏈表頭結點
*說明:無
*********************************************************************/
externlinklist*CreateLinklistRear()
{
intx,i,nodeNum;
linklist*head,*rear,*temp;//定義頭結點、尾結點和臨時結點
head=(linklist*)malloc(sizeof(linklist));//生成表頭結點,表頭結點不存放數據
head->next=NULL;//將表頭結點的指針域賦值為NULL
rear=head;//將表頭結點賦值給表尾結點
printf("請輸入鏈表中結點的個數:");
scanf("%d",&nodeNum);
for(i=1;i<=nodeNum;i++)
{
printf("請輸入第%d個結點的數據:",i);
scanf("%d",&x);
temp=(linklist*)malloc(sizeof(linklist));//生成新的結點
temp->data=x;//新增結點的數據域
temp->next=NULL;//新增結點的指針域(由於是尾插法,所以插入的結點都在尾部,即指針域為NULL)
rear->next=temp;//使前一個結點指向新增結點(head->next=temp)
rear=temp;//將新增結點賦值給尾結點(尾插法,插入的結點在尾部)(rear=head->next)
}
//rear->next=NULL;//將尾結點的指針域賦值為空(為了方便檢驗鏈表是否為空鏈表)
returnhead;//返回頭結點
}

B. 用C語言編程實現單鏈表的基本操作

運行結果如下:


完整代碼如下:


#include<stdio.h>

#include<stdlib.h>


typedef struct LNode

{

char data;

LNode *next;

}* LNodePtr;


LNodePtr CreateList()

{

//初始化頭節點

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

head->data = 0;

head->next = NULL;


LNodePtr tNode;//臨時節點

char data;

while(true)

{

scanf("%c",&data);

if(data == '' || data == ' ' || data == ' ' || data == ' ')

{

continue;

}

if(data == '!')//輸入感嘆號停止插入節點

{

printf("輸入鏈表元素結束。 ");

break;

}

if(data >= 'A' && data <= 'Z')

{

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

tNode->data = data; /* 數據域賦值 */

tNode->next = head->next;

head->next = tNode;

}

else

{

printf("輸入字元需為大寫字母。 ");

}

}

return head;

}


/**

加密函數,加密的方式為鏈接head的所有節點前移offset位,但是不支持offset比鏈表的節點數多

@param head 鏈表頭節點

@param offset 節點前移的位數

*/

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("不支持移動");

}

}


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(" 創建的鏈表如下: ");

ListPrint(list);

EncryptList(list,3);

printf(" 所有節點前移了3位之後的鏈表如下: ");

ListPrint(list);

printf(" ");

return 0;

}


如果看不懂代碼可以問我

C. C語言數據結構 如何建立單向循環鏈表並且輸入值

#include<iostream>
usingnamespacestd;
typedefcharElemType;
typedefintStatus;
#defineOK1
#defineERROR0
typedefstructLnode
{
ElemTypedata;
structLnode*next;
}Lnode,*LinkList;
voidCreat_List(LinkListL)//創建單鏈表並輸入元素
{
LinkListp,q;
q=L;
charch;
cout<<"請輸入鏈表元素,並且以輸入#表示結束!"<<endl;
while(cin>>ch&&ch!='#')
{
p=newLnode[sizeof(Lnode)];
if(!p)
{
cout<<"獲取內存失敗"<<endl;
exit(ERROR);
}
p->data=ch;//尾插法
L->next=p;
L=p;
}
L->next=q;
}
voidoutput_List(LinkListL)//遍歷單鏈表(輸出單鏈表元素)
{
LinkListp;
p=L->next;
if(p==L)
{
cout<<"該鏈表是空鏈表!"<<endl;
exit(ERROR);
}
while(p!=L)
{
cout<<p->data<<"";
p=p->next;
}
}
Statusmain()
{
LinkListH;
H=(LinkList)malloc(sizeof(Lnode));
H->next=NULL;//設置頭結點為空
Creat_List(H);
output_List(H);
return0;
}//頭結點有和沒有都是可以的,頭結點只是為了讓操作鏈表更方便,

D. 用C語言實現建立一個單鏈表的過程,並實現列印鏈表中每一個元素,寫出完整程序

這是個很簡單的鏈表創建和輸出

#include<stdio.h>

#include<stdlib.h>

typedef struct linkednode

{

char data;

struct linkednode *next;

}node,*link_list;//鏈表節點的結構及重命名

link_list creat()//創建一個鏈表返回類型是鏈表的首地址

{

link_list L;

node *p1,*p2;

char data;

L=(node*)malloc(sizeof(node));//開辟存儲空間

p2=L;

while((data=getchar())!=' ')//輸入回車鍵時結束輸入

{

p1=(node*)malloc(sizeof(node));

p1->data=data;

p2->next=p1;

p2=p1;

}

p2->next=NULL;

return L;

}

void print(link_list L)//把鏈表輸出

{

node *p;

p=L->next;

while(p!=NULL)

{

printf("%c",p->data);

p=p->next;

}

printf(" ");

}

void main()

{

link_list L=NULL;

char x;

printf("請輸入鏈表節點: ");

L=creat();

print(L);

}

E. C語言單向鏈表的創建,輸入,插入和刪除的實現

/* 線性表-鏈表的操作: 只提供核心語句 */
#include "stdio.h"
#include "stdlib.h"
#define N 100
typedef int ElemType;/* 鏈表的存儲結構 */
typedef struct LNode{
ElemType data;
struct LNode *next; } LNode,*LinkList;/* 鏈表的基本操作 *//******* 1.初始化鏈表 ******/
void InitList(LinkList *L)
{ *L=(LinkList)malloc(sizeof(LNode));
(*L)->next=NULL; }/******* 2.銷毀鏈表 ******/
void DestroyList(LinkList *L)
{ LinkList p;
while(*L!=NULL)
{ p=*L;
*L=(*L)->next;
free(p); }
}
/******* 10.在順序表第n個位置頃亮兆插入元素e ******/
void ListInsert(LinkList *L, int n, ElemType e)
{ LinkList p,q,new; int i;
q=*L; p=(*L)->next; i=1;
while (p!=NULL && i<n) { q=p; p=p->next; i++; }
new=(LinkList)malloc(sizeof(LNode));
new->data=e;
q->next=new; new->next=p; }/******* 11.刪除鏈表中第n個位置的元素 ******/
void ListDelete(LinkList *L, int n, ElemType *e)
{ LinkList p,q; int i;
q=*L; p=(*L)->next; i=1;
while (p!=NULL && i<n) { q=p; p=p->next; i++; }
*e=p->data;
q->next=p->next; free(p); }/******* 12.遍歷鏈表並輸出 ******/
void ListTraverse(LinkList L)
{ LinkList p;
printf("\nList:\t");
p=L->next;
while (p!=NULL)
{ printf("%d\t",p->data);
p=p->next; }
}/******* A(2).後接法建立順序鏈表雀租 ******/
void CreateList2(LinkList *L, ElemType a[], int n)
{ LinkList p,new; int i;
p=*L;
for(i=0; i<n; i++)
{ new=(LinkList)malloc(sizeof(LNode));
new->data=a[i];
p->next=new; p=p->next; }
p->next=NULL;
}
/* 主函數 */
main()
{ LinkList La; ElemType a[]={1,3,5,7,9},x;
InitList(&La);//初始化鏈表
CreateList2(&La,a,5);//建立鏈表並用鍵寬數組賦值
ListTraverse(La);//遍歷鏈表
ListInsert(&La, 3, 100);//第三個位置插入100
ListTraverse(La);//遍歷鏈表
ListDelete(&La,5,&x);//刪除第五個元素,用x返回
ListTraverse(La);//遍歷鏈表 DestroyList(&La);//銷毀鏈表
} 這是我們剛學的,保證簡潔准確

F. c語言用函數創建單鏈表

#include<stdio.h>
#include<stdlib.h>
//鏈表定義
typedef int ElemType;
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;
/*************************************
* 鏈表函數 *
*************************************/
//鏈表初始化
void InitLink(LinkList &L);
//創建函數,尾插法
void CreateLink_T(LinkList &L,int n);
//創建函數,頭插法
void CreateLink_H(LinkList &L,int n);
//銷毀函數
void DestroyLink(LinkList &L);
//判斷是否為空函數
bool EmptyLink(LinkList &L);
//獲取函數
bool GetLink(LinkList &L,int i,int & e);
//插入函數
void InsertLink(LinkList &L,int i,int e);
//刪除函數
void DeleteLink(LinkList &L,int i,int &e);
//遍歷函數
void TraverseLink(LinkList &L);
//鏈表長度函數
int LengthLink(LinkList &L);
//合並函數
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);

}
//創建函數,尾插法
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(n<1)
{
printf("n must >=1\n");
return ;
}
else
{
// L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
for(int i=0;i<n;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;
}
}
}

//創建函數,頭插法
void CreateLink_H(LinkList &L,int n)
{
if (n<1)
{
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;i<n;i++)
{
LinkList p=(LinkList)malloc(sizeof(LNode));
printf("enter the data:\t");
scanf("%d",&(p->data));
pre->next=p;
pre=p;
}
pre->next=NULL;
}
}

//銷毀函數
void DestroyLink(LinkList &L)
{
LinkList q=L,p=L;
while (p)
{
q=p;
p=p->next;
free(q);
}
L->next=NULL;

}

//判斷是否為空函數
bool EmptyLink(LinkList &L)
{
if (NULL==L->next)
{
return true;
}
else
{
return false;
}
}

//獲取函數
bool GetLink(LinkList &L,int i,int& e)
{
if (i<1)
{
return false;
}
else
{
if (EmptyLink(L))
{
return false;
}
LinkList p=L->next;
int j=1;
while(p&&j<i)
{
p=p->next;
j++;
}
if (!p||j>i)
{
return false;
}
else
{
e=p->data;
return true;
}

}
}

//插入函數
void InsertLink(LinkList &L,int i,int e)
{
if (i<0||i>LengthLink(L))
{
printf("Insert error\n");
return;
}
else
{
LinkList p=L;
int j=0;
while(p&&(j<i))
{
p=p->next;
j++;
}
if (!p||j>i)
{
printf("Insert error\n");
return;
}
else
{
LinkList q=(LinkList)malloc(sizeof(LNode));
q->data=e;
q->next=p->next;
p->next=q;

}
}

}

//刪除函數
void DeleteLink(LinkList &L,int i,int &e)
{
if(i<=0||i>LengthLink(L))
{
printf("delete error\n");
return;
}
else
{
LinkList p=L;
int j=0;
while(p&&j<i-1)
{
p=p->next;
j++;
}
if(!p||j>i)
{
printf("please enter i again\n");
return;
}
else
{
LinkList q=p->next;
e=p->next->data;
p->next=p->next->next;
free(q);

}
}
}

//遍歷函數
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;
}
}
//鏈表長度函數
int LengthLink(LinkList &L)
{
int i=0;
LinkList p=L->next;
while(p)
{
p=p->next;
i++;
}
return i;
}

//合並函數
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 (p1&&p2)
{
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);

}

G. C語言中單鏈表的創建

struct infor
{
char name[10];//學生名稱
int age;//年齡
struct infor *next;//存儲下一個結構的地址
};//鏈表的數據結構

struct infor *head=NULL;//頭指針,指向第一個結構
struct infor *p,*c;//*p:是當前結構的前一個結構地址;*c:當前指針
char buf[10];//存放name的臨時數組
printf("Enter name:");//提示
while(scanf("%s",buf)==1 && buf[0]!='0')//name輸入0時結束
{
c=(struct infor *)malloc(sizeof(struct infor));//給結構分配內存
if(c==NULL)/無法分配內存
{
printf("No memory");
exit(1);
}
if(head==NULL)
{
head=c;//第一個結構地址
}
else
{
p->next=c;//下一個結構的地址
}
c->next=NULL;//表示最後一個結構
strcpy(c->name,buf);//拷貝name到鏈表中
printf("Enter age:");
scanf("%d",&c->age);//輸入年齡
p=c;//指向前一個節點
printf("Enter name:");
}
c=head;
while(c!=NULL)
{
printf("name=%s age=%d\n",c->name,c->age);
c=c->next;
}//讀取鏈表中的信息
printf("over\n");
c=head;
while(c!=NULL)
{
free(c);
c=c->next;
}//釋放內存
運行結果:
Enter name:Jim
Enter age:25
Enter name:Tom
Enter age:36
Enter name:Jack
Enter age:65
Enter name:0
name=Jim age=25
name=Tom age=36
name=Jack age=65
over
//以上程序直接加到主函數中運行正常

H. 數據結構C語言單鏈表的創建,插入刪除和合並程序代碼

你看這個應該滿足要求吧。我把三種循環方式都用上了:
#include<stdio.h>
#include<math.h>

int isprime(int n)
{
int i,t;
if(n==2)
return 1;
if(n%2==0 || n<2)
return 0;
for(i=3,t=(int)sqrt(n);i<=t;i+=2)
{
if(n%i==0)
return 0;
}
return 1;
}

void main()
{
int i,a,n;

i=0;
do
{
printf("Input an integer (>=1):");
scanf("%d",&a);
if(a>=1)
break;
}while(++i<3);

if(i==3) exit(0);

printf("prime submultiples:\n");

i=1;
n=0;
while(i<=a)
{
if(a%i==0)
if(isprime(i))
{
printf("%d ",i);
n++;
if(n%10==0)
printf("\n");
}
i++;
}