链表的创建,删除,插入小型程序。

来源:互联网 发布:stata面板数据ols回归 编辑:程序博客网 时间:2024/06/04 17:49
#include<stdio.h>
#include<malloc.h>
struct list
{
int data;
struct list *next;
};
typedef struct list node;
typedef struct list *link;
link head,p,q;
//====================================
//创建链表
//====================================
void create(int n)
{
int i=1;
head=(link)malloc(sizeof(node));
printf("请输入第%d个数的大小:\n",i);
scanf("%d",&head->data);
q=head;
head->next=NULL;
for(i=2;i<=n;i++)
{
p=(link)malloc(sizeof(node));
printf("请输入第%d个数的大小:\n",i);
scanf("%d",&p->data);
q->next=p;
q=p;
}
q->next=NULL;
}
//====================================
//在x元素前插入数据元素y
//====================================
void insert(int x,int y)
{
link New;
New=(link)malloc(sizeof(node));
New->data=y;
p=head;
q=p->next;
if(head->data==x)
{
New->next=head;
head=New;
}
else
{
while((q->data!=x)&&(p->next!=NULL))
{
p=q;
q=q->next;
}
if(q->data==x)
{
p->next=New;
New->next=q;
}
else
printf("不存在%d这个数据!",x);
}

}
//====================================
//打印函数
//====================================
void print()
{
q=head;
while(q!=NULL)
{
printf("%d\t",q->data);
q=q->next;
}
printf("\n");
}
//====================================
//删除函数
//====================================
void  Delete(int x)
{
p=head;
q=p->next;
if(head->data==x)
head=head->next;
else
{
      while(p->next!=NULL)
 {
 if(q->data==x)
p->next=q->next;
p=q;
q=q->next;
 }
}
}
//==================================
//主函数
//==================================
void main()
{
int n,m,x,y,z,size;
char A;
do{
printf("\n========================================\n");
printf("1.创建链表\n");
printf("2.在x元素前插入数据元素y\n");
printf("3.删除函数\n");
printf("4.退出\n");
printf("\n========================================\n");
printf("请输入你要选择的选项:");
scanf("%d",&size);
switch(size)
{
case 1:
{
printf("请输入链表元素的个数:");
scanf("%d",&n);
create(n);
print();
printf("\n");
break;
}
case 2:
{
printf("请分别输入你要插入的数据及插入在那个数据之前:");
scanf("%d%d",&x,&y);
insert(x,y);
print();
printf("\n");
break;
}
case 3:
{
 do{
    printf("请输入你要删除的数:\n");
scanf("%d",&m);
Delete(m);
print();
getchar();
printf("是否需要继续删除数据?是,请输入“Y”,否,请输入“N”\n");
scanf("%c",&A);
if(A=='Y'||A=='y')
    z=1;
   else
    z=0;
}while(z);
break;
}
case 4:
{
size=0;
}
}
}while(size!=0);

}

心得体会:第一:起初把结构体变量,结构体指针,结构体名,自定义结构体变量,自定义结构体变量指针等弄的稀里糊涂,后面通过仔细体会终于知道typedef struct list node;typedef struct *link中struct list 为结构体类型名,node为结构体变量名,*link为结构体指针变量名.其结构相当于typedef int  A 和typedef int *A.要注意:typedef是定义一种类型的别名,而define是定义一个常量或者变量的别名。

                 第二:getchar();的使用,getchar()为接收输入一个字符,起初自己没有用getchar();函数,程序直接将\n作为数据的输入,导致跳过了自己输入数据来需要继续删除数据资料:

getchar有一个int型的返回值.当程序调用getchar时.程序就等着用户按键.用户输入的字符被存放在键盘缓冲区中.直到用户按回车为止(回车字符也放在缓冲区中).当用户键入回车之后,getchar才开始从stdin流中每次读入一个字符.getchar函数的返回值是用户输入的第一个字符的ASCII码,如出错返回-1,且将用户输入的字符回显到屏幕.如用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续getchar调用读取.也就是说,后续的getchar调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完为后,才等待用户按键. 
putchar函数(字符输出函数)的作用是向终端输出一个字符。其一般形式为 putchar(c)

原创粉丝点击