前言
学校里做的一些课上实验
1、建立一个含有整型数据的链表结构,并打印输出。
线索:
(1)新建一链表指针变量(此时,无表结构存在,仅有指向结点类型的指针存在),将书中的初始化、建表代码作为函数来调用;
(2)使用初始化函数产生一个带头结点的空链表;
(3)使用尾插法函数,通过不停的接受非$的数据来建立含有初始数据的非空链表。
(4)在建表调试成功后,需要仔细思考打印链表函数如何设计。
2、使用链表编写小型的学生信息管理系统
实现以下功能:
(1)学生信息的初始化(建表)
(2)按条件查找某个学生
(3)在要求的某个值的学生前插入一个新学生
#include <stdio.h>
#include <string.h>
//下列代码为第1小题
/*typedef struct Node
{
int data;
struct Node *next;
}Node,*LinkList;
void InitList(LinkList *L)
{
*L=(LinkList)malloc(sizeof(Node));
(*L)->next=NULL;
}
void CreateFromTail(LinkList L)
{
Node *r,*s;
int c;
int flag=1;
r=L;
while(flag)
{
scanf("%d",&c);//注意改写
if(c!=-1)
{
s=(Node *)malloc(sizeof(Node));
s->data=c;
r->next=s;
r=s;
}
else
{
flag=0;
r->next=NULL;
}
}
printf("链表建立完毕!");
}
void PrintList(LinkList L)
{
LinkList p;
p=L->next;
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
}
int main()
{
LinkList L;
printf("请输入数据序列:");
InitList(&L);
CreateFromTail(L);
PrintList(L);
}
*/
//下列代码为第2小题
struct STU
{
char id[10];
char name[10];
};
typedef struct Node
{
struct STU data;
struct Node *next;
}Node,*LinkList;
void InitList(LinkList *L)
{
*L=(LinkList)malloc(sizeof(Node));
(*L)->next=NULL;
}
void CreateFromTail(LinkList L)
{
Node *r,*s;
struct STU c;
int flag=1;
r=L;
while(flag)
{
printf("请输入学号:");
scanf("%s",c.id);//注意改写
if(strcmp(c.id,"$")!=0)
{
printf("请输入姓名:");
scanf("%s",c.name);
s=(Node *)malloc(sizeof(Node));
s->data=c;
r->next=s;
r=s;
}
else
{
flag=0;
r->next=NULL;
}
}
printf("链表建立完毕!");
}
Node * Locate(LinkList L,char key[],int *pos)
{ Node *p;
int m=0;
p=L->next; //从表中第一个结点比较
while(p!=NULL)
{ m++;
if (strcmp(p->data.name,key)!=0)
p=p->next;
else break; //找到结点key,退出循环
}
*pos=m;
return p;
}
//在单链表L中第i个结点之前插入值为e的新结点
int InsList(LinkList L,int i,struct STU e)
{
Node *p,*s;
int k=0;
if(i<0)
return -1;
p=L;
while(p!=NULL && k<i-1) //指针p指向第i-1个数据元素
{ p=p->next; k=k+1; }
if(p==NULL)
{ printf("插入位置不合理!"); return -1; }
s=(Node*)malloc(sizeof(Node)); //为e申请一个新的结点
s->data=e; //将待插入结点的值e赋给s的数据域
s->next=p->next; p->next=s;
return 1;
}
void PrintList(LinkList L)
{
LinkList p;
p=L->next;
printf("学生链表中现有如下学生:\n");
while(p!=NULL)
{
printf("\n%s %s ",p->data.id,p->data.name);
p=p->next;
}
}
int main()
{
LinkList L;
char key[10];
int pos;
Node *p;
struct STU newstu;
InitList(&L);
printf("第一题:先建立学生链表:\n");
CreateFromTail(L);
PrintList(L);
printf("\n第二题:请输入要查找的学生姓名:");
scanf("%s",key);
p=Locate(L,key,&pos);
if(p!=NULL) printf("找到该学生,其学号为%s\n",p->data.id);
else printf("无该学生\n");
printf("第三题:请输入在哪个姓名前插入新学生:");
scanf("%s",key);
p=Locate(L,key,&pos);
if(p!=NULL)
{
printf("请输入要插入的新生学号:");
scanf("%s",newstu.id);
printf("请输入要插入的新生姓名:");
scanf("%s",newstu.name);
InsList(L,pos,newstu);
}
else printf("无该学生\n");
PrintList(L);
}