单链表的建立、插入、删除等简单操作
来源:互联网 发布:怎么使用genbank数据库 编辑:程序博客网 时间:2024/06/07 12:18
#include<stdio.h>
#include<stdlib.h>
typedef int elemtype;
typedef struct node/*单链表结构体的定义*/
{
elemtype data;
struct node *next;
}
node,*linklist;
void main_menu();/*主菜单函数*/
node* creatfromhead();/*从头结点插入建立单链表*/
node* get(linklist l);/*单链表的遍历*/
node* reverselist(linklist l);/*将带头结点的单链表逆置*/
node* creatfeidijian();/*头插法建立非递减单链表*/
node* combine(linklist la,linklist lb);/*将两个非递减链表合成一个非递减连表*/
node* inslist(linklist l,elemtype e);/*在非递减有序链表中插入一个元素使链表仍然有序*/
node* deletelist(linklist l,elemtype *x);/*在非递减单链表中删除值为x的结点*/
int main()/*主函数*/
{
int input;
main_menu();
return 0;
}
void main_menu()/*主菜单函数*/
{
int input;
printf("\t\t\t单链表的建立及其简单操作\t\t\n\n");
printf("\t\t 1 从头结点插入建立单链表\n");
printf("\t\t 2 单链表的遍历\n");
printf("\t\t 3 将带头结点的单链表逆置\n");
printf("\t\t 4 头插法建立非递减单链表\n");
printf("\t\t 5 将两个非递减链表合成一个非递减连表\n");
printf("\t\t 6 在非递减有序链表中插入一个元素使链表仍然有序\n");
printf("\t\t 7 在非递减单链表中删除值为x的结点\n");
printf("\t\t 0 退出\n");
printf("\t\t注意事项:初始化单链表的时候以“0”结束初始化!!!!\n");
printf("请输入需要操作的项目序号:");
scanf("%d",&input);
switch(input)
{
case 1:{
node* head;
printf("请输入一个单链表用“0”来结束输入:");
head=creatfromhead();
printf("初始化后的单链表为:");
get(head);
printf("\n\n");
main_menu();
break;
}
case 2:{
node* head;
printf("请首先输入一个单链表用“0”来结束输入:");
head=creatfromhead();
printf("单链表的遍历结果为:");
get(head);
printf("\n\n");
main_menu();
break;
}
case 3:{
node* head;
printf("请输入需要逆置的单链表:");
head=creatfromhead();
printf("初始化后的单链表为:");
get(head);
printf("单链表的逆置结果为:");
head=reverselist(head);
get(head);
printf("\n\n");
main_menu();
break;
}
case 4:{
node* head;
printf("请输入一个非递减单链表序列:");
head=creatfromhead();
printf("初始化后的单链表为:");
get(head);
printf("\n\n");
main_menu();
break;
}
case 5:{
node* la,*lb,*head;
printf("请输入非递减的单链表la:");
la=creatfromhead();
printf("单链表la为:");
get(la);
printf("请输入非递减的单链表lb:");
lb=creatfromhead();
printf("单链表lb为:");
get(lb);
head=combine(la,lb);
printf("合并之后的新的单链表为:");
get(head);
printf("\n\n");
main_menu();
break;
}
case 6:{
node* head;elemtype e;
printf("请输入一个非递减单链表序列:");
head=creatfromhead();
printf("初始化后的单链表为:");
get(head);
printf("请输入一个需要插入的元素:");
scanf("%d",&e);
head=inslist(head,e);
printf("插入之后的单链表为:");
get(head);
printf("\n\n");
main_menu();
break;
}
case 7:{
node* head;elemtype e;
printf("请输入一个非递减单链表序列:");
head=creatfromhead();
printf("初始化后的单链表为:");
get(head);
printf("请输入一个需要删除的元素:");
scanf("%d",&e);
head=deletelist(head,e);
printf("删除之后的单链表为:");
get(head);
printf("\n\n");
main_menu();
break;
}
case 0:
{
exit(0);break;
}
}
}
node* creatfromhead()/*头插法建立单链表*/
{
linklist l;
node *s;
int c;
int flag=1;
l=(node*)malloc(sizeof(node));
if(l==NULL)
{
printf("申请空间失败!!");
return 0;
}
l->next=NULL;
while(flag)
{
scanf("%d",&c);
if(c!=0)
{
s=(node*)malloc(sizeof(node));
if(s==NULL)
{
printf("申请空间失败!!");
return 0;
}
s->data=c;
s->next=l->next ;
l->next=s;
}
else flag=0;
}
return l;
}
node* get(linklist l)/*单链表的遍历*/
{
node *p;
p=l->next;
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
node* reverselist(linklist l)/*将带头结点的单链表逆置*/
{
node *q,*p;
p=l->next;
l->next=NULL;
while(p!=NULL)
{
q=p->next;
p->next=l->next;
l->next=p;
p=q;
}
return l;
}
node* creatfeidijian()/*头插法建立非递减单链表*/
{
linklist l;
node *s;
int c;
int flag=1;
printf("%s","请输入一个非递减数列!!");
l=(node*)malloc(sizeof(node));
if(l==NULL)
{
printf("申请空间失败!!");
return 0;
}
l->next=NULL;
while(flag)
{
scanf("%d",&c);
if(c!=0)
{
s=(node*)malloc(sizeof(node));
if(s==NULL)
{
printf("申请空间失败!!");
return 0;
}
s->data=c;
s->next=l->next ;
l->next=s;
}
else flag=0;
}
return l;
}
node* combine(linklist la,linklist lb)
/*将两个非递减链表合成一个非递减连表*/
{
node *pa,*pb,*r;
linklist lc;
pa=la->next;
pb=lb->next;
lc=la;
lc->next=NULL;r=lc;
while(pa!=NULL&&pb!=NULL)
{
if(pa->data<=pb->data)
{
r->next=pa;r=pa;pa=pa->next;
}
else
{
r->next=pb;r=pb;pb=pb->next;
}
}
if(pa)
r->next=pa;
else
r->next=pb;
free(lb);
return(lc);
}
node *inslist(linklist l,elemtype e)
/*在非递减有序链表中插入一个元素使链表仍然有序*/
{
node *s,*p;
p=l;
while(l!=NULL)
{
if(e>=l->data&&e<=l->next->data)
{
s=(node*)malloc(sizeof(node));
s->data=e;
s->next=l->next;
l->next=s;
break;
}
else
l=l->next;
}
return p;
}
node * deletelist(linklist l,elemtype x)
/*在非递减单链表中删除值为x的结点*/
{
node *p,*r,*q;
p=l->next;q=l;
while(p!=NULL)
{
if(p->data==x)
{
r=p;
p=r->next;
q->next=p;
free(r);
break;
}
else
{
q=p;/*保留前驱节点*/
p=p->next;
}
}
if(p==NULL)
printf("删除失败,没有找到相应的元素\n");
return l;
}
- 单链表的建立、插入、删除等简单操作
- 单链表的各种操作(建立,查找,删除,插入,归并等)
- 链表的简单操作(建立,输出,插入,删除)
- 单链表的创建、插入、删除等操作
- 单链表的初始化,插入删除等操作
- 单链表的创建,插入删除等操作
- 单链表的创建、插入删除等操作
- 单链表插入删除等操作
- C++ 数据结构的单链表的建立,插入,删除操作
- 【数据结构】采用数组的形式实现顺序表的建立、插入、删除等操作
- 顺序表的各种操作(建立,查找,删除,插入等)
- 数据结构链表的操作集合(建立,遍历,插入,删除,排序,长度,空判断等)
- 单链表的建立、插入、删除
- 单链表建立,插入,删除,查找,遍历操作
- 单链表建立,插入,删除,查找,遍历操作
- 单链表 建立, 查找, 删除, 插入 操作
- 单链表建立,插入,删除,查找,遍历操作!!!!
- 单链表的创建、插入,删除、查找等操作
- sizeThatFits and sizeToFit是UIView的两个方法
- 简单的交换两个变量的数值
- 求出10个整数中的最大值
- 求一个参数二进制形式1 的个数
- 【Android UI】TextView的垂直方向概念之top,bottom,ascent,descent,baseline
- 单链表的建立、插入、删除等简单操作
- C语言中移位、逻辑运算符的简单应用
- 用C语言实现“智障”的棋盘游戏
- 编写一个函数实现n^k,使用递归实现
- 递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和
- 编写一个函数reverse_string(char * string)(递归实现)
- TOJ 4146 4147 4148 4149 4150 4151 4152 4153 4154
- 二叉树的简单操作
- 模拟实现常用字符串函数