链式结构-头部插入法-顺序
- 通过输入结点个数n后,输入要插入的n个结点值,各值用空格分隔,即可创建单链表。
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct node
{
ElemType data;
struct node *next;
} Node, *LinkList;
/*链表的初始化*/
LinkList init()
{
LinkList p;
p=(LinkList)malloc(sizeof(Node));
p->next=NULL;
return p;
}
/*求表长*/
int len(LinkList H)
{
int len=0;
LinkList p;
for(p=H->next; p; p=p->next) len++;
return len;
}
/*头部插入法*/
void f_insert(LinkList H,ElemType s)
{
LinkList p,q;
p=(LinkList)malloc(sizeof(Node));
p->next=NULL;
p->data=s;
p->next=H->next;
H->next=p;
}
/*尾部插入法*/
LinkList r_insert(LinkList H,ElemType s)
{
LinkList p,q;
for(q=H; q->next; q=q->next);
p=(LinkList)malloc(sizeof(Node));
p->next=NULL;
p->data=s;
q->next=p;
return p;
}
/*删除p指向的结点*/
void dele(LinkList H,LinkList p)
{
LinkList q;
for(q=H; q->next!=p; q=q->next);
q->next=p->next;
free(p);
}
/*按值查找*/
LinkList search_val(LinkList H,ElemType s)
{
LinkList p;
for(p=H->next; p; p=p->next)
if(p->data==s)
return p;
return NULL;
}
/*按序号查找,序号从1开始*/
LinkList search_no(LinkList H,int pos)
{
LinkList p;
int i=1;
if(pos<=0 || pos>len(H))
{
printf("输入的序号不合法!\n");
return NULL;
}
for(p=H->next; i!=pos; p=p->next)i++;
return p;
}
/*输出所有链表值*/
void print_all(LinkList H)
{
LinkList p;
for(p=H->next; p; p=p->next)
printf("%d ",p->data);
printf("\n");
}
/*在单链表H的第pos个结点前插入值为e的结点,pos从1开始*/
int insert(LinkList H,int pos,ElemType e)
{
LinkList p,q;
if(pos>len(H) || pos<1)
{
printf("输入的位置不合法\n");
return 0;
}
else if(pos==1) f_insert(H,e);
else
{
p=search_no(H,pos-1);
q=(LinkList)malloc(sizeof(Node));
q->data=e;
q->next=p->next;
p->next=q;
}
return 1;
}
/*递增有序链表La,Lb合并为Lc*/
void merge(LinkList La,LinkList Lb,LinkList *Lc)
{
LinkList pa,pb,pc;
pa=La->next;
pb=Lb->next;
(*Lc)=pc=La;/*pc总是指向生成的单链表的最后一个结点*/
while(pa && pb)
{
if(pa->data <= pb->data)
{
pc->next = pa; /*将pa连接到pc之后*/
pc = pa;
pa = pa->next;
}
else
{
pc->next = pb;
pc = pb;
pb = pb->next;
}
}
/*La单链表还有结点时,剩余结点放在pc后,否则Lb剩余结点放在pc后*/
pc->next = pa? pa:pb;
}
void destroy(LinkList H)
{
LinkList p=H,q=p->next;
while(q)
{
free(p);
p=q;
q=p->next;
}
free(p);
}
int main()
{
LinkList H,p;
int n,i;
ElemType e;
H=init();/*初始化带头结点的单链表,头指针为H,*/
printf("构建单链表(尾部插入法)\n");
printf("输入要插入结点个数:\n");
scanf("%d",&n);
printf("输入要插入的%d个结点值,各值用空格分隔:\n",n);
for(i=0; i<n; i++)
{
scanf("%d",&e);
r_insert(H,e);/*这里改变一下,把原先的f_insert改为r_insert,就能在链表H尾部插入值e*/
}
printf("单链表创建成功!\n");
printf("\n链表各元素为:\n");
print_all(H);
printf("\n单链表表长为%d\n",len(H));
printf("\n向单链表插入结点\n");
printf("输入插入的位置:\n");
scanf("%d",&n);
printf("输入插入的元素值:\n");
scanf("%d",&e);
if(insert(H,n,e))
{
printf("插入元素%d后各值为:\n",e);
print_all(H);
}
printf("\n删除单链表某结点\n");
printf("输入要删除的元素值\n");
scanf("%d",&e);
if((p=search_val(H,e))!=NULL)
{
dele(H,p);
printf("删除元素%d后各值为:\n",e);
print_all(H);
}
else printf("元素%d不存在!\n",e);
printf("\n按序号查找单链表结点\n");
printf("输入要查找的元素序号:\n");
scanf("%d",&n);
if((p=search_no(H,n))!=NULL)
printf("链表第%d个元素为:%d\n",n,p->data);
destroy(H);/*删除链表H*/
return 0;}