十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
一般呢,插入和删除函数是分开写的,还有分成两种存储结构,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;
}
算法很多,告诉你一种比较好想的算法!自己编写,练习一下才有收获!
定义一个数组char a[10],输入一个字符串给它。再定义一个数组char b[10],把数组a中不是字符d和D的字符赋给数组b即可。很简单的!
//@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@@@
代码如下(已经编译运行过!)如下:
#include "stdio.h"
void main()
{
char a[10],b[10];
int i=0,j=0;
printf("输入字符串赋给数组a[10] :");
scanf("%s",a);
//把数组A一个个赋给数组B,判断一下,排除字符d和D,字符d和D的ASCII码值分别是100和68
for (i=0; i10; i++)
{
if (100 != a[i] 68 != a[i] ) //排除d和D字符
{
b[j] = a[i]; //把不是d和D的字符赋给数组b
j++;
}
}
printf("删除d和D字符后的字符串为 :%s\n",b);
}
//@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@
//@@@@@@@@@@@@@@@@@@@@@@@@
楼主的意思是在str1中删除str2中出现的字符?那么改成:
#includestdio.h
void main ()
{
char str1[9]={'t','i','n','m','f','g','y','f','s'};
char str2[3]={'A','s','g'};
int i,k,l;
for(i=0;i9;i++)
{
l=0;
for(k=0;k3;k++)
{
if (str1[i]=str2[k])
{l=1;break;}
}
if l!=1
printf("%c",str1[i]);
}
}
1. 函数开始的时候这两句话没有意义
p=(stud *)malloc(sizeof(stud));
q=(stud *)malloc(sizeof(stud));
你只是用了这两个指针,为它们分配空间一是没必要,二是内存会泄露
2. 看你的代码应该是有头结点的链表,搜索的时候p=head;p初始化为了head,指向了头结点,搜索的时候应该从p-next开始,而你用的while((p!=NULL)(strcmp(p-name,N)!=0)),应该用p-next!=NULL。而且后面删除的时候也删除的是p-next,所以比较的话也应该用p-next:strcmp(p-next-name,N)
void Insert_list(Sqlist L,int pos,ElemType e)//在POS处插入e
{
int i;
if(pos 1 || pos L.length+1)
printf("The num is out!");
L.elem = (ElemType *)realloc(L.elem,(++L.length)*sizeof(ElemType));
//问题很绕主要就出在length你刚开始就加了1
if(pos == L.length)
L.elem[L.length-1] = e;
else
{
i = L.length - 2;
while(i != pos - 2) {
L.elem[i+1] = L.elem[i];
i--;
}
L.elem[++i] = e;
}
}
如果修改如下,是不是更容易理解:
void Insert_list(Sqlist L,int pos,ElemType e)//在POS处插入e
{
int i;
if(pos 1 || pos L.length+1)
printf("The num is out!");
L.elem = (ElemType *)realloc(L.elem,(L.length + 1)*sizeof(ElemType));
if(pos == L.length + 1) //如果为之前的长度+1
L.elem[L.length] = e; //那么直接插在最后
else
{
i = L.length - 1; //否则从之前的最后一个元素开始遍历,也就是之前的长度-1的位置开始
while(i != pos - 2) { //找到pos-2的位置,其实是找pos-1的位置,即插入位置,但是为了移动元素,必须到pos-2,因为pos-1处的元素也需要向后移动,如果是到pos-1的话,那么pos-1处的元素将丢失
L.elem[i+1] = L.elem[i];
i--;
}
L.elem[++i] = e;//最终在pos-1处插入元素
}
L.length++;//最后再让长度加1
}
这样写似乎比较容易理解,先增加长度会使问题复杂化
测试前提:showList中iL.length而不是L.length+1
测试样例
int main()
{
Sqlist L;
Init_list(L);
Insert_list(L,1,1);
Insert_list(L,1,2);
Insert_list(L,2,3);
Insert_list(L,4,4);
Insert_list(L,3,5);
Show_list(L);
}
测试结果
2 3 5 1 4 ,没有问题
1、首先我们输入【deleteScore】函数,先看整体代码,再一一解释。
2、在接下来我们输入永久循环语句。
3、再接下来,我们选择操作删除的方式。
4、再接下来我们就可以调用删除的函数了。
注意事项:
C语言提供了许多低级处理的功能,并仍然保持着跨平台的特性,以一个标准规格写出的C语言程序可在包括类似嵌入式处理器以及超级计算机等作业平台的许多计算机平台上进行编译。