细节问题并未处理,如判断表是否为空,代码段均为主要部分;初学阶段,低级错误在所难免,水平有限,仅供参考,欢迎指正.
一.结点结构
1.思路:数据域,指针域;
2.代码实现:
typedef struct LNode{
int x;
struct LNode* Next;
}list;
二.创建空表
1.思路:创建一个头指针,让头指针的指针域为NULL,返回头指针地址;
2.代码实现:
list *CreatList()
{
list *head=(list*)malloc(sizeof(list));
if(head==NULL){
printf("申请内存空间失败");
}else{
head->Next=NULL;
}
return head;
}
三.尾部插入
1.思路:遍历找到表尾结点(表头结点不能移动,需定义临时指针变量来遍历),让表尾结点指针域指向新结点;
2.代码实现:
list *AddL (int x,list *head)
{ //找到尾部;
list *temp=head;
while(temp->Next!=NULL){
temp=temp->Next;
}
//赋值插入;
list *newL=(list *)malloc(sizeof(list));
newL->Next=NULL;
newL->x=x;
temp->Next=newL;
return head;
}
四.指定位置插入
1.思路:遍历链表,找到先驱结点,先让新结点指向后继结点,再让先驱结点指向新结点;
2.代码实现:
list* AddList2 (int i,int x,list *head)
{
int temi=0;
list *pre=head;
for(temi=1;temiNext;
}
list *newL=(list*)malloc(sizeof(list));
newL->Next=pre->Next;
newL->x=x;
pre->Next=newL;
return head;
}
五.修改结点
1.思路:遍历链表,找到指定结点,修改数据域;
2.代码实现:
list *ReviseList(int i,int x,list*head)
{
int temi=0;
list*p=head;
for(temi=0;temiNext;
}
p->x=x;
return head;
}
六.删除结点
1.思路:遍历链表,找到待删结点的前驱结点,让其指向待删结点的后驱结点,释放空间;
2.代码实现:
list *DeleteList(int i,list* head)
{
list *pre=head;
int temi=0;
for(temi=1;temiNext;
}
list *p=pre->Next;
pre->Next=pre->Next->Next;
free(p);
return head;
}
七.打印单链表
1.思路:遍历;
2.代码实现:
void PrintL(list *head)
{
if(head->Next==NULL){
printf("Empty");
}
else{
list *temp=head->Next;
while(temp!=NULL){
printf("%dt",temp->x);
temp=temp->Next;
}
}
}
八.两极反转
1.思路:创建一个临时头指针,遍历一个新结点,使头指针指向该节结点,遍历指针移向下一个,被取结点指针域指向上一个被取结点,保留本轮所取结点,循环;
2.代码实现:
list *ReverseList (list *head)
{
list*temp=head->Next;
list *ReverseHead;
list *next=NULL;
while(temp!=NULL){
ReverseHead=temp;
temp=temp->Next;
ReverseHead->Next=next;
next=ReverseHead;
}
head->Next=ReverseHead;
}



