一 . 链表的创建
1)链表是由结点构建而成,结点中既包含数据域,也包含指针域,指针域涵盖的是下一个结点数据域的地址。
2)先用结构体的方式创建结点,再多次利用结构体创建链表函数,最后主函数对链表函数进行调用。
例如:
#include<stdio.h>
#include<stdlib.h>
typedef struct stud
{
int num;
char name[20];
int score;
struct stud *next;
}Node;
void Node *creat()
{
Node *p1,*p2,*head;
head=p2=(Node *)malloc(sizeof(Node);
p1=(Node *)malloc(sizeof(Node);
scanf("%d %s %d",&p1->num,p1->name,&p1->score);
while(p1->num!=0)
{
p2->next=p1;
p2=p1;
p1=(Node *)malloc(sizeof(Node);
scanf("%d %s %d",&p1->num,p1->name,&p1->score);
}
p2->next=NULL;
return head;
}
int main()
{
Node *head;
head=creat();
head=head->next;
while(head!=NULL)
{
printf("%d %s %d",p->num,p->name,p->score);
head=head->next;
}
}
二 . 增删查改
删除:int deletes(Node *p1)
{
int n;
Node *p2;
p2=p1->next;
scanf("%d",&n);
while(p2!=NULL)/*大条件*/
{
if(p2->num==num)
{
p1->next=p2->next;
free( p2);
return 1;
}/*未找到则继续推移*/
p1=p2;
p2=p2->next;
}
return 0;
}
增加:int add(Node *p1)
{
Node *p2;
p2=(Node *)mallco(N);
scanf("%d %s %f",&p2->num,p2->name,&p2->score);
while(p1->next!=NULL&&p1->next->num<p->num)
p1=p1->next;/*推移寻找增加的位置*/
p2->next=p1->next;
p1->next=p2;
return 1;
}
查找struct stud *search(Node *p)
{
int num,score;
scanf("%d",&num);
while(p->next!=NULL)
{
p=p->next;
if(p->num==num)
return p;
}
return 1;
} /*改直接可以在查找以后*/
三 . 一般题目
1)求倒数第k个结点:可以定义两个指针,一个Q一个S,先让Q比S早走k个结点后再一起走,则当Q到NULL时,S即为地k个结点。
2)求链表长度时:定义两个指针同时走,一个二步走,一个一步走,到第两次相遇时相差即为链表长度。
3)构造带环结点:让尾结点指向头节点。