学习笔记11.21(小白水平)
每一个注释均为调试语句
实现了链表相关的操作
如有问题,请指出,谢谢!
//本文实现单链表的相关功能
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
int data;
struct node* next;
}Lnode,*Linklist;
int init(){
//初始化单链表
Linklist L;
L->next=NULL;
return 0;
}
//采用头插法建立链表,如果使用头插法建立链表,那么输出与输入是倒序的
Lnode* creat()
{
Linklist L;
Lnode* s;
int e;
L=(Linklist)malloc(sizeof(Lnode));//创建一个头结点
// printf("开始L的地址:%d\n",L);//调试
L->next=NULL;
while(1)
{ printf("请输入建立的元素\n");
scanf("%d",&e);
if(e!=9999)
{//如果输入的为9999,就结束输入
s=(Linklist)malloc(sizeof(Lnode));//为s结点分配空间
s->next=L->next;//将l的next置为s的next
L->next=s;//l的next为s
s->data=e;//s的data为e
}
else
{
break;
}
}
// printf("结束L的地址:%d\n",L); //调试
return L;//返回头结点位置
}
//采用尾插法建立链表
Lnode* creat1(){
//尾插法需要两个指针,一个指针一直存在头结点的位置,然后一个指针进行移动;
Linklist L,q;
Lnode* s;
int e;
L=(Linklist)malloc(sizeof(Lnode));
// printf("开始L的地址:%d\n",L);
L->next=NULL;
q=L; //结点q记住L的位置 ,让q进行移动
while(1)
{
printf("请输入建立的元素:\n");
scanf("%d",&e);
if(e!=9999)
{
s=(Linklist)malloc(sizeof(Lnode));
s->next=q->next;
q->next=s;
s->data=e;
q=s;//每次增加的时候将s的位置赋给q
}
else{
break;
}
}
//尾插法插入完之后要置空
// printf("结束L的地址:%d\n",L);
return L;
}
//求链表长度
int length(Linklist L){
int count=0;
// printf("位置为:%d\n",L); //调试作用
while(L!=NULL)
{
count++;
L=L->next;
}
printf("count=%d\n",count-1);//从头结点开始计算的,因此需要count-1 ;或者一开始就将L=L->next;
return count-1;
}
//打印链表
void print(Linklist L)
{
printf("当前链表为:\n");
L=L->next; //跳过头结点,从一号结点开始进行遍历输出。
while(L!=NULL)
{
printf("%d",L->data);
L=L->next;
}
}
//按值查找表节点
Linklist locate(Linklist L)
{
int e;
printf("\n请输入查找的元素:\n");
scanf("%d",&e);
L=L->next;//从表中第一个元素开始查找
while(L!=NULL)
{
if(e!=L->data)
{
L=L->next;
}
else{
printf("链表中有这个元素拉,他的位置是%d\n",L);//找到的是她在内存中的地址
}
break;
}
return L;
}
//按序号进行查找
Linklist get(Linklist L)
{
int j=1,i;
printf("\n请输入要查找的序号:\n");
scanf("%d",&i);
Lnode* p=L->next;//从第一个节点开始
if(i==0)//如果查找的序号为0,就是头结点的位置
return L;
if(i<1)
return NULL;
while(p&&j<i)
{
p=p->next;
j++;
}
printf("找到该序号对于的元素:%d\n",p->data);
return p;
}
//插入某个结点
Lnode* insert(Linklist L)
{
int x,e;//定义插入的元素位置和元素
Lnode* p=L;
printf("请输入要插入的元素位置:\n");
scanf("%d",&x);
printf("请输入要插入的元素:\n");
scanf("%d",&e);
Lnode* s;//定义一个node
int len;//定义一个长度
int k=0;
printf("插入之后的个数为:");
len=length(L);//调用length()函数获取长度
//第一步判断插入位置是否合格
if(x<=0||x>len+1)
{
printf("插入位置不合格\n");
}
else{
//第二步我要插入的位置为x ,那么我要找到x的前驱结点
while(L!=NULL&&k<x-1){
L=L->next;
k++;
}
//第三步找到插入位置之后,进行插入。
s=(Linklist)malloc(sizeof(Lnode));
s->next=L->next;
L->next=s;
s->data=e;
printf("插入之后的个数为:");
length(p);
}
return p;//返回头结点的位置
}
//删除某个结点
Linklist del(Linklist L)
{
//对于删除某个结点,只需要找到他的前驱结点。将前驱结点的next进行改变
Lnode* p;
Lnode* s;
p=L;
int x;
int k=0,j=0;
j=length(L);
printf("\n请输入删除的结点位置(从1开始):\n");
scanf("%d",&x);
if(x<=0||x>j)
{
printf("输入的位置有误\n");
}
while(p!=NULL&&k<x-1){//找到x的前驱结点
p=p->next;
k++;
}
// while(s!=NULL&&j<x)//找到当前结点的位置
// {
// s=s->next;
// k++;
// }
// p->next=s->next;
s=p->next;
p->next=s->next;
free(s);
return L;
}
Linklist des(Linklist L)//摧毁整个单链表的时候,要逐个释放结点空间
{
L=L->next;//从头结点开始。
Linklist p=NULL;
while(L!=NULL)
{
p=L;
L=L->next;
free(p);
p=NULL;
}
printf("摧毁成功咯\n");
L=NULL;
printf("%d\n",L);//调试
return L;
}
int main(){
Linklist p,a;
int num;
printf("-------------菜单-----------\n") ;
printf("--1.使用头插法建立链表------\n") ;
printf("--2.使用尾插法建立链表------\n") ;
printf("--3.求链表长度--------------\n") ;
printf("--4.打印链------------------\n") ;
printf("--5.按值查找----------------\n") ;
printf("--6.按下标位置查找----------\n") ;
printf("--7.插入--------------------\n") ;
printf("--8.删除某个结点------------\n") ;
printf("--9.摧毁整个链表------------\n") ;
printf("--10.退出--------------------\n") ;
while(1)
{
printf("请输入您的选择\n");
scanf("%d",&num);
//p=init()
switch(num)
{
case 1:p=creat();break;
case 2:p=creat1();break;
case 3:length(p);break;
case 4:print(p);break;
case 5:locate(p);break;
case 6:get(p);break;
case 7:insert(p);break;
case 8:del(p);break;
case 9:des(p);break;
case 10:exit(0);
default:printf("输入错误!!!\n");break;
}
}
// int count=0,i;
//p=creat1();
// printf("1.p的地址:%d\n",p);
//p=p->next;
// a=p;
// printf("2.p的地址:%d\n",p);
// int k;
// k=length(p);
// print(p);
// insert(p);
// print(p) ;
// locate(p);
// get(p);
// del(p);
// print(p) ;
//此处我将打印链表和将链表求长度转化成了函数,简化main函数体。
// while(p!=NULL)
// {
// count=count+1;
// p=p->next;
// }
// printf("count=%d\n",count);
//注意,我在这里犯错:我沿用while(p!=NULL)想打印链表,结果刚刚用count去计数的时候,指针p已经走到末尾了,然后你去判断p!=NULL得到false,直接跳出;
// printf("建立好的链表为:");
// while(a!=NULL)
// {
// printf("%d",a->data);
// a=a->next;
// }
}