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

進程創建鏈表c語言

發布時間: 2022-04-11 10:11:37

❶ 如何用c語言創建一個鏈表,實現增、刪、改、查

#include<stdio.h>
#include<string.h>
#include <malloc.h>
//先定義一種student類型,表示一個學生的信息,如下:
typedef struct student
{
int num; //表示學號
char name[30]; //表示姓名
float score; //表示分數
}student;
//定義一種NODE類型,表示一個結點信息,如下:
typedef struct node
{
student st; //表示一個學生的信息
struct node *next; //表示一個NODE類型的指針
}NODE;
//1、寫出建立一個帶頭結點的線性鏈表的函數,其中每個結點包括學號、姓名、分數三個數據域。函數形式如下:
NODE *creat_link(int direction)
{
NODE *head,*p,*tail;
int xh,i=1;
if(direction==1) //當direction的值為1時,新建立的結點連到尾部
{
tail=head=(NODE *)malloc(sizeof(NODE));
head->next=NULL;
printf("請輸入第%d個學生的學號:",i);
scanf("%d",&xh);
while(xh>0) //從鍵盤臨時輸入學生情況,當輸入的學號非正,則鏈表建立完畢
{
p=(NODE *)malloc(sizeof(NODE));
p->st.num=xh;
printf("請輸入第%d個學生的姓名:",i);
scanf("%s",p->st.name);
printf("請輸入第%d個學生的成績:",i);
scanf("%f",&p->st.score);
p->next=NULL;
tail->next=p;
tail=p;
i=i+1;
printf("請輸入第%d個學生的學號:",i);
scanf("%d",&xh);
}
}
else if(direction==0) //當direction為0時,新建立的結點成為第一個結點
{
head=(NODE *)malloc(sizeof(NODE));
head->next=NULL;
printf("請輸入第%d個學生的學號:",i);
scanf("%d",&xh);
while(xh>0) //從鍵盤臨時輸入學生情況,當輸入的學號非正,則鏈表建立完畢
{
p=(NODE *)malloc(sizeof(NODE));
p->st.num=xh;
printf("請輸入第%d個學生的姓名:",i);
scanf("%s",p->st.name);
printf("請輸入第%d個學生的成績:",i);
scanf("%f",&p->st.score);
p->next=head->next;
head->next=p;
i=i+1;
printf("請輸入第%d個學生的學號:",i);
scanf("%d",&xh);
}
}
return head;
}
//2、寫出輸出上述鏈表各結點數據域值的函數。該函數對應的函數需要一個形參,表示鏈表的頭指針,形式如下:
void print_link(NODE *head)
{
NODE *p;
p=head->next;
printf("%-10s%-20s%-10s\n","學號","姓名","分數");
while(p!=NULL)
{
printf("%-10d%-20s%-10.1f\n",p->st.num,p->st.name,p->st.score);
p=p->next;
}
//該函數能輸出head所指的鏈表的所有結點值,輸出形式如下:
/*本函數輸出線性表sq中所有數據,形式如下:
學號 姓名 分數
12 張三 234.5
18 李四 987.7
……… ……… …….*/
}
//3、寫出在鏈表中刪除結點的函數
int del_link(NODE *head,char name[])
{
NODE *p,*p1;
p=head->next;
p1=head;
while(p!=NULL)
{
if(strcmp(p->st.name,name)!=0)
{
p1=p;
p=p->next;
}
else
{
break;
}
}
if(p!=NULL)
{
p1->next=p->next;
free(p);
return 1;
}
else
{
return 0;
}
//刪除head所指的鏈表中,名字為name的結點,刪除成功返回1,不成功返回0
}
//4、寫出在鏈表中插入結點的演算法
int insert(NODE *head,student x,int wz)
{
NODE *p=head;
int i=0,jg;
if(wz<=0)
{
jg=0;
}
else
{
while(i<wz-1&&p!=NULL)
{
i++;
p=p->next;
}
if(p==NULL)
{
jg=0;
}
if(i=wz-1)
{
//找到wz前面的節點,p指向它
NODE *q;
q=(NODE *)malloc(sizeof(NODE));
q->st.num=x.num;
strcpy(q->st.name,x.name);
q->st.score=x.score;
q->next=p->next;
p->next=q;
jg=1;
}
}
return jg;
//該函數能夠在wz這個結點之前,插入一個新結點,新結點的數據域為x。插入成功返回1,不成功返回0。
}
//5、寫出主函數,分別調用上面演算法所對應的程序,建立鏈表,並輸出鏈表的值。
void main()
{
NODE *head; //定義指針變數head
int wz; //表示插入位置
char xm[30];
student st; //定義一個變數st,用來表示一個學生的信息
head=creat_link(1);
print_link(head); //調用函數建立鏈表,並把返回值送給head;
//調用函數,輸出鏈表中各個結點的值
//輸入一個學生的有關信息,送給變數st的有關成員
printf("\n\n請輸入要插入的位置:");
scanf("%d",&wz); //輸入wz的值
printf("請輸入要插入的學生的學號:");
scanf("%d",&st.num);
printf("請輸入要插入的學生的姓名:");
scanf("%s",st.name);
printf("請輸入要插入的學生的成績:");
scanf("%f",&st.score);
//調用函數,在鏈表中把學生st的值作為一個結點插入,如果插入成功,輸出新鏈表
if(insert(head,st,wz)==1)
{
printf("\n插入成功,新表為:\n");
print_link(head);
}
else
{
printf("插入不成功");
}
//調用函數,在鏈表中刪除一個指定結點的值,如果刪除成功,輸出新鏈表
printf("\n\n請輸入要刪除的學生的姓名:");
getchar();
gets(xm);
if(del_link(head,xm)==1)
{
printf("\n刪除成功,新表為:\n");
print_link(head);
}
else
{
printf("刪除不成功");
}
}

