常用操作:
初始化 清空 求长度 取元素 定位 插入 删除 遍历
顺序表示:
用一组连续的存储单元依次存储线性表的数据元素
链式表示:
用一组任意的存储单元存储线性表的数据元素
接点包括 数据域跟指针域。 指针域存放的是直接后继的存储位置
单链表节点的定义:
typedef int datatype;
typedef struct node
{
datatype data;
struct node *next;
}linklist;
节点申请: p=malloc(sizeof(linkist));
节点释放: free(p);
头插法建立单链表
1.建立新节点
2.向新节点中添加内容
3.使新节点指向链首
4.改变头指针
linklist *createlist()
{
int x;
linklist *head,*s;
head=NULL;
scanf("%d",&x);
while(x!=0)
{
s=(linklist*)malloc(sizeof(linklist));
s->data=x;
s->next=head;
head=s;
scanf("%d",&x);
}
return (head);
}
尾插法建立单链表:
1.建立新节点
2.向新节点中添加内容
3.将新节点链入链尾
4.改变尾指针
linklist *createlist()
{
int x;
linklist *head,*s,*r;
head=(linklist*)malloc(sizeof(linklist));
r=head;
scanf("%d",&x);
while(x!=0)
{
s=(linklist*)malloc(sizeof(linklist));
s->data=x;
s->next=NULL;
r->next=s;
r=s;
scanf("%d",&x);
}
head=head->next;
return (head);
}
插入算法:
void insert(node *head,int i,x)
{
node *s,*p;
int j;
s=(node *)malloc(sizeof(node));//生成新节点
s->data=x;
if(i==0)
{
s->next=head;
head=s;
}
else
{
p=head;
j=1;//查找第i个结点,由p指向
while(p!=NULL&&j<i)
{
j++;
p=p->next;
}
if(p!=NULL)//把新结点插入其后
{
s->next=p->next;
s->next=s;
}else
printf("未找到!/n");
}
}
删除算法:
void delete(node *head,int x)
{
node *p,*q;
if(head==NULL)
printf("链表下溢!/n");
if(head->data==x) //如果表头的值等于X
{
p=head;
head=head->next;
free(p);
}
else
{
q=head;//从第二个结点查找
p=head->next;
while(p!=NULL&&p->data!=x)
{
q=p;
p=p->next;
}
if(p!=NULL)//找到该结点,删除
{
q->next=p->next;
free(p);
}else
{
printf("未找到! /n");
}
}
}