这个程序有两个主要问题
创新互联是一家朝气蓬勃的网站建设公司。公司专注于为企业提供信息化建设解决方案。从事网站开发,网站制作,网站设计,网站模板,微信公众号开发,软件开发,小程序制作,十多年建站对成都垃圾桶等多个领域,拥有多年设计经验。
1. void insert(list*pHead,list*pNode)因为是按值传递的 pHead值,所以不能改变pHead的值,改为按地址传递,list** pHead
2. insert()中,第一,二种情况时,没有组成循环链表的闭环(没有更新尾节点的next为新的head)。修改后的程序如下:
#includestdio.h //预编译命令
struct list//定义结构体
{
int num;
list* next;
};
list *head,*end; //定义全局变量
list* creat()//创建链表的函数
{
list* p=NULL;
list* q=NULL;
head=NULL;
int num;
scanf("%d",num);
while(num!=0)
{
p=new list; //开辟空间
p-num=num;
if(head==NULL)
head=p;
else
q-next=p;
q=p;
scanf("%d",num);
}
end=q; //将链表的结尾最后一个结点赋给end
end-next=head; //让最后一个结点的的下个结点的地址不为空而指向头指针
return(head);
}
void insert( list** pHead,list* pNode) //插入接点的函数,
{
list *q,*r;
//第一种情况,链表为空
if(*pHead==NULL)
{
*pHead=pNode; //链表头指向pNode
(*pHead)-next = *pHead;//为了循环用
return; //完成插入操作,返回
}
//第二种情况,pNode结点num的值小于dengyu链表头结点num的值
//则将pNode的值插到链表头部
if(pNode-num=(*pHead)-num)
{
//这是为了更新最后一个端点与头节点的连接
list* pos = *pHead;
while (pos-next != *pHead)
{
pos = pos-next;
}
pos-next = pNode;
pNode-next= (*pHead);
*pHead=pNode;
return;
}
//第三种情况,循环查找正确位置
r=*pHead;
q=(*pHead)-next;
while(q!=*pHead)
{
if(pNode-numq-num)
{
r=q;
q=q-next;
}
else
break;
}
//如果插入到最后的位置,则更新pEnd的值
r-next=pNode;
pNode-next=q;
}
list* together(list* p1,list* p2) //定义两个链表合并的函数
{
list *q,*r;
q=p2;
do
{
r=new list; //开辟空间
r-num=q-num; //将q的值赋给r
insert(p1,r); //调用插入结点的函数
q=q-next; //指针向后拨一个接点
}while(q!=p2); //当在最后一个结点时停止循环
return(p1); //返回头指针
}
void main() //主函数
{
list *list1,*list2,*r,*q;
list1=creat(); //调用创建链表的函数
list2=creat(); //调用创建链表的函数
r=together(list1,list2); //调用合并两个链表的函数
q=r-next;
for(;q!=r;q=q-next)
printf("%d ",q-num);
}
你只需要建立一个数组,将数组建立的大一点,然后分两次输入数,构建一个数组,在整体排序输出就行了
表示“插入”,它并不是C语言的一部分,用在函数名中可以表示插入元素。
例题:
#include iostream
#include vector
using namespace std;
int main()
{
vectorint intArray;
int i;
for(i=0;i10;i++)
{
intArray.push_back(i);
coutintArray[i]" ";
}
coutendl;
intArray.insert(intArray.begin()+1,intArray.begin()+3,intArray.begin()+5);
for(i=0;iintArray.size();i++)
coutintArray[i]" ";
system("pause");
return 0;
}
这个很简单啊。基本的思路就是先查找到插入或者删除的数字所在数组的位置,如果是插入,就把之后的依次想后挪动一个,然后插入;如果是删除,把之后的依次想前移动一个就行了,不过别忘了处理最后一个数字就行了。要是还有问题,我帮你写个算了。
int add(int x,int y);
int sub(int x,int y);
int mul(int x,int y);
int div(int x,int y);
#include math.h
#include stdio.h
void main()
{
int a,b,c,d,e,f,g,h,i;
printf("XXXXXXXXXXXXXXX计算器");
printf("\n");
for(c=1;c=30;c++)
printf("*");
printf("\n");
printf("请输入一个整数");
printf("\n");
scanf("%d",a);
printf("\n");
for(c=1;c=30;c++)
printf("-");
printf("\n");
printf("请选择您要做的运算:1.+,2.-,3.*,4./5.abs,6.sqrt");
printf("\n");
for(c=1;c=30;c++)
printf("*");
printf("\n");
scanf("%d",d);
printf("\n");
if(d==5) {printf("%d",abs(a));goto end;}(如果想做绝对值,就直接做abs函数(它是个库函数).做完后就goto"end"--也就是函数的最后.)
if(d==6) {printf("%.2f",sqrt(a));goto end;};}(如果想做开平方,就直接做sqrt函数(它是个库函数).做完后就goto"end"--也就是函数的最后.)
printf("请再次输入一个整数"); (如果是做双目的就开始输入第二个数b)
printf("\n");
scanf("%d",b);
printf("\n");
switch(d)
{
case 1:add(a,b);break;
case 2:sub(a,b);break;
case 3:mul(a,b);break;
case 4:div(a,b);break;
default:printf("date input error!\n");
} end: printf("\n");}
int add(int x,int y)
{
int m;
m=x+y;
printf("%d",m);
return m;
}
int sub(int x,int y)
{
int m;
m=x-y;
printf("%d",m);
return m;
}
int mul(int x,int y)
{
int m;
m=x*y;
printf("%d",m);
return m;
}
int div(int x,int y)
{
int m;
m=x/y;
printf("%d",m);
return m;
}
(你试试看吧!应该可以!呵呵)
一般呢,插入和删除函数是分开写的,还有分成两种存储结构,1.顺序表,2.链表,我给你一个我上数据结构时候写的链表的操作,里面全都有,如果不会用,追问我
#includestdio.h
#includemalloc.h
#includeWindows.h
#includeconio.h
#includestdlib.h
typedef struct
{
int data;
struct LNode *next;
}LNode;
LNode *Listinit(LNode *L)//初始化链表返还头指针
{
L = (LNode *)malloc(sizeof(LNode));
if (!L)return 0;
L-next = NULL;
return L;
}
int GetElem_L(LNode *L, int i, int *e)//取第i个元素
{
int j;
LNode *p;
p=L-next;j=1;
while(pji)
{
p=p-next;++j;
}
if(!p||ji) return 0;//i超过表长
*e=p-data;
return 1;
}
int ListInsert_L(LNode *L, int i, int e)//插入数据元素
{
LNode *p1 = L,*p2=L;
int j = 0;
if (i-1 LinkLength(L))
return 2;
while(p1!=NULL ji-1)
{
p1 = p1-next;
j++;
}
p2 = (LNode *)malloc(sizeof(LNode));
if (!p2)
return 0;
p2-data = e;
p2-next = p1-next;
p1-next = p2;
return 1;
}
void ClearList(LNode *L)//重置为空表
{
LNode *p;
while(L-next)
{
p=L-next;
L-next=p-next;
free(p);
}
}
void print_link(LNode *L)//输出函数
{
LNode *p = L;
p = p-next;
while (p != NULL)
{
printf("%5d", p-data);
p = p-next;
}
}
int ListDlete_L(LNode *L, int i, int *e)//删除L中I,并用e返回
{
int j = 0;
LNode *p1 = NULL, *p2 = NULL;
p1 = L;
while (p1-next != NULL j i - 1)
{
p1 = p1-next;
j++;
}
if (p1-next == NULL || j i - 1)
return 0;
p2 = p1-next;
p1-next = p2-next;
free(p2);
return 1;
}
int LinkLength(LNode *L)//链表的长度
{
int i = 0;
LNode *p = L-next;
while (p != NULL)
{
i++;
p = p-next;
}
return i;
}