① c语言编写插入节点的函数(悬赏100分)
这个程序有两个主要问题
1. void insert(list*pHead,list*pNode)因为是按值传递的 pHead值,所培悔以不能改变pHead的值,改为按地址传递,list** pHead
2. insert()中,第一,二种情况时,没有组成循环链表的闭环(没有更新尾节点的next为新的head)。修改后的程序如下:
#include<stdio.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->num>q->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语言中定义一个函数
需要准备的材料分别有:电脑、C语言编译器。
1、首先,打开C语言编译器,新建一个初始.cpp文件,例如:test.cpp。
③ c语言如何定义一个函数
C语言中定义一个函数特别简单:函数名,加上(),再加上函数体就可以。给你一个特小的例子:
func()
{
}
④ 用C语言怎么写个 字符串插入函数
程序的大体思路可以是这样:
str1是原字符串,str2是待插入的字符串,position是待插入的位置,我们可以这样,用一个指针p_cur指向字符串1 str1中的待插入位置position,另一个指针p_end指向字符串1 str1的尾部,每次插入字符前,把str1中从当前位置开始一直到结束字符全部后移一个位置,空出当前位置,然后把要插入的字符放进这个位置,这样就完成了一个字符的插入,重复这个步骤,直到str2被完全插入。
代码如下:
#include <stdio.h>
#include <string.h>
void insert_str(char str1[],char str2[],int position)
{
/*
insert_str()函数
功能:将字符串str2插入到str1的position位置处
参数:char str1,char str2 ,int position
返回值:无
*/
int i;
char *p_end,*p_cur,*p;/*p_end指向第一个字符串的尾部,p_cur指向被插入的位置*/
p_end=str1+strlen(str1)-1;
p_cur=str1+position-1;
for(i=0;str2[i]!='\0';i++)
{
for(p=p_end;p>=p_cur;p--)
{
*(p+1)=*p;/*从p_cur到p_end的全部元素后移一个位置,此时p_cur指向的位置就空出来了*/
}
*p_cur=str2[i];/*把字符串2中的字符插入空出来的位置*/
p_cur++;/*p_cur下移一个位置*/
p_end++;/*多了一个字符,因此p_end也下移一个位置*/
}
}
void main()
{
char s1[100],s2[20];
int position;
printf("输入字符串1:\n");
gets(s1);
printf("输入插入位置:");
do
{
scanf("%d",&position);
while(getchar()!='\n');/*这一句可以把输入position的时候输入的回车去掉*/
}while(position<0||position>strlen(s1));
printf("输入字符串2:\n");
gets(s2);
insert_str(s1,s2,position);
printf("字符串被插入后变成:\n");
puts(s1);
}
⑤ c语言 编写数组的插入函数
你只需要建立一个数组,将数组建立的大一点,然后分两次输入数,构建一个数组,在整体排序输出就行了
⑥ C语言函数实现插入
这个很简单啊。基本的思路就是先查找到插入或者删除的数字所在数组的位置,如果是插入,就把之后的依次想后挪动一个,然后插入;如果是删除,把之后的依次想前移动一个就行了,不过别忘了处理最后一个数字就行了。要是还有问题,我帮你写个算了。
⑦ 如何用c语言定义一个函数
函数是用户与程序的接口,在定义一个函数前,首先要清楚以下三个问题。 1) 函数的功能实现及算法选择。算法选择会在后续文章详细讲解,本节重点关注函数的功能实现。一般选取能体现函数功能的函数名,且见名知意,如求和函数的函数名可取为 add,求最大值的函数名可取为 max,排序函数可取名为 sort 等。 2) 需要用户传给该函数哪些参数、什么类型,即函数参数。 3) 函数执行完后返回给调用者的参数及类型,即函数返回值类型。 函教定义格式 函数定义的一般格式为: 返回类型 函数名 (类型参数1,类型参数2,…) { 函数体 } 也可以不含参数,不含参数时,参数表中可写关键字 void 或省略,为规范起见,教程中对没有参数的函数,参数表中统一写 void。例如: 类型 函数名 () { 函数体 } 等价于: 类型 函数名 (void) //建议的书写方式 { 函数体 } 如果该函数没有返回类型,则为 void 类型。例如: void add (int x,int y) { printf ("sum=%d\n", x+y); } 除了 void 类型外,在函数体中,均需要显式使用 return 语句返回对应的表达式的值。 函教返回值 函数的值是指调用函数结束时,执行函数体所得并返回给主调函数的值。 关于函数返回值说明如下。 1) 带返回值的函数,其值一般使用 return 语句返回给调用者。其格式为: return 表达式; 或者 return (表达式); 例如: int add (int a, int b) { return (a + b); //return 后为表达式 } 函数可以含一个或多个 return 语句,但每次调用时只能执行其中一个 return 语句。 例如,求整数绝对值的函数: int f (int n) //含多个return语句,但每次调用只执行一个 { if (n >= 0) return n; else return -n; }
⑧ 用C语言编写自定义函数:
(1)素数判断函数:是返回1,否则返回0
intprime(intn){
inti;
if(n>2&&!(n&1)||n<2)
return0;
for(i=3;i*i<=n;i+=2)
if(!(n%i))
return0;
return1;
}
(2)编写排序函数(冒泡排序、选择尺余好排序)
voidbubbling(int*p,intn){//冒泡
inti,j,k;
for(i=0;i<n;i++)
for(j=1;j<n;j++)
if(p[j]<p[j-1])
k=p[j],p[j]=p[j-1],p[j-1]=k;
}
voidselect(int*p,intn){//选毁肆择
inti,j,k;
for(n--,i=0;i<n;i++){
for(k=i,j=k+1;j<=n;j++)
if(p[k]<p[j])
k=j;
if(k-i)
j=p[k],p[k]=p[i],p[i]=j;
}
}
(3)查找函数,找到返回下标,否则返回-1
intfind(int*p,intn,intx){//顺序
inti;
for(i=0;i<n;i++)
if(p[i]==x)
returni;
return-1;
}
intfihalf(int*p,intn,intx){//折半,升序为例
intl,r,m;
l=0,r=n-1;
while(m=(l+r)>>1,l<r&&p[m]-x)
p[m]<x?l=m+1:r=m-1;
returnp[m]==x?m:-1;
}
(4)插入函数,升序为例陵铅
⑨ C语言编写一个插入删除函数
一般呢,插入和删除函数是分开写的,还有分成两种存储结构,1.顺序表,2.链表,我给你一个我上数据结构时候写的链表的操作,里面全都有,如果不会用,追问我
#include<stdio.h>
#include<malloc.h>
#include<Windows.h>
#include<conio.h>
#include<stdlib.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(p&&j<i)
{
p=p->next;++j;
}
if(!p||j>i) 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 && j<i-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;
}