一.链表的创建
-
定义结点(结构体类型)
-
定义指向结点的指针变量(必须有头指针)head,p1,p2
-
新建结点(malloc函数开辟内存)
-
指向
如果是第一个结点,则让头指针head指向该结点
若不是第一个结点,则让上一个结点的指针变量指向该结点
最后让尾结点的指针变量指向NULL
注:当链表的指针变量没有指向时,让其指向下一结点都会导致程序不能进行
如:List *pre;
pre->next=p;或者pre->next==NULL;
注:不要忘记让尾结点指向NULL
#include<stdio.h>
#include<stdlib.h>
typedef struct note
{
int data;
struct note *next;
}List;
struct List *createlist()
{
List *p,*pre,*head=NULL;
p=(List *)malloc(sizeof(List));
scanf("%d",&p->num);
pre=p; //记得让pre=p;否则当输入-1时,不执行循化,直接进行pre->next=NULL;从而导致程序不能运行
while(p->num!=0)
{
scanf("%s%d",p->name,&p->score) ;
if(head==NULL)
head=p;
else
pre->next=p;
pre=p;
p=(struct stud_node *)malloc(sizeof(struct stud_node));
scanf("%d",&p->num);
}
pre->next=NULL;
return head;
}
``
链表的删除
链表的删除就是改变结点中指针变量的指向,
分两种情况:
1.要删除的是头结点
2.删除的是头结点之后的
`
void del(List *head,int n)
{
List *pre,*p;
//若删除的是头结点
if(head->data==n)
head=head->next;
//若不是
else
{
for(pre=head;;pre=pre->next)
if(pre->data==n)
break;
else
p=pre;
p->next=pre->next;
}
for(pre=head;pre!=NULL;pre=pre->next)
printf("%d ",pre->data);
}
链表的增加
和删除类似,都是改变指针变量的指向,但必须排序好了
分三种情况:
1.当要添加的链表为空
2.当要添加的链表不为空,但插入点小于头结点
3.当要添加的链表不为空,并且插入点大于头结点
- 3.1 插入点在链表中(插入点小于尾结点)
3.2 插入点插在链表的末尾(插入点大于所有结点)
void(List *head,int n)
{
List *pre,*pc,*p;
pc=(List*)malloc(sizeof(List));
pc->data=n;
//1.当要添加的链表为空
if(head==NULL)
{
head=pc;
pc->next=NULL;
}
else
{
//2.当要添加的链表不为空,但插入点小于头结点
if(head->data>pc->data)
{
pc->next=head;
head=pc
}
//3.当要添加的链表不为空,并且插入点大于头结点
else
{
for(pre=head;pre->data<n&&pre->next!=NULL;pre=pre->next)
p=pre;
//3.1 插入点在链表中(插入点小于尾结点)
if(pre->data>n)
{
pc->next=pre;
p->next=pc;
}
//3.2 插入点插在链表的末尾(插入点大于所有结点)
else
{
pre->next=pc;
pc->next=NULL;
}
}
}
}