【数据结构】链式线性表的实现(姓名学号版)

四月镇楼!【数据结构】链式线性表的实现(姓名学号版)

因为考虑到姓名是用字符数组来存放的,那么在函数声明的时候需要对数组进行引用,这里和普通变量的引用有所不同,不再是简单的加一个&符号了,具体情况为()

#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;
} 


【数据结构】链式线性表的实现(姓名学号版)
感谢阅读!