无头结点单链表 在头指针处插入元素

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无头结点单链表 在头指针处插入元素相关的知识,希望对你有一定的参考价值。

typedef struct LNode

int data; //数据域
struct LNode *next; //指针域
LNode, *Linklist;

void insert(Linklist L)

Linklist p,s;
int j,pos,e;
printf("请分别输入插入的结点位置和数据:");
scanf("%d %d",&pos,&e);
p=L; j=0;
if(pos==1)

s=(Linklist)malloc(sizeof(LNode));
s->data=e;
s->next=p;
p=s;

else
while(p && j<pos-1)

p=p->next; ++j;

if(!p||j>pos-1)
exit(-1);
s=(Linklist)malloc(sizeof(LNode));
s->data=e;
s->next=p-> next; p->next=s;

printf("insert is ok\n");


请问if(pos==1)

。。。
这一段代码是不是有什么问题,为什么执行时不能在第一个节点位置插入元素~?

肯定有问题,但不是没有插入进去,如果是插在第一个位置,则你的链表的头指针就是新开辟的结点的指针,但你的并没有返回这个指针,而在调用时还是用的原来的头指针。比如要输出链表中的数据,这样的话是从第二个元素开始输出的,新插入在第一个位置的结点并没有输出。
解决办法:一、
if(pos==1)

s=(Linklist)malloc(sizeof(LNode));
s->data=e;
s->next=p;
p=s;
return p; //返回p作为新的表头。


二、直接修改原来的表头。
当然这个就涉及到指针的指针,可能不太好理解,建议就用上一种方法吧。

ps:如果想想避免这样的问题,在建立链表时,采用带头结点链表,即第一个结点不存数据。
希望能对你有所帮助。追问

我也想加头结点啊 老师布置的题目就不让用头结点 TAT
你说的应该是对的 但是我加上return p之后,输出的仍然是插入之前的情况

追答

LinkList NewL,p;
p=NewL=insert( L);
while(p)

printf("%d",p->data);
p=p->next;

这样肯定能输出 的

参考技术A 在头指针处插入元素:
void insert( list **H, node *P)//要使用指针的指针,来改变链表头指针

p->next = *H;
*H = p;
追问

能再详细一点吗? 结合我发的代码,我应该怎么改?

追答

函数定义成void insert(Linklist *pl)

...
p = *pl;
if(pos==1)

s=(Linklist)malloc(sizeof(LNode));
s->data=e;
s->next=*pl;
*pl=s;

...//其他不变

追问

插入后输出的元素个数没有增加,且第一个元素变成了随机数。。。。。。

追答

你调用insert的时候记得取地址了吧
比如链表是Linklist L
那么要调用insert( &L, ...

参考技术B 你就算能在头结点位置插入数据,你的函数返回后,你的主程序还是看不到这个头结点!因为你的头结点指针变化后,你并没有通知主程序 。 参考技术C Node *head;
Node *newHead = new Node;
newHead->next = head;
head = newHead;追问

。。。。和我这个有差吗?

以上是关于无头结点单链表 在头指针处插入元素的主要内容,如果未能解决你的问题,请参考以下文章

数据结构—约瑟夫环问题(循环单链表)

单链表实现“插入”和“删除”操作

单链表(建立插入删除打印)

C实现头插法和尾插法来构建单链表(不带头结点)

已知L是一个不带表头的单链表, 在表首插入结点*p的操作是( )。

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