需要注意的:1.InitList(List &L)&是标识符的作用 L和实参同一个引用
2.在每个方法中不能对头结点操作 先把头结点赋值一份 对副本引用操作
3.操作链表中间需要从头结点开始一个个查找,找到目标再插入 删除 可以先写查找方法 实现代码复用
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode{
int data;
LNode* next;
}*LinkList,*List;
void CreateLinkList_head(LinkList &l,int n){ //n可以设置为插入结点次数
List p; //l头结点 p为新结点
int i=0,x;
printf("请输入第%d个结点的值
",++i);
scanf("%d",&x);
while(x!=-1){
p=(List)malloc(sizeof(LNode));
// 头插法
p->next=l->next; //新结点指向原结点指向的
p->data=x; //新结点赋值
l->next=p; //原结点和新结点建立连接
printf("请输入第%d个结点的值
",++i);
scanf("%d",&x);
}
}
void CreateLinkList_end(LinkList &e,int n){
List l,newList;
int i=1,x;
l=e;
while(n>0){
newList=(List)malloc(sizeof(LNode));
l->next=newList;
l=newList;
printf("请输入第%d个结点的值
",i++);
scanf("%d",&x);
newList->data=x;
n--;
}
l->next=NULL;
}
void initLinkList(LinkList &p){
p=(List)malloc(sizeof(LNode));
p->next=NULL;
}
void DestroyList(LinkList &l){
List p=l->next;
while(l->next!=NULL){
l=l->next;
free(p);
}
free(l); //释放头结点
l=NULL; //把链表首地址赋空
}
void ClearList(LinkList &l){
List p=l->next;
while(l->next!=NULL){
l=l->next;
free(p);
}
}
int LenghtList(LinkList &l){
int i=0;
LinkList h;
h=l;
while(h->next!=NULL){
h=h->next;
i++;
}
return i;
}
List LocateList(LinkList &l,int n){ //找到第n个元素 返回他的地址
List h;
h=l;
while(n){
h=h->next; //在第n次循环完 h指向第n个元素
n--;
}
return h;
}
void InsertList(LinkList &l,int n,int x){ //在第n个位置之后 插入 值x
List h,p;
p=(List)malloc(sizeof(LNode));
p->data=x;
h=l;
if(n>LenghtList(l)){
printf("ERROR!");
return;
}
// while(n){
// h=h->next;
// n--;
// } //经过n次循环 h是第n个结点的地址
h=LocateList(l,n); //找到第n个结点 代码复用
p->next=h->next;
h->next=p;
}
void DeleteList(LinkList &l,int n){
List h,p;
h=l;
if(n>LenghtList(l)){
printf("ERROR!");
return ;
}
// while(n-1){
// h=h->next;
// n--; //经过n-1次循环 h是n前一个结点的地址
// }
h=LocateList(l,n-1);
p=h->next; //要删除的结点地址 设定p原因:改变指针后用p找到
h->next=p->next;
p->next=NULL;
free(p);
}
int main(){
LinkList L,p;
initLinkList(L);
CreateLinkList_end(L,5);
DeleteList(L,4);
InsertList(L,3,-1);
p=LocateList(L,3);
int i=1;
while(L->next!=NULL){
L=L->next;
printf("第%d个结点的值为%d
",i++,(L->data));
}
printf("%d",p->data);
return 0;
}