❷ c語言鏈表的創建

這個鏈表做得不好。其實鏈表可以不用創建這一步。因為插入操作已經包含有創建功能了。else後面的語句,就如同你給繩子打結一樣。鏈表的節點好比一段一段的繩子,現在你需要把它們都接起來。你每接一段,手就要往後移動一節,以准備給下一段打結。else後面的語句,其實就是讓當前指針指向的節點後移。
我給你個程序:
#include <stdio.h>
#include <stdlib.h>

typedef struct tagPERSON //個人信息結構
{
char name[20];
long age;
}PERSON;

//template<typename DT> //如果是C++的話,這里方便許多,可以使用模板和類
typedef struct tagLNODE* pLNODE;
typedef struct tagLNODE //鏈表節點
{
PERSON data;
pLNODE next;
}LNODE;

int link_insert(pLNODE *head,PERSON data)//鏈表插入
{
pLNODE cur_tmp,lnode_tmp;

cur_tmp=*head;
lnode_tmp=(pLNODE)malloc(sizeof(LNODE));
if(lnode_tmp==NULL)return -1;
lnode_tmp->data=data;
lnode_tmp->next=NULL;

if(*head==NULL)
*head=lnode_tmp; //如果head為空,則需要對main()中的head修改,所以head的類型為指向指針的指針
else
{
while(cur_tmp->next!=NULL)
cur_tmp=cur_tmp->next;
cur_tmp->next=lnode_tmp;
}

return 0;
}

int link_display_cmd(pLNODE head) //控制台下的鏈表顯示
{
pLNODE cur_tmp;

cur_tmp=head;
while(cur_tmp!=NULL)
{
printf("%s:%d\n",(cur_tmp->data).name,(cur_tmp->data).age);
cur_tmp=cur_tmp->next;
}
return 0;
}

int link_clear(pLNODE *head) //清空鏈表
{
pLNODE cur_tmp,old_tmp;

cur_tmp=*head;
while(cur_tmp!=NULL)
{
old_tmp=cur_tmp;
cur_tmp=cur_tmp->next;
free(old_tmp);
}

*head=NULL;
return 0;
}

int main(void)
{
pLNODE head=NULL;
PERSON temp;

printf("Please input the name:");
scanf("%s",temp.name);
printf("Please input the age:");
scanf("%d",&(temp.age));
while(temp.age>0)
{
link_insert(&head,temp);
printf("Please input the name:");
scanf("%s",temp.name);
printf("Please input the age:");
scanf("%d",&(temp.age));
}

link_display_cmd(head);
link_clear(&head);

return 0;
}

❸ 用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語言創建鏈表

void CreateList_H(Linklist L,int n)中的L是局部變數,你生成的頭結點L不能被返回,應該改為:
Linklist CreateList_H(int n)
調用方式和函數內部返回值都需要相應改動。

❺ 創建鏈表的C語言程序

typedef
struct
tagLinkList{
int
val;
struct
tagLinkList
*next;
}LinkList,*pLinkList;
void
main()
{
LinkList
*l,*h;
l=(pLinkList)malloc(sizeof(LinkList));
scanf("%d",&l->val);
h=l;
l=(pLinkList)malloc(sizeof(LinkList));
scanf("%d",&l->val);
h->next=l;
printf("1=%d\n",h->val);
l=h->next;
printf("2=%d\n",l->val);
}閑的無聊,給你寫個測試的,只是引導作用,可以參考

❻ 用C語言編程:創建一個鏈表 並在該鏈表的任意位置實現添加和刪除的功能,要求在同一個程序中完成!

