我仿照 李春葆 编著的 《数据结构习题与解析(C语言篇)》(清华大学出版社) 2000年1月第1版
编写的
不带头节点的单向链表程序
在建立链表之后,
若需要在第一个节点之前在插入一个节点,
无法修改表头指针。
应如何编写?
请高手不吝赐教!
另:个人觉得李春葆编著的这本教材谬误太多,实在是误人子弟。不知各位高手意下如何?
修改自:上书P47-P51
附源代码:
#include<stdio.h>
#include<alloc.h>
typedef struct linknode
{
int data;
struct linknode *next;
}node;
node *creat() //建立不带头节点的单向链表
{
node *head,*p,*s;
int x,cycle=1;
head=(node *)malloc(sizeof(node)); //建立头节点
head->next=NULL; //使头节点指针域为空
p=head;
while(cycle) //建立带头节点的单向链表
{
scanf("%d",&x);
if(x!=0)
{
s=(node *)malloc(sizeof(node));
s->data=x;
p->next=s;
p=s;
}
else cycle=0;
}
p->next=NULL; //使尾节点指针域为空
s=head; //删除头节点并使head指向第一个节点
head=head->next;
free(s);
return head; //返回第一个节点的指针
}
void printout(node *WFY) //输出节点的data值
{
node *temp;
temp=WFY;
if(temp==NULL)
{
printf("空表\n");
}
else while(temp)
{
printf("%d",temp->data);
temp=temp->next;
}
printf("输出完毕\n");
}
node *find(node *head,int x)
{
node *p;
p=head;
if(p==NULL)
{
printf("空表,节点未找到\n");
}
else
{
while(p!=NULL && p->data!=x) p=p->next;
if(p!=NULL) printf("节点找到\n");
else printf("节点未找到\n");
}
return p;
}
int length(node *head)
{
int n=0;
node *p;
p=head;
while(p!=NULL)
{
p=p->next;
n++;
}
return n;
}
node *insert(node *head,int i,int x) //在单链表中第i个节点之后插入一个元素为x的节点
/*疑问:若需修改表头指针,显然无法完成任务*/
{
node *insert;
node *p;
int j;
if(i==0)
{
insert=(node *)malloc(sizeof(node));
insert->data=x;
insert->next=head;
*head=*insert;
return insert;
}
else
{
p=head;j=1;
while(p!=NULL &&j<i)
{
p=p->next;
j++;
}
if(p!=NULL)
{
insert=(node *)malloc(sizeof(node));
insert->data=x;
insert->next=p->next;
p->next=insert;
return insert;
}
else
{
printf("不存在第%d个节点\n",i);
return NULL;
}
}
}
int main()
{
node *a;
node *b;
int c,d,e;
a=creat();
printout(a);
// scanf("%d",&c);
// b=find(a,c);
// printf("%d",b->data);
printf("输入插入位置:");
scanf("%d",&d);
printf("输入插入值:");
scanf("%d",&e);
insert(a,d,e);
printout(a);
return 0;
}