学生单链表C++,谢谢你的浏览,希望对您有所帮助!

1.首先建立学生的结构体,还有数据域,Node *next头指针等;

#include<stdio.h>
#include<malloc.h>
#include <iostream>
#include <string>
#include<typeinfo>
#define Maxsize 50
typedef struct Student    //建立学生结构体 
{
	char id[50];
	char name[50];
	int age;
}Stu;
typedef struct Node
{
	Stu data;
	struct Node *next;
}LinkList;

2.创建一个空链表

void initList(LinkList *&L)
{
	L=(LinkList *)malloc(sizeof(LinkList));
	L->next=NULL;
 } 

3.我们利用循环建立数据节点

 void CreateListF(LinkList *&L,Stu a[],int n)
 {
 	LinkList *s;
	int i;
 	for (i=0;i<n;i++)      //for循环建立数据节点 
 	{
 		s=(LinkList *)malloc(sizeof(LinkList));
 		s->data=a[i];
		s->next=L->next;
 		L->next=s;
	 }
 }

4.我们如果想在后续实现插入操作,可以建立一个函数,来实现插入操作

无论是插入还是从删除都需要先判断链中寻找的那个数据是否为NULL

 bool CreateListH(LinkList *&L,Stu b,int n)
 {
 	int j=0;
 	LinkList *p=L,*s;
 	while(j<n-1&&p!=NULL)
 	{
 		j++;//定位,找到想要插入到第几个位置的那个节点的上一个节点,即第i-1个节点
 		p=p->next;
	}
	if(p==NULL){
	    return false;
	}
	else
	{
		s=(LinkList *)malloc(sizeof(LinkList));//建立一个新指针 
		s->data=b;//插入的哪个元素的信息存入指针s的数据域 
		s->next=p->next;//先将p->next链接给s,防止断链 
		p->next=s;//再将s链到p->next上,实现插入 
		return true;
	}
 }

在选择时应该先找到所要插入的位置的前一个元素,将指针指向它。

注意!在插入时,不能直接p->next=s,如果这样会导致断链,应该先将s和p->next连接,即s->next=p->next,这样就可以将s先连接到p->next,不会断链,再将p->next=s,实现插入操作。

5.建立一个函数实现删除操作

 bool ListDelete(LinkList *&L,int i,Stu &c)
 {
 	int j=0;
 	LinkList *p=L,*s;
 	while(j<i-1&&p!=NULL)
 	{
 		j++;   //定位,找到想要删除的那个节点的上一个节点,即第i-1个节点 
 		p=p->next;
	}
	if(p==NULL)
	    return false;
	else
	{
		s=p->next; //将需要删除的第i个节点连接到空指针s上 
		if(s==NULL){
		    return false;
		}
		c=s->data;
		p->next=s->next;//让第i-1个节点连接到第i+1个节点,相当于删除第i个节点 
		free(s);
		return true;   //返回true表示成功删除 
	}
 }

在这里要注意的是,要先将要删除的数据储存起来,先将s=p->next,再将p->next=s->next,实现将需要删除的元素隔去,两边数据元素相连,保证链表不断,最后free(s)。

6.单链表逆置函数

ListReverse(LinkList* L)
{   // 将带表头节点的单链表逆置
    LinkList *q, *p, s;
    p = L;
    p = p->next;
    L->next = NULL;
    while(p) // 因为 while 中有 p = p->next 所以终止条件不用写成 p->next
    {
        q = p;
        p = p->next;
        q->next = L->next; // q 节点指向现在的 L 的首元结点。这一行加上下一行相当于一个插入操作
        L->next = q;
    }
 
    return true;
}

逆置就是头尾互换嘛,比如1122233逆置后就是3322211

7.显示学生单链表中学生的信息

void dispList(LinkList* L)
{
	LinkList *p=L->next;
	int i=1;
	printf("\n-------学生表-------\n");
	while(p!=NULL)
	{
		printf("--第%d位:%s   %s   %d\n",i,p->data.id,p->data.name,p->data.age);
		p=p->next;
		i++;
	}
	printf("---------------------\n");
	
}

8.实现(整合)

void menu1()
{
	printf("---------------------\n");
	printf("---------------------\n");
	printf("---------------------\n");
	printf("---------------------\n");
	printf("---------------------\n");
	printf("---------------------\n");
	printf("---------------------\n");
	printf("---------------------\n");
	printf("-----学生表的应用----\n");
	printf("----1.增加学生信息---\n");
	printf("----2.删除学生信息---\n");
	printf("----3.显示学生信息---\n");
	printf("----4.学生信息逆置---\n");
	printf("----5.!!退出!!!---\n");
}
main()
{
	LinkList *h;
	int flag=1,j,i;
	Stu stu[4]={"004","周",16,"003","吴",17,"002","郑",18,"001","王",19},e;
	menu1();
	printf("--1.初始化学生表的单链表\n");
	initList(h);
	printf("--2.前插法插入学生信息\n");
	CreateListF(h,stu,4);
	printf("--3.显示单链表(学生表)信息\n"); 
	dispList(h);
	while(flag==1)
	{
		printf("请选择你想实现的操作:\n");
		scanf("%d",&j);
		switch(j)
		{
			case 1:
				Stu e;
			    printf("请依次输入学生的id,姓名,年纪:");
			    scanf("%s%s%d",&e.id,&e.name,&e.age);
			    printf("请输入插入的位置:");
			    scanf("%d",&i);
			    fflush(stdin);
			    CreateListH(h,e,i);//调用函数bool CreateListH(LinkList *&L,Stu b,int n),实现插入 
			    printf("成功!!!\n");
			    break; 
			case 2:
				printf("请输入删除的位置:");
				scanf("%d",&i);
				ListDelete(h,i,e);//调用函数bool ListDelete(LinkList *&L,int i,Stu &c),实现删除 
				printf("成功!!!\n"); 
				break;
			case 3:
			    dispList(h);//调用函数void dispList(LinkList* L), 显示单链表存储的信息
			    printf("成功!!!\n"); 
				break;
			case 4:
			    ListReverse(h);//调用函数ListReverse(LinkList* L),实现逆置 
			    printf("成功!!!\n"); 
				break;
		    case 5:
			    flag=0;
				printf("!!退出!!\n");
				break; 
			
		 } 
	 } 
 } 

这个代码还实现了,只要用户不想退出,没有输入错误,就可以一直实现操作!

谢谢您的浏览,希望可以帮到您,小伙伴们,加油!!!

上一篇:winServer2003除默认端口外的其他端口只能本地访问,关闭防火墙即可


下一篇:python源码中的学习笔记_第10章