头文件:
#include <stdlib>
结构体:
typedef struct LNode
{
int data;
struct LNode *next;
}LNode;
内存申请:
LNode *s=(LNode*)malloc(sizeof(LNode));
链表清空:
//清空链表
void ClearList(LNode* L)
{
Node* p;
while(L->next){
p=L->next;
L->next=p->next;
free(p);
}
完整代码(重点学习尾插法、头插法):
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode
{
int data;
struct LNode *next;
}LNode;
createHead(LNode *L)
{
int a;
LNode *h;
h=L;
L->next=NULL;
printf("input list data:\n");
scanf("%d",&a);
while(a!=-1)
{
LNode *s=(LNode*)malloc(sizeof(LNode));
s->data=a;
s->next=h->next;
h->next=s;
scanf("%d",&a);
}
}
//CreateList
create(LNode *L)
{
int a;
LNode *h;
h=L;
L->next=NULL;
printf("input list data:\n");
scanf("%d",&a);
while(a!=-1)
{
LNode *s=(LNode*)malloc(sizeof(LNode));
s->data=a;
h->next=s;
h=s;
scanf("%d",&a);
}
h->next=NULL;
}
//Output List
OutputList(LNode *L)
{
printf("OutputList data:\n");
while(L->next)
{
printf("%d\t",L->next->data);
L->next=L->next->next;
}
printf("\n");
}
MergeList(LNode *L1,LNode *L2)
{
LNode *pa,*pb,*pc;
pc=L1;
// L1->next=pa;//L1指向Pa(所以这种写法错误)
// L2->next=pb;
pa=L1->next;//pa指向L1的下一个结点
pb=L2->next;
while(pa&&pb)
{
if(pa->data>=pb->data)
{
pc->next=pb;
pc=pb;
pb=pb->next;
}
else
{
pc->next=pa;
pc=pa;
pa=pa->next;
}
}
pc->next=pa?pa:pb;//插入剩余结点
// if(pa==NULL)
// pc->next=pb;
// else
// pc->next=pa;
}
//删除元素
Delete(LNode *L1,int a)
{
LNode *pa,*pb;
pa=L1->next;
pb=L1;
while(pa)
{
if(pa->data!=a)
{
pa=pa->next;
pb=pb->next;
}
else
{
pb->next=pa->next;
pa=pa->next;
}
}
}
//插入有序链表中
Insert(LNode *L1,LNode *t,int a)
{
//用前驱和后继去解决
LNode *p,*pre;
pre=L1;
p=L1->next;
t->data=a;
t->next=NULL;
while(p)
{
if(p->data>=a)
{
t->next=pre->next;
pre->next=t;
break;
}
pre=p;
p=p->next;
}
}
//排序
Sort(LNode *L)
{
//利用前驱和后继
LNode *p,*q;
int t;
for(p=L->next;p!=NULL;p=p->next)
for(q=p->next;q!=NULL;q=q->next)
{
if(p->data>q->data)
{
t=p->data;
p->data=q->data;
q->data=t;
}
}
}
InverseList(LNode *L)
{
LNode *p,*q;
p=L->next;
L->next=NULL;
while(p)
{
//先保存后继结点
q=p;//q和p指向同一结点
p=p->next;//p后移一位
q->next=L->next;//较难理解,第一个节点(也是最后一个结点,因为是倒插进去的,跟进栈一个道理,先进的在最下面)应指向空
L->next=q;//头节点指向第一个结点
}
}
main()
{
LNode *L1,*L2,*L3 ;
L1 =(LNode*)malloc(sizeof(LNode));
// L2 =(LNode*)malloc(sizeof(LNode));
createHead(L1);//头插法
// create(L2);//尾插法
//合并单链表 ,合并后仍然有序
// MergeList(L1,L2);
插入有序链表中
//LNode *t;
//t=(LNode*)malloc(sizeof(LNode));
//Insert(L1,t,3);
//删除指定元素
//Delete(L1,3);
//排序
Sort(L1);
//逆置单链表
InverseList(L1);
//输出
OutputList(L1);
}
注意:
1、C语言写程序,不能把申请内存代码写入函数中,否则将无法保存链表,本文把申请空间写道主函数里 )。
2、 理解p->next=s和s=p->next。(第一个p指向s,第二个是把p指向的赋值给s)