注:以下所有链表都含有头结点
一、单链表
1.单链表的定义
typedef struct node
{
int data;
struct node *next;
}LNode,*LinkList;
data为数据域,next为指针域
2.链表的建立
(1)头插法建表
//采用头插法建表 (含有头结点)
LinkList Create_LinkList1()
{
LinkList H=(LinkList)malloc(sizeof(LNode));
H->next=NULL;
LNode *s;
int x;
scanf("%d",&x);
while(x!=-1)
{
s=(LinkList)malloc(sizeof(LNode));
s->data=x;
s->next=H->next;
H->next=s;
scanf("%d",&x);
}
return H;
}
设计思路:
1>.申请一个头结点,置空指针域
2>.读入一个数据,申请一个结点,并插入;数据为-1时停止创建。
3>.插入具体步骤如图所示:
扫描二维码关注公众号,回复:
5097527 查看本文章
(2)尾插法建表
//尾插法建表 (含有头结点)
LinkList Create_LinkList2()
{
LinkList H=(LinkList)malloc(sizeof(LNode));
H->next=NULL;
LNode *p,*s;
p=H;
int x;
scanf("%d",&x);
while(x!=-1)
{
s=(LinkList)malloc(sizeof(LNode));
s->data=x;
s->next=p->next;
p->next=s;
p=s;
scanf("%d",&x);
}
return H;
}
设计思路如下:
1>.申请一个头结点,置空指针域
2>.读入一个数据,申请一个结点,并插入;数据为-1时停止创建。
3>.插入具体步骤如图所示:
3.链表的遍历
//打印链表
int Print_LinkList(LinkList H)
{
LNode *p;
if(H->next==NULL)
{
printf("表空!\n");
return -1;
}
else
{
printf("链表的每个结点的data值为");
p=H->next;
while(p!=NULL){
printf("%d ",p->data);
p=p->next;
}
printf("\n");
return 0;
}
}
4.链表的表长
//求表长
int Length_LinkList(LinkList H)
{
int length=0;
LNode *p=H;
while(p->next!=NULL)
{
length++;
p=p->next;
}
return length;
}
5.链表的查找
(1)按序号查找
LNode *Get_LinkList(LinkList H,int x)
{
LNode *p=H;
int j=0;
while(p->next!=NULL&&j<x)
{
j++;
p=p->next;
}
if(j==x)
return p;
else
return NULL;
}
(2)按值x查找
LNode *Locate_LinkList(LinkList H,int x)
{
LNode *p=H->next;
while(p!=NULL&&p->data!=x)
p=p->next;
return p;
}
6.链表的插入
//插入操作
int Insert_LinkList(LinkList H,int i,int x)
{
LNode *p=NULL;
LNode *s=NULL;
p=Get_LinkList(H,i-1);
if(p==NULL)
{
printf("插入位置错误");
return -1;
}
else
{
s=(LinkList)malloc(sizeof(LNode));
s->data=4;
s->next=p->next;
p->next=s;
return 1;
}
}
7.链表的删除
int Del_LinkList(LinkList H,int i)
{
LNode *p=NULL;
LNode *q=NULL;
p=Get_LinkList(H,i-1);
if(p==NULL)
{
printf("第i-1个结点不存在");
return -1;
}
else{
if(p->next==NULL)
{
printf("第i个结点不存在");
return -1;
}
else
{
q=p->next;
p->next=q->next;
free(q);
return 1;
}
}
}
8.删除重复结点
void Pur_LinkList(LinkList H)
{
LNode *p;
LNode *q;
LNode *r;
p=H->next;
//if(p!=NULL)
//while(p->next)
while(p!=NULL)//纠正错误
{
q=p;
while(q->next!=NULL)
{
if(p->data==q->next->data)
{
r=q->next;
q->next=r->next;
free(r);
//printf("*");
}
else
q=q->next;
// printf("^");
}
p=p->next;
}
}
这段代码中,我唯一注释的部分是比较容易出错的地方
9.例题
求集合A-B
void Difference1(LinkList LA,LinkList LB)
{
LNode *p;
LNode *pre;
LNode *r;
LNode *q;
pre=LA;
p=LA->next;
while(p!=NULL)
{
q=LB->next;
while(q!=NULL&&q->data!=p->data)
{
q=q->next;
}
if(q!=NULL)
{
r=p;
p=p->next;
pre->next=p;
free(r);
}
else
{
pre=p;
p=p->next;
}
}
}