一、实验目的
1.深入了解线性表的链式存储结构。
2.熟练掌握在链式存储结构上进行插入、删除等操作的算法。
3.通过线性表结构解决现实中的一些问题。
二、实验内容
1. 线性表的链式存储结构。
2. 链式存储结构上进行插入、删除等操作的算法。
3. 通过线性表结构解决现实中的一些问题。
#include <stdio.h>
#include <malloc.h>
typedef int Elemtype;
typedef struct node{
int data;
struct node *next;
}Node,*LinkList;
LinkList L;
1.从表头建立
2.从表尾建立
3.求长
4.按位查找
5.按值查找
6.插入
7.删除
8.打印链表
测试
1.链表建立
2.序号查找
3.按位查找
4.删除
5.求长
6.插入
完整源码
#include <stdio.h>
#include <malloc.h>
typedef int Elemtype;
typedef struct node{
int data;
struct node *next;
}Node,*LinkList;
LinkList L;
//在表头插入结点
LinkList Create1(){
L = NULL; //定义L为空链表
int x; //设数据元素为int类型
Node *s;
scanf("%d",&x);
while(x!=-1){
s = (Node*)malloc(sizeof(Node)); //申请内存
if(s==NULL){
printf("申请内存空间失败!");
break;
}
s->data = x;
s->next = L;
L = s;
printf("请继续输入(-1结束):");
scanf("%d",&x);
}
return L; //返回头指针,通过头指针可以遍历该链表
}
//在表尾插入结点
LinkList Create2(){
L = NULL;
Node *s; //定义结点
Node *r; //定义尾指针,永远指向最后一个结点
int x;
s = (Node*)malloc(sizeof(Node)); //定义头结点,申请内存
if(s==NULL){
printf("申请内存空间失败!");
}
s->next = NULL;
L = s;
r = s;
scanf("%d",&x);
while(x!=-1){
s = (Node*)malloc(sizeof(Node));
if(s==NULL){
printf("申请内存空间失败!");
break;
}
s->data = x;
s->next = NULL;
r->next = s; //将尾结点的next指向最新的结点
r = s; //尾指针指向最新的结点
printf("请继续输入(-1结束):");
scanf("%d",&x);
}
return L;
}
//求长
int Length1(LinkList L){
Node *p = L;
int j=0;
while(p->next){
p = p->next;
j++;
}
return j;
}
//求长 (带头结点)
int Length2(LinkList L){
Node *p = L; //非空表下指向的就是第一个结点
int j=0;
while(p){
j++;
p = p->next;
}
return j;
}
//查找(序号)
Node *Get(LinkList L,int i){
Node *p = L;
int j=0;
while(j<i&&p->next!=NULL){
p = p->next;
j++;
}
if(j==i)
return p;
else
return NULL;
}
// 按值查找
Node *Locate(LinkList L,int x){
Node *p = L->next;
while(p!=NULL&&p->data!=x){
p = p->next;
}
return p;
}
//插入
int Insert(LinkList L,int i,int x){
Node *p,*s;
p = Get(L,i-1); //获取第i-1个结点
if(p==NULL){
printf("参数i错误!\n");
return 0;
}
else{
s = (Node*)malloc(sizeof(Node)); //申请、填装结点
if(s==NULL){
printf("申请内存空间失败!");
return 0;
}
s->data = x;
s->next = p->next;
p->next = s;
return 1;
}
}
//删除结点
int Delete(LinkList L,int i){
LinkList p,s;
p = Get(L,i-1); //获取第i-1个节点
if(p==NULL){
printf("第i-1个结点不存在\n");
return -1;
}else if(p->next==NULL){
printf("第i个结点不存在");
return 0;
}else{
s = p->next;
p->next = s->next;
free(s); //释放*s;
return 1;
}
}
//遍历链表
void Recycle(LinkList L){
Node *p = L->next;
int i=0;
while(p){
i++;
printf("---->|结点%d->数据:%d|\n",i,p->data);
p = p->next;
}
}
//单链表的建立
//int Create(LinkList L)
//{
// while(1)
// {
// int x;
// printf("1.从头建立单链表 2.尾端建立单链表\n");
// printf("请输入你要进行操作的选项:\n");
//
// scanf("%d",&x);
// switch(x)
// {
// case 1:Create1();
// printf("--------------------------------\n");
// break;
// case 2:Create2();
// printf("--------------------------------\n");
// break;
// }
// break;
// }
// }
void list()
{
printf("1.单链表的建立 2.按位查找 3.按值查找\n");
printf("4.删除 5.单链表的遍历 6.求长 7.插入\n");
printf("--------------------------------\n");
}
int main(){
list();
LinkList L;
int n;
// InitList(H);
while(true)
{
int n;
int flag =1;
int length,i,number,item;//item用于Insert插入和Detele删除的返回数据
Node *p;
printf("请输入你要进行的操作:\n");
scanf("%d",&n);
switch(n)
{
case 1:
printf("请继续输入(-1结束):\n"); //若输入-1,则表示链表元素创建完成
L = Create2();
printf("--------------------------------------------------------\n");
break;
case 2:
printf("请输入你要查找的序号: ");//请输入你想查找的序号
scanf("%d",&i);
if(L==NULL)
{
printf("抱歉!错误!\n-------------------------------------------------\n");
break;
}
p =Get(L,i);
if(p==NULL){
printf("抱歉!错误!\n----------------------------------------------\n"); //第i个位置为NULL,错误
}else{
printf("成功!该值为:%d\n--------------------------------------\n",p->data);//不为NULL,查找成功,输出该结点数据域
}
break;
case 3:
printf("请输入你要查找的数值:\n ");
scanf("%d",&number);
if(L==NULL)
{
printf("抱歉!错误!\n-------------------------------------------------\n");
break;
}
p = Locate(L,number);
if(p==NULL)
printf("抱歉!错误!\n-------------------------------------------------\n"); //第i个位置为NULL,错误
else
{
printf("成功\n-------------------------------------------\n");
Recycle(L);
}
//不为NULL,查找成功,输出该结点数据域
break;
case 4:
printf("请输入要删除的位置:");
scanf("%d",&i);
item = Delete(L,i);
if(item==0 || item==-1)
printf("删除失败!----------------------------------------------------------\n");
else
printf("删除成功!-------------------------------------------------------------\n");
break;
case 5:
Recycle(L);
printf("--------------------------------\n");
break;
case 6:
if(L==NULL)
{
printf("抱歉!错误!\n-------------------------------------------------\n");
break;
}
length = Length1(L);
printf("该单链表的长度为: %d\n-------------------------------------\n",length); //单链表的长度为:
break;
case 7:
printf("请输入你要插入的位置和元素:");
scanf("%d%d",&i,&number);
item = Insert(L,i,number);
if(item==0)
printf("插入失败-----------------------------------------------------\n");
else
printf("插入成功--------------------------------------------------------\n");
break;
default:
printf("Sorry!You can't do that!\n");
flag = -1;
break;
}
if(flag==-1)
break;
}
return 0;
}