A. c语言链表怎么通过节点数据查找节点进行插入或更改;
说一下一个大概的思路,首先定义两个指针,一个指针用来向前移动(叫当前指针),另一个指针紧跟其后(叫前驱指针),这个主要用于链表的增删,判断是否要删除当前指针指向的节点,或者增加节点。如果需要删除当前节点,则前驱指针的下一个节点指向当前指针的下一个节点,释放当前指针指向的节点,然后当前指针指向前驱指针的下一个节点,增加也是一样的,一直这样遍历整个链表。至于修改节点数据,那么需要一个当前指针就够了,找到要修改的节点,修改就好了。
闲着没事干,刚写了代码,给你参考一下:
//删除节点
voiddelete_node_credit(floatconstcredit){
stu*pre_node=head;
stu*cur_node=head->next;
while(cur_node){
if(cur_node->credit==credit){
pre_node->next=cur_node->next;
free(cur_node);
cur_node=pre_node->next;
}else{
pre_node=cur_node;
cur_node=cur_node->next;
}
}
//判断是否删除头节点
if(head->credit==credit){
cur_node=head->next;
free(head);
head=cur_node;
}
}
//新增节点
voidinsert_node_credit(stu*new_node,floatconstcredit){
stu*pre_node=head;
stu*cur_node=head->next;
if(pre_node->credit>credit){//新增节点是头节点
head=new_node;
new_node->next=pre_node;
return;
}
while(cur_node){
if(cur_node->credit<credit&&pre_node->credit>credit){
pre_node->next=new_node;//插入新的节点
new_node->next=cur_node;
return;
}
pre_node=cur_node;
cur_node=cur_node->next;
}
//新增节点插入链表尾部
if(pre_node->credit<credit){
pre_node->next=new_node;
return;
}
}
下面是运行结果
如果你看理解了这个思路,那么链表的增删查改操作就没有问题了。有用的话点一下采纳,谢谢!!!
B. c语言程序修改:建立链表
1、申请分配内存后,应该检查是否成功分配了;
2、你没有保存链表的头指针。在生成链表的过程中,头指针丢了。你应该有一个变量在程序运行过程中一直保存头指针,用其他变量执行生成和输出的操作;
3、生成链表的过程中没有明确给新节点的NEXT赋NULL;
4、你的输出过程也有问题,一般应该是看其NEXT是否为NULL来判断结束的,未结束则应该指向其NEXT。你这里指针一直没变,而且还是个未赋值的指针;
5、输入的时候scanf应该是用变量地址。
C. C语言链表修改问题.
1.关于insert如下修改
struct student *insert(void)
{
#define NULL 0
int Dim;
struct student *head,*pf,*pb;
int i;
head=NULL;
for(i=0;i<2000;i++)
{
pb=(struct student*) malloc(sizeof (struct student));
if(NULL == pb)
{
printf("malloc fail!\n");//添加空间申请失败检查!
return head;
}
printf("Please insert Name, Gender, Age,Ecation,Address,Tel\n");
scanf("%s,%s,%d,%s,%s,%ld\n",pb->Name,pb->Gender,&pb->Age,pb->Ecation,pb->Address,&pb->Tel);//对应的输入方式修改
if(i==0)
{pf=head=pb;}
else { pf->next=pb;
pb->next=NULL;
pf=pb;}
printf("%d",head->next->Age);
printf("Continue?1 - y 2 - n\n");
scanf("%d",&Dim);
if (Dim==2)
{i=3000;}
}
return head;
}
意思是:
A.依次申请空间,建立链表节点,若空间申请失败则推出!
B.每输入一次,询问是否继续建立节点,输入数字2则退出!
2.函数 change1
struct student *change1(char NAME[96],struct student *head)
{
char flag = 1;
struct student *pf,*pb;
for(pb=head;pb!=NULL;pb=pb->next)
{
if(strcmp(NAME,pb->Name)==0)
{
printf(“找到相应名字的元素,请修改相应的Ecation\n");
printf("Please insert New ecation grade;");
scanf("%s",pb->Ecation);
flag = 0;
}
}
if(1 == flag)
{
printf(“没有相应名字的元素\n");
}
}
意思是:
输入元素的名字,及链表头,查找相应名字的元素,修改Ecation的值!
我帮你添加了一些调试用的句子!
D. C语言中链表的修改
字符串处理有问题,就是char nam[30];
输入字符串,scanf("%s",stu.nam);//不用加取址符
而且,下面赋值nam的时候
最好用strcpy,字符串复制函数
E. 如何用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("删除不成功");
}
}
F. c语言使用链表进行学生信息管理代码怎么修改
这太多了,懒得写
G. 如何用C语言创建一个链表,实现增、删、改、查
#include
H. C语言单链表 求大神教教怎么修改
#include<stdio.h>
#include<stdlib.h>
typedefstructnode
{
intdata;
structnode*next;
}node;
intmain(void){
intnum;
node*p,*head;
head=NULL;
do{
scanf("%d",&num);
if(num!=-1)
{
p=(node*)malloc(sizeof(node));
p->data=num;
p->next=NULL;
if(head==NULL)
head=p;
else
p->next=head;
head=p;
}
}while(num!=-1);
while(p!=NULL){
printf("%d",p->data);
p=p->next;
}
printf(" ");
return0;
}
已经修改好了,有问题如果问错在哪可以追问
I. C语言——链表的修改
#include <stdio.h>
#include <stdlib.h>
#define LEN sizeof(struct student)
struct student
{
int num;
char name[20];
float score[3];
struct student *next;
};
int n=0;
struct student *creat(void) //建立链表
{
struct student *head,*p1,*p2;
p1=p2=(struct student *)malloc(LEN);
head=NULL;
scanf("%d %s %f %f %f",&p1->num,p1->name,&p1->score[0],&p1->score[1],&p1->score[2]);
while(p1->num!=0)
{
n=n+1;
if(n==1)
head=p1;
else p2->next=p1;
p2=p1;
p1=(struct student *)malloc(LEN);
scanf("%d %s %f %f %f",&p1->num,p1->name,&p1->score[0],&p1->score[1],&p1->score[2]);
}
p2->next=NULL;
return (head);
}
void main() //main函数
{
struct student *insert(struct student *head,struct student *stu);
struct student *del(struct student *head,int num);
struct student *p, *b,*stu;
int m,flag=1,flag1=1,flag2=1;
b=p=creat();
printf("now,there are %d crunodes are:\n",n);
for(;p!=NULL;)
{
printf("%d%10s%8.2f%8.2f%8.2f\n",p->num,p->name,p->score[0],p->score[1],p->score[2]);
p=p->next;
}
while(flag2!=0) //控制开关
{
printf("if you input '1' that you will have the funtion to delete the crunode\nif you input '2' that you will have the funtion to insert crunode.\nif you input '0' that you will end.\n");
printf("what you want to enter 1 ,2 or 0:");
scanf("%d" ,&flag2);//选择功能,是增加结点还是删减结点
if(flag2==1)
{
while(flag)
{
printf("delete the crunode(结点):");
scanf("%d",&m);
p=del(b,m);
if(n==0)
{
b=p;
flag=0;
break;
}
b=p;
printf("now,there are %d crunodes are:\n",n);
for(;p!=NULL;)
{
printf("%d%10s%8.2f%8.2f%8.2f\n",p->num,p->name,p->score[0],p->score[1],p->score[2]);
p=p->next;
}
printf("contiune or not(0/1):");
scanf("%d",&flag);
}
}
if(flag2==2)
{
while(flag1)
{
if(flag)//第一次是不执行这句的
{
if(n==0) b=NULL;
p=insert(b,stu);
b=p;
printf("now,there are %d crunodes are:\n",n);
for(;p!=NULL;)
{
printf("%d%10s%8.2f%8.2f%8.2f\n",p->num,p->name,p->score[0],p->score[1],p->score[2]);
p=p->next;
}
printf("continue or not :(0/1):");
scanf("%d",&flag1);
if(flag1==0) break;
}
//起到控制整个while循环的作用
printf("please input the imformation of the student who you want to add:");
stu=(struct student *)malloc(LEN); //申请内存
scanf("%d %s %f %f %f",&stu->num,stu->name,&stu->score[0],&stu->score[1],&stu->score[2]);//输入学生的信息
flag=1;
// 起到控制作用,目的是为了第一次不执行上上个if语句
}
}
}
}
struct student *del(struct student *head,int num) //删除结点
{
struct student *p1,*p2;
if(head==NULL)
{
printf("this is list null.\n");
return head;
}
else
p1=head;
while(num!=p1->num && p1->next!=NULL)
{
p2=p1;p1=p1->next; //一个一个的下去
}
if(num==p1->num)
{
if(p1==head) //才一个结点
{
head=p1->next;
free(p1);
}
else //不止一个结点
{
p2->next=p1->next;
free(p1);
}
n=n-1;
printf("delete:%d\n",num);
printf("there are %d crunode(结点) now.\n",n);
}
else
printf("%d crunode(结点) has not been found!\n",num);
if(n==0) //如果删除结点后结点个数为0
return NULL;
else
return (head);
}
struct student *insert(struct student *head,struct student *stu) //增加结点
{
struct student *p1,*p2,*p0;
p1=head;
p0=stu;
if(head==NULL)
{
head=p0;
p0->next=NULL;
}
else
{
while(p0->num>p1->num && p1->next!=NULL)
{
p2=p1;p1=p1->next;
}
if(p0->num<=p1->num)
{
if(head==p1) //插到第一个结点前
{
head=p0;
p0->next=p1;
}
else
{
p2->next=p0;
p0->next=p1;
}
}
else
{
p1->next=p0;
p0->next=NULL;
}
}
n=n+1;
return(head);
}
我正好学到链表的,所以就话了一个晚上来做了这个,我哦完善了一下,如果有什么不满意的话,或有什么不懂的话你可以加QQ419842687
J. 求大神将这段c语言代码怎么改成用链表的,谢谢
链表就是在你现有结构成员中添加一个指针成员,每个结构变量的指针指向下一个结构变量,就组成了链表。对链表的增删改查就是通过这个指针来实战。
你原代码用的是结构数组。
要改成链表,不是改,而且全部要重写。
函数传递参数也不能用结构数组而改用链表首节点或头节点以及尾指针。
注意:我代码中学生学号应该是唯一的,不能重复,我没有写验证,你自己添加输入验证,学号最好是用一个变量自增。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#include<windows.h>
#include<malloc.h>
typedef struct student
{
char no[15]; /*学号*/
char name[30]; /*姓名*/
int age; /*年龄*/
char sex[5]; /*性别*/
char bir[30]; /*出生年月*/
char add[30]; /*地址*/
char tel[13]; /*电话*/
char e_mail[30]; /*电子邮件*/
char zhuanyebanji[40]; /*专业班级*/
struct student *next;//链表指针
}STU;
int main()
{
int num,i;
char no[15];
STU *stuHead=(STU *)malloc(sizeof(STU)),*stuTail=NULL;
if(stuHead)
stuHead->next=NULL;
int write(STU *stuHead,STU **stuTail);//录入一条学生信息生成一个链表节点,成功返回1,失败返回0
int read(STU *stuHead);//读取链表,遍历链表所有节点,返回节点个数
STU *search(STU *stuHead,char *no);//通过学号查询,返回查询到的节点
int modify(STU *stuHead,char *no);//修改指定学生信息,成功返回1,失败返回0
int del(STU *stuHead,STU **stuTail,char *no);//删除指定学生信息,成功返回1,失败返回0
int tongji(STU *stuHead);//不知道你要统计什么,自己参照我的代码写吧
for(i=0;;i++)
{
printf("------------------------------欢迎使用学籍管理系统------------------------------");
printf(" ");
printf(" ");
printf(" 1、添加学生信息 2、查询学生信息 ");
printf(" ");
printf(" ");
printf(" 3、修改学生信息 4、浏览学生信息 ");
printf(" ");
printf(" ");
printf(" 5、删除学生信息 6、统计学生信息 ");
printf(" ");
printf(" ");
printf(" 7、退出 ");
printf(" ");
printf(" ");
printf("-------------------------------------------------------------------------------");
printf(" ");
printf(" ");
printf("请选择要进行的操作:");
system("color F0");
scanf("%d",&num);
switch(num)
{
case 1:if(!write(stuHead,&stuTail))printf("异常!新增信息失败! ");
break;
case 2:printf("输入要查找的学生学号:");scanf("%s",no),search(stuHead,no);
break;
case 3:printf("输入要修改的学生学号:");scanf("%s",no);if(!modify(stuHead,no))printf("异常!修改失败! ");
break;
case 4:system("cls");read(stuHead);
break;
case 5:printf("输入要删除的学生学号:");scanf("%s",no);del(stuHead,&stuTail,no);
break;
case 6:tongji(stuHead);
break;
}
}
return 0;
}
int write(STU *stuHead,STU **stuTail)
{
STU *stuNew=(STU *)malloc(sizeof(STU));
if(!stuNew)
return 0;
stuNew->next=NULL;
printf("请输入要新建的学生信息: ");
printf("学号:"),scanf("%s",stuNew->no);
printf("姓名:"),scanf("%s",stuNew->name);
printf("年龄:"),scanf("%d",&stuNew->age);
printf("性别:"),scanf("%s",stuNew->sex);
printf("出生年月:"),scanf("%s",stuNew->bir);
printf("地址:"),scanf("%s",stuNew->add);
printf("电话:"),scanf("%s",stuNew->tel);
printf("专业班级:"),scanf("%s",stuNew->zhuanyebanji);
if(!stuHead->next)
stuHead->next=stuNew;
else
(*stuTail)->next=stuNew;
(*stuTail)=stuNew;
return 1;
}
int read(STU *stuHead)
{
int cnt=0;
printf("链表信息: ");
while(stuHead->next)
{
printf("-------------------------- ");
printf("学号:%s ",stuHead->next->no);
printf("姓名:%s ",stuHead->next->name);
printf("年龄:%d ",stuHead->next->age);
printf("性别:%s ",stuHead->next->sex);
printf("出生年月:%s ",stuHead->next->bir);
printf("地址:%s ",stuHead->next->add);
printf("电话:%s ",stuHead->next->tel);
printf("专业班级:%s ",stuHead->next->zhuanyebanji);
printf("-------------------------- ");
cnt++;
stuHead=stuHead->next;
}
return cnt;
}
STU *search(STU *stuHead,char *no)
{
while(stuHead->next)
{
if(!strcmp(stuHead->next->no,no))
{
printf("学号%s的学生信息为: ",no);
printf("学号:%s ",stuHead->next->no);
printf("姓名:%s ",stuHead->next->name);
printf("年龄:%d ",stuHead->next->age);
printf("性别:%s ",stuHead->next->sex);
printf("出生年月:%s ",stuHead->next->bir);
printf("地址:%s ",stuHead->next->add);
printf("电话:%s ",stuHead->next->tel);
printf("专业班级:%s ",stuHead->next->zhuanyebanji);
return stuHead->next;
}
stuHead=stuHead->next;
}
printf("未找到指定的学生信息! ");
return NULL;
}
int modify(STU *stuHead,char *no)
{
STU *stu=search(stuHead,no);
if(!stu)
return 0;
printf("请输入要修改的信息: ");
printf("学号:"),scanf("%s",stu->no);
printf("姓名:"),scanf("%s",stu->name);
printf("年龄:"),scanf("%d",&stu->age);
printf("性别:"),scanf("%s",stu->sex);
printf("出生年月:"),scanf("%s",stu->bir);
printf("地址:"),scanf("%s",stu->add);
printf("电话:"),scanf("%s",stu->tel);
printf("专业班级:"),scanf("%s",stu->zhuanyebanji);
printf("信息修改成功! ");
return 1;
}
int del(STU *stuHead,STU **stuTail,char *no)
{
int flag=0;
STU *stu=NULL,*stuHSave=stuHead;
while(stuHead->next)
{
if(!strcmp(stuHead->next->no,no))
{
stu=stuHead->next;
stuHead->next=stuHead->next->next;
free(stu);
stu=NULL;
flag=1;
stuHead=stuHSave;
}
stuHead=stuHead->next;
}
if(flag)
(*stuTail)=stuHead;
else
{
printf("未找到对应学号的学生!删除失败! ");
return 0;
}
return 1;
}
int tongji(STU *stuHead)
{
return 1;
}