⑴ 用c语言编写一个程序:用链表输入很多和学生的信息,要求实现增、删和查等功能
仅仅给你实现一个最基本的链表和功能,许多细节你自己添加,比如没有判断有没有重复的学生信息输入,如id重复。
还有删除是依靠姓名删除的,因为你的题目含糊不清,很多学生的信息具体是什么你也没有给出,只能给你个最基本的studentid 如果还有学科成绩什么的 自己在结构体中添加吧
后面你自己改了 最基本的给你写好
#include<stdio.h>
#include<string.h>
#include<stdbool.h>
#include<malloc.h>
typedef struct student student;
struct student{
int sid;//student id
char sname[30];
struct student *next;
};
//链表
student *linklist;
int len;
void init_linklist()
{
linklist=NULL;
len=0;
}
bool addstudent(int studentid,char *name)
{
student *p;
p=(student*)malloc(sizeof(student));
strcpy(p->sname,name);
p->sid=studentid;
len++;
p->next=linklist;
linklist=p;
return 1;
}
bool removestudent(char *name)
{
student *p=linklist;
student *tmp=p;
while(p!=NULL&&strcmp(p->sname,name)!=0)
{
tmp=p;
p=p->next;
}
if(p==NULL)//no find
return 0;
if(tmp==p)//说明是表头
{
linklist=p->next;
free(p);
len--;
return 1;
}
//非表头
tmp->next=p->next;
free(p);
len--;
return 1;
}
student* findstudent(char *name)
{
student *p=linklist;
while(p!=NULL&&strcmp(p->sname,name)!=0)
p=p->next;
if(p==NULL)
return 0;
else
return p;
}
void printlist()
{
student *p=linklist;
while(p!=NULL)
{
printf("name:%s studentID:%d\n",p->sname,p->sid);
p=p->next;
}
}
int main(void)
{
init_linklist();
addstudent(111,"limin");
addstudent(222,"xiaoc");
printlist();
removestudent("xiaoc");
printlist();
char na[30];
int si;
printf("input the student you want to add:\n");
scanf("%s %d",na,&si);
addstudent(si,na);
printlist();
return 0;
}
⑵ c语言单链表链表如何插入多个节点
如果已知一个节点指针pre和一个节点指针cur,要把cur插入到pre节点之后,很显然要保证链表不会断开而丢失后面的节点,要先把后面的节点指针(指向lat的指针)保存下来,即有cur->next = pre->next,然后把cur连接的一串链表连接到pre后面,即pre->next = cur;
上面介绍了,在一个节点之后插入节点的情况。这是通常的情况。如果要向一个链表的头部插入节点,就只需要将新节点的下一个指针指向链表的头指针即可。
在这种情况下,有两点要注意:
1,链表是否为空链表
2,要插入的节点是不是空指针。
代码实现:
//向单链表中插入一个节点(插入在链开始处)
//输入参数:单链表的头指针和要插入的节点指针
//输出参数:无
//返回值:指向单链表的头指针
SingleList* Insert(SingleList *head,SingleList *node)
{
if(node == NULL)
{
return head;
}
else if(head == NULL)
{
return node;
}
node->next = head;
head = node;
return head;
}