【数据结构】链式线性表的实现(姓名学号版)
四月镇楼!
因为考虑到姓名是用字符数组来存放的,那么在函数声明的时候需要对数组进行引用,这里和普通变量的引用有所不同,不再是简单的加一个&符号了,具体情况为()
#include <iostream>
void func(int (&a)[7])
{
......
......
}
int main()
{
int a[] = {1,2,3,4,5,6,7};
func(a);
return 0;
}
以上代码出处by kuimzzs
接下来是我的代码and运行效果图
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>
#define ERROR 0
#define OK 1
//类型定义
typedef int Status;
typedef char ElemType;
typedef struct LNode {
ElemType name[20];
int num;
struct LNode *next;
} LNode ,*LinkList;
//函数原型
Status GetElem_L(LinkList L,int i,ElemType (&e1)[20],int &e2);
Status ListInsert_L(LinkList &L,int i,char *e1,int e2);
Status ListDelete_L(LinkList &L,int i,ElemType (&e1)[20],int &e2);
void Print(LinkList L);
//获得元素并返回
Status GetElem_L(LinkList L,int i,ElemType (&e1)[20],int &e2)
{
// L是带头结点的链表的头指针,以 e 返回第 i 个元素
LinkList p;
int j=1;
p = L->next; // p指向第一个结点
while (p && j<i) //while(p!=NULL&&j<i)
{
p=p->next;
j++;
}
if (!p||j>i) //if(p==NULL||j>i)
return ERROR;
strcpy(e1,p->name);
e2=p->num;// 取得第 i 个元素
return OK;
}
//带头结点的单链表L中第 i 个位置之前插入元素 e
Status ListInsert_L(LinkList &L,int i,char *e1,int e2)
{
LinkList p,s;
int j=0;
p=L;
while(p&&j<i-1)
{
p=p->next;
j++;
}
if (!p||j>i-1)
return ERROR;
s=(LinkList)malloc(sizeof(LNode)); // 生成新结点
strcpy(s->name,e1); //e1给name 需要用字符串函数
s->num=e2; // 使新结点数据域的值为 e
s->next=p->next; // 将新结点插入到单链表 L 中
p->next=s; // 修改第 i-1 个结点指针
return OK;
}
// 删除第 i 个元素,并由 e 返回其值
// 这里是C++的数组引用
Status ListDelete_L(LinkList &L,int i,ElemType (&e1)[20],int &e2)
{
LinkList p,q;
int j=0;
p=L;
while (p->next && j<i-1)
{
p=p->next;
j++;
}
if (p->next==NULL || j>i-1)
return ERROR; // 删除位置不合理
q=p->next; // 用指针 q 指向被删除结点
p->next=q->next; // 删除第 i 个结点
strcpy(e1,q->name);
e2=q->num; // 取出第 i 个结点数据域值
free(q); // 释放第 i 个结点
return OK;
}
//输出
void Print(LinkList L)
{
LinkList p;
p=L->next;
printf("此时的线性表为:");
while(p)
{
printf("%d:%s ",p->num,p->name);
p=p->next;
}
printf("\n");
}
//主函数
int main(void)
{
LinkList L;
LinkList q,p;
int i,n,x,j,e2;
ElemType e1[20];
printf(" | 本程序有以下几种功能\n");
printf(" | 1.创建非空链表L\n");
printf(" | 2.在链表L第i位前插入元素\n");
printf(" | 3.删除链表L第i个元素\n");
printf(" | 4.查找链表L第i个元素\n");
printf(" | 5.将链表L输出\n");
printf(" | 0.退出该程序\n\n\n");
printf("输入要执行的程序:");
scanf("%d",&x);
while(x)
{
switch(x)
{
case 1:{
//为链表赋初值,创建非空链表
printf("要为链表存n个数据:");
scanf("%d",&n);
printf("请输入这%d个数据的姓名学号(用空格隔开):\n",n);
q=L=(LinkList)malloc(sizeof(LNode));
L->next=NULL; // 先建立一个带头结点的空链表
for (i=0;i<n;i++)
{
p=(LinkList)malloc(sizeof(LNode));
scanf ("%s",&p->name);
scanf ("%d",&p->num);
p->next=NULL ;
q->next=p;
q=p;
}
break;
}
case 2:{
//在第i位的元素之前插入元素;
printf("请输入插入位置,姓名,学号(中间用空格隔开):\n");
scanf("%d%s%d",&i,&e1,&e2);
ListInsert_L(L,i,e1,e2);
Print(L);
break;
}
case 3:{
//删除第i个元素;
printf("请输入删除第i个元素:");
scanf("%d",&i);
ListDelete_L(L,i,e1,e2);
printf("删除的元素:学号:%d 姓名:%s\n",e2,e1);
Print(L);
break;
}
case 4:{
//查找第i个元素,用e返回其值;
printf("请输入要查找第几号元素:");
scanf("%d",&i);
GetElem_L(L,i,e1,e2);
printf("查找到的元素为:姓名:%s 学号:%d\n",e1,e2);
Print(L);
break;
}
case 5:{
//输出链表;
Print(L);
break;
}
default:{
printf("输入有误,请重新输入!\n");
break;
}
}
printf("输入要执行的程序:");
scanf("%d",&x);
}
printf("程序运行完毕!");
return 0;
}
感谢阅读!