目录
头插法(数组) :https://blog.csdn.net/qq_40636008/article/details/123732444?spm=1001.2014.3001.5501
单链表
单链表的创建
-
尾插法:
-
尾插法(无表头)代码实现
//链表的创建(无表头)
List* createlist()
{
List* head,* idx,*end;
idx=new(List);
head=idx;
end=idx;
while(1)
{
if(/*输入终止条件*/) break;
else
/* 输入数据 */
end->next=idx;
end=idx;
idx=new(List);
}
end->next=NULL;
return head;
}
int main()
{
List *head=createlist();
}
-
尾插法(带表头)代码实现
//链表的创建(带表头)
List* createlist()
{
List* head,*idx,*end;
head=new(List);
end=head;
while(1)
{
idx=new(List);
if(/*输入终止条件*/) break;
else
/* 输入数据 */
end->next=idx;
end=idx;
}
end->next=idx;
return head;
}
int main()
{
List *head=createlist();
}
头插法
头插法(带表头)代码实现
List* createlist()
{
List* head,*idx;
head=new(List);
head->next=NULL;
while(1)
{
idx=new(List);
if(/* 输入终止条件 */) break;
else
/* 输入数据 */
idx->next=head->next;
head->next=idx;
}
return head;
}
单链表的操作
插入操作
原理:先创建预插入节点idx的空间,然后找到p节点,令idx->next=p->next,p->next=idx;
list* insert(list* head,int k,int d)
{
list *p=head;
list *idx;
idx=new(list);
idx->data=d;
if(k>n) return p; /* 如果预插入p节点后的p大于当前链表长度,操作无效 */
else if(k==0) /* 如果插入在链表头插入 */
{
idx->next=p;
p=idx;
return p;
}
else
{
for(int i=0;i<k-1;i++) p=p->next;
idx->next=p->next;
p->next=idx;
}
n++;
return head;
}
删除操作
原理:找到预删除节点k的上一个节点p,令p->next=p->next->next
list* remove(list* head,int k)
{
list* p=head;
if(k==0||k>n) return p; /* 删除第0个节点或者删除超过链表长度的节点,操作无效 */
else
{
if(k==1) p=p->next; /* 删除链表首节点 */
else
{
for(int i=0;i<k-2;i++) p=p->next; /* 找到预删除节点的上一个,可以用特殊值推一推 */
p->next=p->next->next;
}
n--;
}
return head;
}
遍历操作
void bianli(List *head)
{
for(List *p=head;p!=NULL;p=p->next)
{
/* 遍历时所要进行的操作 */
}
}
特殊链表构建
尾插法(数组)
//链表的创建(数组+结构体:需要对链表进行某种排序时可用)
int main()
{
int n;
cin>>n;
List a[500];
for(int i=0;i<n;i++)
{
/* 输入数据 */
a[i].next=&a[i+1];
}
/* 可用sort(a,n,cmp)对链表里的数据进行排序 */
for(int i=0;i<n;i++)
{
a[i].next=&a[i+1];
}
/* 排序后需要重新建立链式关系 */
a[n-1].next=NULL;
}
头插法(数组) :https://blog.csdn.net/qq_40636008/article/details/123732444?spm=1001.2014.3001.5501
常见错误
- List *p=NULL时,却出现了p->data的操作
- 已经delete p或free (p)后,却使用到了p