如何用C语言创建一个链表,实现增、删、改、查

如何用C语言创建一个链表,实现增、删、改、查,第1张

#include<stdioh>

#include<stringh>

#include <malloch>

//先定义一种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->stnum=xh;

printf("请输入第%d个学生的姓名:",i);

scanf("%s",p->stname);

printf("请输入第%d个学生的成绩:",i);

scanf("%f",&p->stscore);

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->stnum=xh;

printf("请输入第%d个学生的姓名:",i);

scanf("%s",p->stname);

printf("请输入第%d个学生的成绩:",i);

scanf("%f",&p->stscore);

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%-101f\n",p->stnum,p->stname,p->stscore);

p=p->next;

}

//该函数能输出head所指的链表的所有结点值,输出形式如下:

/本函数输出线性表sq中所有数据,形式如下:

学号 姓名 分数

12 张三 2345

18 李四 9877

……… ……… ……/

}

//3、写出在链表中删除结点的函数

int del_link(NODE head,char name[])

{

NODE p,p1;

p=head->next;

p1=head;

while(p!=NULL)

{

if(strcmp(p->stname,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->stnum=xnum;

strcpy(q->stname,xname);

q->stscore=xscore;

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",&stnum);

printf("请输入要插入的学生的姓名:");

scanf("%s",stname);

printf("请输入要插入的学生的成绩:");

scanf("%f",&stscore);

//调用函数,在链表中把学生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("删除不成功");

}

}

 链表的创建:

#include “stdlibh”

#include “stdioh”

#define NULL 0

#define LEN sizeof(struct student)

struct student

{

long num;

float score;

struct student next;

};

int n;

struct student creat(void)

{

struct student head;

struct student p1,p2;

n=0;

p1=p2=(struct student )malloc(LEN);

scanf(“%ld,%f”,&p1->num,&p1->score);

head=NULL;

while(p1->num != 0)

{

n=n+1;

if(n == 1)

head = p1;

else

p2->next = p1;

p2 = p1;

p1 = (struct student )malloc(LEN);

scanf(“%ld,%f”,&p1->num,&p1->score);

}

p2->next = NULL;

return(head);

}

void main()

{

creat();

}

这样便可创建链表

以上就是关于如何用C语言创建一个链表,实现增、删、改、查全部的内容,包括:如何用C语言创建一个链表,实现增、删、改、查、如何实现C语言链表、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9854307.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-02
下一篇2023-05-02

发表评论

登录后才能评论

评论列表(0条)

    保存