试写出在不带头结点的单链表的第i个元素之前插入一个元素的算法 麻烦帮我修改下

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了试写出在不带头结点的单链表的第i个元素之前插入一个元素的算法 麻烦帮我修改下相关的知识,希望对你有一定的参考价值。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef char datatype;
typedef struct node

datatype data;
struct node *next;
linklist;

linklist*createlist()


datatype num;
linklist *head,*s,*r;
printf("请输入非递减链表,以#结束\n");
num=getchar();
head=(linklist*)malloc(sizeof(linklist));
head->data=num;
r->next=head;
r=head;
num=getchar();
while(num!='#')

s=(linklist*)malloc(sizeof(linklist)); //令s为申请的空间
s->data=num;
r->next=s;
r=s;
num=getchar();

return head;

void insert(linklist*head,datatype num,datatype i)//num为要插入的内容,i为要插入的位置

linklist *s,*p,*q;
int j=2;
s=(linklist*)malloc(sizeof(linklist));
s->data=num;
p=head;
q=head->next;
if(i=1)

p=s;
s->next=p;

else

if(i<=0)printf("error");
else

while(q!=NULL)

if(j==i)

p->next=s;
s->next=q;
break;

else

p=q;
q=q->next;







void putout(linklist *head) //单链表的输出

linklist *p;
p=head;
if(head==NULL) printf("链表为空");
else

while (head!=NULL)

printf("%c",p->data);//先这样写,最后要修改输出之间的间距
p=p->next;




void main()

linklist *head;
int other,i;//第一个回车键保存到other
datatype num;
head=createlist();
putout(head); // 这一步就通不过了
insert(head);
putout(head;)

参考技术A 我看了一下,错误不少,帮你修正后的程序如下(vc++6.0下编译通过):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef char datatype;
typedef struct node

datatype data;
struct node *next;
linklist;

linklist*createlist()


datatype num;
linklist *head,*s,*r;
printf("请输入非递减链表,以#结束\n");
num=getchar();
head=(linklist*)malloc(sizeof(linklist));
head->data=num;
head->next = NULL;//add
//r->next=head;//del
r=head;
num=getchar();
while(num!='#')

s=(linklist*)malloc(sizeof(linklist)); //令s为申请的空间
s->data=num;
r->next=s;
r=s;
num=getchar();

r->next = NULL;//add

return head;

//void insert(linklist*head,datatype num,datatype i)//num为要插入的内容,i为要插入的位置
void insert(linklist*head,datatype num,int i)//num为要插入的内容,i为要插入的位置

linklist *s,*p,*q;
int j=2;
s=(linklist*)malloc(sizeof(linklist));
s->data=num;
p=head;
q=head->next;
//if(i=1)//del
if (i == 1)//add

//p=s;//del
s->next=p;
head=s;//add

else

if(i<=0)printf("error");
else

while(q!=NULL)

if(j==i)

p->next=s;
s->next=q;
break;

else

p=q;
q=q->next;







void putout(linklist *head) //单链表的输出

linklist *p;
p=head;
if(head==NULL) printf("链表为空");
else

//while (head!=NULL)//del
while (p != NULL)//add

printf("%c",p->data);//先这样写,最后要修改输出之间的间距
p=p->next;

printf("\n");//add



void main()

linklist *head;
//int other,i;//第一个回车键保存到other //del
int i = 0;//add
datatype num;
head=createlist();
putout(head); // 这一步就通不过了

printf("input a num to inset: \n");//add
fflush(stdin);//add
num=getchar();//add
i = 2;//add
insert(head, num, i);
putout(head);


希望对你有帮助。追问

insert函数好像还有点问题
我把主函数改了下,
把i=2改成
scanf("%d",&i);
输入的i应该是我要插入的位置,但是程序运行结果还是不对
麻烦看下 谢谢

追答

是这样的,因为你的insert函数指定j=2,即在第二个位置插入,所以指定i=2.
如果不是你希望的,请说你的需求,我可以重新帮你更改,谢谢!

如果是加scanf("%d",&i);指定某个位置之前插入的话,
那么insert函数里面的if(j==i)语句改为if(j++ == i)就可以了。

希望对你有帮助。

如果是加scanf("%d", &i);指定某个位置之前插入的话,那么insert函数里面的if(j==i)改为if(j++==i)就可以了,希望对你有帮助。

追问

学习了
万分感谢

追答

如果对你有帮助,请采纳,谢谢!

本回答被提问者和网友采纳

编写不带头结点单链表的插入操作和删除操作算法

参考技术A Status ListInsert(LinkList &L,int i,ElemType e)
// 在不设头结点的单链线性表L中第i个位置之前插入元素e
int j=1; // 计数器初值为1
LinkList s,p=L; // p指向第1个结点
if(i<1) // i值不合法
return ERROR;
s=(LinkList)malloc(sizeof(LNode)); // 生成新结点,以下将其插入L中
s->data=e; // 给s的data域赋值e
if(i==1) // 插在表头
s->next=L; // 新结点指向原第1个结点
L=s; // L指向新结点(改变L)

else
// 插在表的其余处
while(p&&j<i-1) // 寻找第i-1个结点
j++; // 计数器+1
p=p->next; // p指向下一个结点

if(!p) // i大于表长+1
return ERROR; // 插入失败
s->next=p->next; // 新结点指向原第i个结点
p->next=s; // 原第i-1个结点指向新结点

return OK; // 插入成功


Status ListDelete(LinkList &L,int i,ElemType &e)
// 在不设头结点的单链线性表L中,删除第i个元素,并由e返回其值
int j=1; // 计数器初值为1
LinkList q,p=L; // p指向第1个结点
if(!L) // 表L空
return ERROR; // 删除失败
else if(i==1) // 删除第1个结点
L=p->next; // L由第2个结点开始(改变L)
e=p->data; // 将待删结点的值赋给e
free(p); // 删除并释放第1个结点

else
while(p->next&&j<i-1) // 寻找第i个结点,并令p指向其前驱
j++; // 计数器+1
p=p->next; // p指向下一个结点

if(!p->next||j>i-1) // 删除位置不合理
return ERROR; // 删除失败
q=p->next; // q指向待删除结点
p->next=q->next; // 待删结点的前驱指向待删结点的后继
e=q->data; // 将待删结点的值赋给e
free(q); // 释放待删结点

return OK; // 删除成功
追问

你编译了么~

本回答被提问者采纳

以上是关于试写出在不带头结点的单链表的第i个元素之前插入一个元素的算法 麻烦帮我修改下的主要内容,如果未能解决你的问题,请参考以下文章

单链表的插入删除操作详解(C语言)

线性表的链式表示

带头结点的单链表操作说明

单链表(不带头结点)按位序插入

什么叫带头结点的链表? 什么叫不带头结点的链表?

不带头结点的单链表的插入与删除程序写法