一.定义
线性表是一种相当灵活的数据结构,其长度可以根据需要增长或缩短,不仅可以对线性表的数据元素进行访问,也可以进行插入和删除操作。
二.存储结构
(一)顺序存储
解释:存储地址连续,在进行删除和插入操作时间复杂度比较高
(二)链式存储
解释:每个结点包含数据域和指针域两部分,存储地址可能连续也可能不连续,在进行插入和删除操作时比较方便。
三.基本操作代码
(一)顺序结构基本操作
添加、 删除、 查找、 修改、 排序
/* 线性表之顺序存储的基本操作*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXSIZE 20
/*测试数据:
10
23
3
45
56
67
78
89
90
5
*/
//函数声明
void Menu(); //主菜单
int Array(int* S,int length); //初始化数组
void AddElement(int *S,int length); //添加元素
void DeleteElement(int *S,int length); //删除元素
void SearchElement(int *S,int length); //查找元素
void Modify(int *S,int length); //修改元素
void Sorted(int *S,int length); //顺序表排序
void Print(int *S,int length); //遍历顺序表
int main(){
static int length=0;
int S;
S = (int *)malloc(sizeof(int)*MAXSIZE);
int choice;
Menu();
while(1){
printf("请输入选择:\n");
scanf("%d",&choice);
switch(choice){
case 1: length=Array(S,length);
printf("长度:%d\n",length) ;break;
case 2:AddElement(S,length);break;
case 3:DeleteElement(S,length);break;
case 4:SearchElement(S,length);break;
case 5:Modify(S,length);break;
case 6:Sorted(S,length);break;
case 7:Print(S,length);break;
case 8:Menu();break;
default:printf("输入错误!\n");break;
}
}
return 0;
}
//选择菜单
void Menu(){
printf("\t******************************************\n");
printf("\t** 线性表(顺序存储)基本操作 **\n");
printf("\t** 1.初始化 **\n");
printf("\t** 2.添加元素 **\n");
printf("\t** 3.删除元素 **\n");
printf("\t** 4.查找元素 **\n");
printf("\t** 5.修改元素 **\n");
printf("\t** 6.元素排序 **\n");
printf("\t** 7.打印顺序表 **\n");
printf("\t** 8.显示菜单 **\n");
printf("\t******************************************\n");
}
//初始化数组
int Array(int* S,int length){
int total;
printf("请输入元素总个数:\n");
scanf("%d",&total);
length = total;
printf("请输入元素:\n");
for(int i=0;i<total;i++)
{
scanf_s("%d",S+i);
}
printf("初始化成功!\n");
return length;
}
//添加元素
void AddElement(int *S,int length)
{
int key;
printf("请输入关键元素:\n");
scanf("%d",&key);
S[length]=key;
printf("添加成功!");
}
//删除元素
void DeleteElement(int *S,int length){
int key,j,k;
printf("请输入删除的关键字:\n");
scanf("%d",&key);
j=length;
for(int i=0;i<j;i++){
if(S[i]==key){
for(k=i;k<j;k++){
S[k]=S[k+1];
}
length--;
printf("删除成功!\n");
break;
}
}
}
//查找元素
void SearchElement(int *S,int length){
int key,k;
printf("请输入要查找的关键字:\n");
scanf("%d",&key);
k=length;
for(int i=0;i<k;i++){
if(S[i]==key){
printf("查找成功,位置为:%d\n",i+1);
break;
}
}
}
//修改元素
void Modify(int *S,int length){
int i,key2;
int j=length;
printf("请输入要修改元素的下标:\n");
scanf("%d",&i);
printf("请输入修改后的元素:\n");
scanf("%d",&key2);
if(i<j){
S[i]=key2;
printf("修改成功!\n");
}
else{
printf("该下标对应单元存储无元素!\n");
}
}
//数组元素排序
void Sorted(int *S,int length){
int i,j,t;
for(i=0;i<length;i++)
for(j=i;j<=(length-i);j++){
if(S[j]>S[j+1]){
t=S[j];
S[j]=S[j+1];
S[j+1]=t;
}
}
if(i==length){
printf("排序成功!\n");
}
}
//遍历顺序表
void Print(int *S,int length){
printf("元素的总个数为:%d\n",length);
for(int j=0;j<length;j++){
printf("%d\t",S[j]);}
printf("\n");
}
(二)链式结构基本操作
/*线性表之链式存储结构基本操作 */
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode{
int data; //数据域
struct LNode *next; //指针域
}LNode,*LinkList;
//函数声明
void Menu(); //操作菜单
int* SetArray(int *S,int total); //初始化数组
LNode* InitList(LNode *L); //初始化单链表
void CreateList(LNode *L,int *S,int total); //创建单链表
int LengthList(LNode *L); //线性表的长度
void DispList(LNode *L); //遍历单链表
void AddList(LNode *L,int key); //添加关键字
void DeleteList(LNode *L); //删除关键字
void SearchList(LNode *L); //查找关键字
void ModifyList(LNode *L); //修改关键字
void SortedList(LNode *L); //关键字排序
int main()
{ int *S;
int choice;
int total;
int key;
printf("*******数据的初始化*******\n");
printf("请输入元素总个数:\n");
scanf("%d",&total);
S = SetArray(S,total);
LinkList L;
Menu();
while(1){
printf("请输入你的操作选择:\n");
scanf("%d",&choice);
switch(choice){
case 1:{L=InitList(L);
CreateList(L,S,total);}break;
case 2:{printf("请输入要添加的关键字:\n");
scanf("%d",&key);
AddList(L,key);}break;
case 3:{DeleteList(L);}break;
case 4:{SearchList(L);}break;
case 5:{ModifyList(L);}break;
case 6:{SortedList(L);}break;
case 7:{printf("遍历结果为:\n");
DispList(L); } break;
case 8:{Menu();} break;
default:printf("欢迎使用!");break;
}
}
}
void Menu(){
printf("\t******************************************************\n");
printf("\t** 线性表之链式存储基本操作 **\n");
printf("\t** 1.初始化 **\n");
printf("\t** 2.添加关键字 **\n");
printf("\t** 3.删除关键字 **\n");
printf("\t** 4.查找关键字 **\n");
printf("\t** 5.修改关键字 **\n");
printf("\t** 6.关键字排序 **\n");
printf("\t** 7.遍历关键字 **\n");
printf("\t** 8.显示主菜单 **\n");
printf("\t******************************************************\n");
}
//初始化单链表
LNode* InitList(LNode *L)
{
L = (LNode *)malloc(sizeof(LNode));
L->next = NULL;
printf("单链表已初始化!\n");
return L;
}
void CreateList(LNode *L,int *S,int total)//创建单链表
{
LNode* p=L;
int i;
LNode *s;//定义一个新结点
//给结点赋值关键字及信息
for(i=0;i<total;i++)
{
s = (LNode *)malloc(sizeof(LNode));//生成新结点
s->data=S[i];
//将新结点依次接入单链表
s->next = NULL;
p->next = s;
p = p->next;
}
printf("单链表创建成功!\n");
}
//遍历单链表
void DispList(LNode *L)
{
LNode * q = L->next;
printf("关键字信息为:\n");
while(q!=NULL)
{
printf("%d ", q->data);//关键字信息
q=q->next;
}
printf("\n\n");
}
int* SetArray(int *S,int total)
{
int i;
S = (int*)malloc(sizeof(int)*total); //动态分配内存空间
printf("请输入元素:\n");
for( i=0;i<total;i++)
{
scanf("%d",(S+i));
}
if(i==total){
printf("数据存储成功!\n");
}
return S;
}
//添加关键字
void AddList(LNode *L,int key)
{
LNode *s = (LNode *)malloc(sizeof(LNode));//生成新结点
if(s)
{
s->data=key;
s->next=L->next; //头插法
L->next=s;
printf("添加关键字成功!\n");
}
else
{
printf("生成结点失败!\n");
}
}
//删除关键字
void DeleteList(LNode *L){
int key,flag;
LNode* p=L->next,*q=L;
printf("请输入你想要删除的关键字:\n");
scanf("%d",&key);
while(p)
{
if(p->data==key){
q=q->next->next;
flag=1;
printf("删除成功!\n");
break;
}
else{
q=p;
p=p->next;
}
}
if(flag==0){
printf("关键字不存在!\n");
}
}
//查找关键字
void SearchList(LNode *L){
int key;
LNode *p=L->next;
int locate=1;
printf("请输入要查找的关键字:\n");
scanf("%d",&key);
while(p)
{
if(p->data==key)
{
printf("查找成功!\n");
printf("查找成功位置为:%d\n",locate);
break;
}
else{
p=p->next; //指针后移,位置加一
locate++;
}
}
}
//修改关键字
void ModifyList(LNode *L)
{
LNode *p=L->next;
int key1,key2;
printf("请输入要修改的关键字:\n");
scanf("%d",&key1);
printf("请输入修改后的关键字:\n");
scanf("%d",&key2);
while(p){
if(p->data==key1)
{
p->data=key2;
printf("修改成功!\n");
}
else{
p=p->next;
}
}
}
//线性表的长度
int LengthList(LNode *L)
{
LNode *p=L->next;
int length=0;
while(p){
length++;
p=p->next;
}
return length;
}
//线性表中的关键字排序
void SortedList(LNode *L)
{
LNode *p,*q;
int t;
int length=LengthList(L)-1;
while(length)
{
p=L->next;
q=p->next;
while(q!=NULL)
{
if(p->data>q->data){
t=p->data;
p->data=q->data; //交换指针所指向的元素值
q->data=t;
p=q; //指针后移
q=q->next;
}
else{
p=q;
q=q->next;
}
}
length--;
}
if(length==0){
printf("排序成功!\n");
}
}
成绩管理系统
/*用链式存储结构来实现简单的成绩管理系统*/
#include<stdio.h>
#include<math.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
typedef struct //学生基本信息
{
char ID[15];//学号
char name[10];//姓名
float math;//数学成绩
float chinese;//语文成绩
float english;//英语成绩
float average;//平均成绩
}Student;//别名
//结点
typedef struct _LNode
{
Student data; //数据域
struct _LNode* next; //指针域
}LNode; //别名
LNode* g_head =NULL; //头结点的初始化
//函数声明
int Judge(char user[]); //判断用户名是否符合
void Welcome(); //功能菜单
float Average(LNode* pnewstudent); //求学生成绩的平均值
void Inputinformation(); //输入学生信息
void Outputinformation(); //输出学生信息
void Delete(LNode* L,int n); //删除线性表某一学生信息
void Search(LNode*L); //查找学生信息
int Linklist_Length(LNode*g_head); //求线性表的长度
void Change(LNode*g_head); //修改学生信息
int UserPassword(); //用户初始页面,设置登陆账号和密钥
int main()
{ int i,n,choice;
i=UserPassword();
printf("\n");
while(i)
{Welcome();
while (1)
{
printf("请输入执行功能序号:\n");
scanf("%d",&choice);
switch (choice)
{
case 1: Inputinformation(); break;
case 2: Outputinformation(); break;
case 3:{ i=Linklist_Length(g_head);
printf("%d\n",i);
} break;
case 4: Search(g_head); break;
case 5: Change(g_head) ; break;
case 6:{ n=Linklist_Length(g_head);
Delete(g_head,n);
}; break;
case 0:printf("欢迎使用管理系统"); exit(0); break;
default:printf("你的输入信息有误,请从新输入");break;
}
printf("\n");
}
}
return 0;
}
int Judge(char user[]) //判断用户名是否符合
{
if(strlen(user)!=4)
{
printf("用户输入有误(用户字母不等于四)");
return 1;
}
else
{
printf("用户名设置成功!\n");
return 0;
}
}
void Welcome()//功能菜单
{
printf("\t***********************************************\n");
printf("\t* 欢迎使用学生成绩管理系统 *\n");
printf("\t***********************************************\n");
printf("\t* 请选择功能列表 *\n");
printf("\t* 1.请输入学生相关信息 *\n");
printf("\t* 2.打印学生信息 *\n");
printf("\t* 3.统计所有学生人数 *\n");
printf("\t* 4.查找学生信息 *\n");
printf("\t* 5.修改学生信息 *\n");
printf("\t* 6.删除学生信息 *\n");
printf("\t* 0.退出系统 *\n");
printf("\t***********************************************\n");
}
float Average(LNode* pnewstudent) //求平均数
{
return((pnewstudent->data.math+pnewstudent->data.chinese+pnewstudent->data.english)/3.0);
}
void Inputinformation() //输入 数据
{
//结点的插入
LNode* pnewstudent = (LNode*)malloc(sizeof(LNode)); //动态分配存储空间
pnewstudent->next = NULL;
//头插法:
if (g_head== NULL)
g_head = pnewstudent;
else
{
pnewstudent->next = g_head;//g_head存储的为下一节点的位置,在该位置插入节点
g_head= pnewstudent;//将新节点的地址存储在首元结点的指针域
}
printf("请输入学生学号:\n");
scanf("%s",pnewstudent->data.ID);
if(strlen(pnewstudent->data.ID)>15){
printf("你输入的学生号位数不符:");
}
printf("请输入学生姓名:\n");
scanf("%s",pnewstudent->data.name);
printf("请输入数学成绩:\n");
scanf("%f",&pnewstudent->data.math);
printf("请输入语文成绩:\n");
scanf("%f",&pnewstudent->data.chinese);
printf("请输入英语成绩:\n");
scanf("%f",&pnewstudent->data.english);
pnewstudent->data.average=Average(pnewstudent);
printf("录入学生信息成功:\n");
system("pause");//暂停
system("cls");//清屏
}
void Outputinformation()
{
printf("**************************************************************************************************************************\n");
printf("* 欢迎使用学生成绩管理系统 *\n");
printf("**************************************************************************************************************************\n");
printf("* 学号\t姓名\t数学成绩\t语文成绩\t英语成绩\t平均成绩 *");
printf("\n");
LNode* p = g_head;
while (p != NULL)
{
printf("%s\t%s\t%.2f\t\t%.2f\t\t%.2f\t\t%.2f\n", p->data.ID,
p->data.name,
p->data.math,
p->data.chinese,
p->data.english,
p->data.average
);
p = p->next;//必须指向下一个结点,否则会陷入死循环
}
printf("**************************************************************************************************************************\n");
}
void Delete(LNode* L,int n)//删除线性表某一结点
{
char s[10];
LNode* q;
LNode* m;
int i,j;
printf("请输入要删除的学生姓名");
scanf("%s\n",s);
q=L;
j=n;
for(i=0;i<j;i++)
{
if((strcmp(L->data.name,s))==0)
{
i=i+1;
break;
}
else
;
L=L->next;
q=L;
}
if(i>=j)
printf("不存在该学生信息\n");
q=L;
j=0;
while((L->next)&&(j<i-1))//查找第(i-1)个节点,p指向该节点
{
L=L->next;
++j;
}
m=L->next;
L->next=L->next;
free(q);
}
void Search(LNode*L)//查找学生信息
{
printf("请输入将要查找学生姓名:");
char s[15];
scanf("%s",s);
LNode*p,*q;
p=L;
while(p!=NULL){
if(strcmp(p->data.name,s)==0)
{
printf("**************************************************************************************************************************\n");
printf("* 学号\t姓名\t数学成绩\t语文成绩\t英语成绩\t平均成绩 *");
printf("%s\t%s\t\t%.2f\t\t%.2f\t\t%.2f\t\t%.2f", p->data.ID,
p->data.name,
p->data.math,
p->data.chinese,
p->data.english,
p->data.average
);
printf("**************************************************************************************************************************\n");
break;
}
else{
p=p->next;
}
}
if(p==NULL)
{
printf("系统中不存在该同学信息");
}
}
int Linklist_Length(LNode*g_head);
void Change(LNode*g_head);
int UserPassword()
{
char user[5],user2[5];
int n;
char password[7],password1[7];
printf("请输入用户名(四个英文字母):\n");
scanf("%s",user);
n=Judge(user);
while(n)
{
scanf("%s\n",user);
n=Judge(user);
}
printf("请输入密钥:(字母或数字六位)");
scanf("%s",password);
if(strlen(password)==6){
printf("密钥初始化成功!");
}
system("pause"); //暂停
system("cls"); //清屏
printf("登录\n\n");
printf("请输入用户名");
scanf("%s",user2);
while(1)
{
if(!strcmp(user,user2))//字符串比较函数,逐个字符进行比较
{
printf("用户名输入正确");
break;
}
else{
printf("用户名错误,请重新输入");
scanf("%s",user2);
}
}
printf("请输入登录密钥:\n");
for(int j=0;j<7;j++)
{
password1[j]=getch();
if(password1[j]=='\r')
{
password1[j]='\0';
}
printf("*");
}
while(1)
{
if(!strcmp(password1,password))
{
break;
}
else
{
printf("密钥错误,请重新输入密钥");
for(int j=0;j<7;j++)
{
password1[j]=getch();
if(password1[j]=='\r')
{
password1[j]='\0';
}
printf("*");
}
}
}
printf("输入密钥正确!");
return 1;
}
int Linklist_Length(LNode*L) //记录单链表长度
{
LNode* p1;
int m=1;
p1=L->next;
while(p1!=NULL)
{
m++;
L=L->next;
p1=L;
}
return m;
}
void Change(LNode*g_head)//改变学生信息
{
printf("请输入要更改的学生姓名:\n");
char name2[15];
scanf("%s",name2);
LNode* p2;
p2=g_head;
while(p2!=NULL)
{
if(strcmp(p2->data.name,name2)==0){
printf("学生信息存在该系统中:\n");
printf("请输入更改后的信息:\n");
printf("请输入学生姓名:\n");
scanf("%s",p2->data.name);
printf("请输入数学成绩:\n");
scanf("%f",&p2->data.math);
printf("请输入语文成绩:\n");
scanf("%f",&p2->data.chinese);
printf("请输入英语成绩:\n");
scanf("%f",&p2->data.english);
p2->data.average=Average(p2);
printf("修改学生信息成功:\n");
break;
}
else{
p2=p2->next;
}
}
}