以前給別人做的一個鏈表,給你用功能富裕了你看看吧:
#include
"stdio.h"
struct
Node
{

Node
*pNext;

int
value;
}*pTop;
struct
Node*
Insert(struct
Node
*pNode,int
Num);
void
Del(struct
Node
*pDelNode);
struct
Node*
Search(struct
Node
*pNode,int
Num);
void
main()
{

pTop=NULL;

int
i,k,x,y;

struct
Node
*pCurrentNode,*pTempNode;

/*(1)建立帶表頭結點的單鏈表;*/

for(i=0;i<30;i++)
Insert(NULL,i);/*建立一個有30個結點的鏈表*/

/*(2)輸出單鏈表中所有結點的數據域值;*/

pCurrentNode=pTop;

while(pCurrentNode!=NULL)

{

printf("%d->",pCurrentNode->value);/*遍歷這個鏈表並輸出其各結點的數據域*/

pCurrentNode=pCurrentNode->pNext;

}

/*(3)輸入x,y在第一個數據域值為x的結點之後插入結點y,若無結點x,則在表尾插入結點y;*/

printf("Input
x,y");

scanf("%d,%d",&x,&y);

pCurrentNode=Search(NULL,x);

Insert(pCurrentNode,y);

/*(4)輸入k,刪除單鏈表中所有的結點k,並輸出被刪除結點的個數。
*/

printf("Input
k");

scanf("%d",&k);

pCurrentNode=pTop;

i=0;

while(1)

{

pTempNode=Search(pCurrentNode,x);

if(pTempNode!=NULL)

{

pCurrentNode=pTempNode->pNext;

Del(pTempNode);

i++;

}

else
break;

}

printf("%d
Nodes
was
deleted",i);

pTempNode=pTop;

while(pTop!=NULL)

{

pTop=pTempNode->pNext;

delete
pTempNode;

}
}
Node*
Insert(struct
Node
*pNode,int
Num)
{

struct
Node
*pNewNode;

pNewNode=new
Node;

pNewNode->value=Num;

if(pNode==NULL)/*無確定插入位置時將結點放在鏈表最後*/

{

if(pTop!=NULL)/*確定鏈表是否是空表*/

{

pNode=pTop;

while(pNode->pNext!=NULL)
pNode=pNode->pNext;/*找到尾結點*/

pNode->pNext=pNewNode;

}

else

{

pTop=pNewNode;

}

pNewNode->pNext=NULL;

}

else/*有確定插入位置時將結點放在指定結點之後*/

{

pNewNode->pNext=pNode->pNext;

pNode->pNext=pNewNode;

}

return
pNewNode;
}
void
Del(struct
Node
*pDelNode)
{

if(pDelNode==NULL
||
pTop==NULL)
return;/*防錯處理*/

struct
Node
*pNode;

pNode=pTop;

while(pNode!=NULL
&&
pNode->pNext!=pDelNode)
pNode=pNode->pNext;/*找到指定結點的前導結點*/

if(pNode!=NULL)

{

pNode->pNext=pDelNode->pNext;

delete
pDelNode;

}
}
struct
Node*
Search(struct
Node
*pNode,int
Num)
{

struct
Node
*pSeaNode;

if(pNode==NULL)
pSeaNode=pTop;/*不指定搜索的起始位置,從表頭開始*/

else
pSeaNode=pNode;/*指定了搜索的起始位置,從指定位置開始*/

while(pSeaNode!=NULL
&&
pSeaNode->value!=Num)
pSeaNode=pSeaNode->pNext;

return
pSeaNode;/*沒有找到結點時返回空指針*/
}

❼ 用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,當然你也可以指向開頭一個數據塊形成一個循環鏈表

❽ 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);

}

❾ c語言創建鏈表

#include<stdio.h>
#include<stdlib.h>

struct chain
{
int value;
struct chain *next;
};

struct chain *create()
{
struct chain *head,*tail,*p;
int x;
head = tail = NULL;
while(scanf("%d",&x)==1)
{
p=(struct chain*)malloc(sizeof(struct chain));
p->value=x;
p->next=NULL;
if(head==NULL)
head = tail = p;
else
tail=tail->next=p;
}
return head;
}

struct chain *inlink(struct chain *head,int a,int b) //int a代表要插入的節點,int b代表創建節點的數據域
{
struct chain *p,*q,*s;
s = (struct chain *)malloc(sizeof(struct chain));
s->value=b;
if(head==NULL)
{
head = s;
head->next = NULL;
}
if(head->value == a)
{
s->next=head;
head = s;
}
else
{
p=head;
while((p->value!=a)&&(p->next!=NULL))
{
q=p;
p=p->next;
}
if(p->value == a)
{
q->next = s;
s->next = p;
}
else
{
p->next=s;
s->next=NULL;
}
}
return (head);
}

struct chain *dellink(struct chain *head,int a) //int a代表要刪除的節點
{
struct chain *q,*p;
if(head == NULL)
printf("找不到節點!\n");
else if(head->value == a)
{
p = head;
head = head->next;
}
else
{
p=head;
while((p->value!=a)&&(p->next!=NULL))
{
q=p;
p=p->next;
}
if(p->value != a)
printf("鏈表不存在此節點!\n");
else
{
q->next = p->next;
free(p);
}
}
return (head);
}

void main()
{
struct chain *p,*q;
q=create(); //鏈表的創建;
//q=inlink(create(),3,1); //鏈表的插入;
//q=dellink(create(),2); //鏈表的刪除;
while(q){ //輸出鏈表;
printf("%d\n",q->value);
p=q->next;
free(q);
q=p;
}
}
求採納為滿意回答。