#include <stdio.h>
#include <stdlib.h>
/*
1.创建结构体-----具体事物的抽象
2.创建链表
3.创建结点
4.插入 *** 作
4.1 表头插入
4.2 表尾插入
4.3 指定位置插入(指定位置的前面)
5.删除 *** 作
5.1 表头删除
5.2 表尾删除
5.3 指定位置删除
6.判断是否为空
7.打印链表
*/
//单链表的结构体
typedef struct SingleList
{
//数据域
int data //以这个数据为例
//struct MM myMM
//指针域
struct SingleList *next
}LIST,*LPLIST
/*
别名:习惯大写
起别名---小名
//好处:单词少,好看(含义更精简)
struct SingleList 换一种叫法: LIST
strcut SingleList * 换一种叫法: LPLIST
*/
//------->2.创建链表 ---任何结构都需要用一个东西去表示
LPLIST CreateList()
{
//创建过程就是初始化过程---初始化基本数据成员过程
//需要内存空间
LPLIST List = (LPLIST)malloc(sizeof(LIST))
if (List == nullptr)
{
printf("失败了\n")
system("pause")
exit(0)
}
//初始化基本数据成员----有表头的链表
List->next = nullptr
return List
}
//------->3.创建结点
LPLIST CreateNode(int data)
{
//1.需要内存敏银悔
LPLIST Node = (LPLIST)malloc(sizeof(LIST))
//2.初始化基本数据成员
Node->data = data //和创建链表多了数据域
Node->next = nullptr
return Node
}
//------->4.1 头插法
//函数写法:形参可以表示要 *** 作的东西
//插入的链表是(List),插入的数据是多少(data)
void InsertListHeadNode(LPLIST List,int data)
{
//插入:创建插入的结点
LPLIST newNode = CreateNode(data) //创建结点
//插入 *** 作
newNode->next = List->next
/*
c=1
b=2
a=c
c=b
*/
List->next = newNode
}
//------->4.2 尾插法
void InsertListTailNode(LPLIST List, int data)
{
//找到表尾--->定义一个移动的指针
LPLIST tailNode = List
while (tailNode->next != nullptr)
{
tailNode = 搏滚tailNode->next
}
//创建插入的结点
LPLIST newNode = CreateNode(data)
tailNode->next = newNode
}
//------->4.3 指定位置
void InsertListAppoinNode(LPLIST List, int data, int PosData)
{
//创建两个移动的指针:去找指定位置和指定位置的前面
LPLIST frontNode = List
//frontNode->next==taiNode:判断相邻
LPLIST tailNode = List->next
//判断是否为空
while (tailNode->data != PosData)
{
/*
frontNode=frontNode->next
tailNode=tailNode->next
*/
frontNode = tailNode
tailNode = frontNode->next
if (tailNode == nullptr)
{
printf("未找到指定位置\n")
system("pause")
exit(0)
}
}
//tailNode->data=data
//找到后创建插入的结点
LPLIST newNode = CreateNode(data)
frontNode->next = newNode
newNode->next = tailNode
}
//------->5.判断是否为空
//和创建的桥正时候比较
int IsEmptyList(LPLIST List)
{
if (List->next == nullptr)
return 1 //返回1表示为空
return 0 //表示不为空
}
////------->6.打印数据
void PrintList(LPLIST List)
{
if (IsEmptyList(List))
{
printf("链表为空,无法打印")
system("pause")
exit(0)
}
LPLIST pNext = List->next
while (pNext != nullptr)
{
printf("%d\t", pNext->data)
pNext = pNext->next
}
printf("\n")
}
//------->7.删除
//头删除
void DeleteListHeadNode(LPLIST List)
{
if (IsEmptyList(List))
{
printf("链表为空,无法删除\n")
system("pause")
exit(0)
}
LPLIST DNode = List->next
List->next = DNode->next
free(DNode)
DNode = nullptr
}
//------->8.尾删
void DeleteListTailNode(LPLIST List)
{
if (IsEmptyList(List))
{
printf("链表为空,无法删除\n")
system("pause")
exit(0)
}
//找到表尾--->定义一个移动的指针
LPLIST tailNode = List->next
LPLIST tailFront = List
while (tailNode->next != nullptr)
{
tailFront = tailNode
tailNode = tailFront->next
}
tailFront->next = nullptr
free(tailNode)
}
//------->9.指定位置删除
void DeleteListAppoinNode(LPLIST List, int PosData)
{
//创建两个移动的指针:去找指定位置和指定位置的前面
LPLIST frontNode = List
//frontNode->next==taiNode:判断相邻
LPLIST tailNode = List->next
//判断是否为空
while (tailNode->data != PosData)
{
/*
frontNode=frontNode->next
tailNode=tailNode->next
*/
frontNode = tailNode
tailNode = frontNode->next
if (tailNode == nullptr)
{
printf("未找到指定位置\n")
system("pause")
exit(0)
}
}
frontNode->next = tailNode->next
free(tailNode)
}
int main()
{
LPLIST List = CreateList() //List创建成功
printf("插入:\n")
InsertListHeadNode(List, 1)
InsertListHeadNode(List, 2)
InsertListHeadNode(List, 3)
InsertListTailNode(List, 0)
PrintList(List)
printf("删除:\n")
DeleteListHeadNode(List)
PrintList(List)
DeleteListTailNode(List)
PrintList(List)
printf("指定位置:\n")
//看不懂,可以找群主
InsertListAppoinNode(List, 4, 2)
InsertListAppoinNode(List, 3, 2)
//C/C++ 8群
PrintList(List)
// 491994603
DeleteListAppoinNode(List, 2)
PrintList(List)
system("pause")
return 0
}
向一个空顺序线性表中存入一系列数据元素,我使用了多种插入方式,而对你来说只需要其中一种方式,通过循环的方式去插入就好了.
#include "stdio.h"#include "stdlib.h"
#include "string.h"
typedef struct
{
int num
char name[10]
int grade
}student
typedef struct node
{
student date
struct node *next
}*link
link head = NULL
student creat(void)
{
student p
printf("请输握橡槐入学生学号:")
setbuf(stdin,(char *)0)
scanf("%d",&p.num)
printf("请输入学生名字:")
setbuf(stdin,(char *)0)
scanf("%s",p.name)
printf("请输入学生成绩:")
setbuf(stdin,(char *)0)
scanf("%d",&p.grade)
return p
}
void insert(student date)
{
link p = (struct node*)malloc(sizeof *p)
p->date=date
p->next=head
head=p
}
void output(void)
{
link p = head
printf("|----学号-----姓名-------成绩--|\n")
while(p!=NULL)
{
printf("|%-9d%-11s%-6d|\n",p->date.num,p->date.name,p->date.grade)
p=p->next
}
printf("|------------------------------|\n")
}
void init(void)
{
puts("*************欢迎使用信息查询系统*************")
puts("*\t+-------------------------+*")
puts("*\t| 1.添加记录|*")
puts("*\t| 2.显示所有记录|*")
puts("*\t| 0.保存退出|*")
puts("*\t+-------------------------+*")
puts("********************************************")
printf("\t请输入您的选择:")
}
int main()
{
int n
char cmd[10]
do{
//system("cls")
men:init()
setbuf(stdin,(char *)0)//清空输入流
scanf("%[^\n]",cmd)//接受除换行以外的所有字符存入cmd中段友,并加上'\0'标志
sscanf(cmd,"%d",&n)
/*处理当命令不符合条件的情况*/如旁
if(strlen(cmd) != 1 || n <0 || n >2 || !(*cmd >= '0' &&*cmd <= '2'))
{
printf("\t输入错误或没有这个选项!")
getchar()
getchar()
goto men
}
switch(n)
{
case 1:insert(creat())puts("\t添加成功!")break
case 2:output()break
case 0: return 0
default :break
}
printf("\tPress Enter To Continue!")
getchar()
getchar()
}while(n != 0)
return 0
}
*insertPtr = item //在第i个位置插入元素item==>打错了,item换悔岩前成val
L->listsize = L->listsize+10 //碧清存储空间增大100单元枣薯==>增大10单元
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)