不带头结点的单链表的实现(C语言)
终端结点无后继,故终端结点的指针域为空,即NULL。
代码实现如下:(可复制,直接运行)
#include <stdio.h>
#include<stdlib.h>
typedef int datatype;//假设节点的数据域为整型
typedef struct link_node //节点类型的定义
{
datatype info;//节点的数据域
struct link_node *next;
} node;
typedef node *linklist;
linklist createbystack();//头部 插入创建
linklist createbyqueue();//尾部插入创建
void print(linklist head);//打印单链表
linklist locate(linklist head,int i);//定位某个节点
linklist Delete(linklist head,int i);//删除指定的 某个节点
linklist insert(linklist head,int i,datatype x);//插入某个节点
int main()
{
linklist head;
head=createbystack();
print(head);
int x,i;
printf("\nplease input the info and position of you want to insert:\n");
printf("the info is:");
scanf("%d",&x);
printf("the position is:");
scanf("%d",&i);
head=insert(head,i,x);
print(head);
printf("\nplease input the position of you want to delete:\n");
printf("the position is:");
scanf("%d",&i);
Delete(head,i);
print(head);
return 0;
}
linklist createbystack() //头插法建立单链表
{
linklist head,s;
datatype x;
head=NULL;
printf("please input some data:\n");
scanf("%d",&x);
while(x!=0) //以0结束s
{
s=(linklist)malloc(sizeof(node));//生成插入节点
s->info=x;
s->next=head;
head=s;
scanf("%d",&x);
}
return head;
}
linklist createbyqueue()
{
linklist head,r,s;
datatype x;
head=r=NULL;
printf("please input some data:\n");
scanf("%d",&x);
while(x!=0)
{
s=(linklist)malloc(sizeof(node));
s->info=x;
if(head==NULL)
{
head=s;
}
else
{
r->next=s;
}
r=s;
scanf("%d",&x);
}
if(r)
r->next=NULL;
return head;
}
void print(linklist head)
{
linklist p;
int i=0;
p=head;
printf("\nList is:\n");
while(p)
{
printf("%5d",p->info);
p=p->next;
i++;
if(i%10==0)
printf("\n");
}
}
void delList(linklist head) //release the List
{
linklist p=head;
while(p)
{
head=p->next;
free(p);
p=head;
}
}
linklist locate(linklist head,int i)
{
linklist p;
int k;
if(i<0) return NULL;
k=0;
p=head;
while(p!=NULL&&k<i)
{
p=p->next;
k++;
}
return p;
}
linklist insert(linklist head,int i,datatype x)
{
linklist p,q;
q=(linklist)malloc(sizeof(node));
q->info=x;
if(i==0)
{
q->next=head;
head=q;
}
else
{
p=locate(head,i-1);
if(p==NULL)
{
printf("error!");
}
else
{
q->next=p->next;
p->next=q;
}
}
return head;
}
linklist Delete(linklist head,int i)
{
linklist p,q;
if(i==0)
{
q=head;
head=q->next;
}
else
{
p=locate(head,i-1);
if(p==NULL)
{
printf("error");
}
else if(p->next==NULL)
{
printf("error");
}
else
{
q=p->next;
p->next=q->next;
}
}
free(q);
return head;
}
运行结果如下
: