一.链表的建立
1.头插法
LinkList CreateList1(LinkList &L){//头插法
LNode *s;int x;
L=(LNode*)malloc(sizeof(LNode));//带头节点
L->next=NULL;
scanf("%d",&x);
while(x!=9999){
s=(LNode*)malloc(sizeof(LNode));
s->data=x;
s->next=L->next;
L->next=s;
scanf("%d",&x);
}
return L;
}
2.尾插法
LinkList CreateList2(LinkList &L){
L=(LNode*)malloc(sizeof(LNode));
LNode *s,*r=L;//s用来暂存输入的数,r指向链表的尾部
int x;
scanf("%d",&x);
while(x!=9999){
s=(LNode*)malloc(sizeof(LNode));
s->data=x;
r->next=s;
r=s;
scanf("%d",&x);
}
r->next=NULL;
return L;
}
二.链表的查找
1.按元素位置查找
LinkList LocationElem(LinkList L,int i){
LinkList p=L->next;//因为有头结点,所以先让p指向第一个元素
while(p!=NULL&&p->data!=i){
p=p->next;
}
return p;
}
2.按位置查找
LinkList GetElem(LinkList L,int i){//按值查询
int j=1;
LinkList p=L->next;
if(i==0) return L;//第0个是头结点
if(i<1) return NULL;//当输入的序号为负是返回空
while(p&&j<i){
p=p->next;
j++;
}
return p;
}
三.链表的插入
bool InsertList(LinkList &L,int i,ElemType e){
LinkList p=GetElem(L,i-1);//先找到要插入位置的前一个位置
LinkList s;
if(p==NULL) return false;
s=(LNode *)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
return true;
}
四.链表的删除
bool DeleteList(LinkList &L,int i){
LinkList p=GetElem(L,i-1);//先找到要插入位置的前一个位置
if(p==NULL) return false;
LinkList q=p->next;
p->next=q->next;
free(q);
q=NULL;
return true;
}
五.链表的修改
bool ChangeList(LinkList &L,int i,ElemType e){
if(i==0) return false;
LinkList p=GetElem(L,i);
p->data=e; return true;
}
链表的建立与增删改查
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
LinkList CreateList1(LinkList &L){//头插法
LNode *s;int x;
L=(LinkList)malloc(sizeof(LNode));//带头节点
L->next=NULL;
scanf("%d",&x);
while(x!=9999){//9999是输入结束的标志
s=(LNode*)malloc(sizeof(LNode));
s->data=x;
s->next=L->next;
L->next=s;
scanf("%d",&x);
}
return L;
}
LinkList CreateList2(LinkList &L){
L=(LNode*)malloc(sizeof(LNode));
LNode *s,*r=L;
int x;
scanf("%d",&x);
while(x!=9999){
s=(LNode*)malloc(sizeof(LNode));
s->data=x;
r->next=s;
r=s;
scanf("%d",&x);
}
r->next=NULL;
return L;
}
LinkList GetElem(LinkList L,int i){//按值查询
int j=1;
LinkList p=L->next;
if(i==0) return L;
if(i<1) return NULL;
while(p&&j<i){
p=p->next;
j++;
}
return p;
}
LinkList LocationElem(LinkList L,int i){
LinkList p=L->next;
while(p!=NULL&&p->data!=i){
p=p->next;
}
return p;
}
bool InsertList(LinkList &L,int i,ElemType e){
LinkList p=GetElem(L,i-1);
LinkList s;
if(p==NULL) return false;
s=(LNode *)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
return true;
}
bool DeleteList(LinkList &L,int i){
LinkList p=GetElem(L,i-1);
if(p==NULL) return false;
LinkList q=p->next;
p->next=q->next;
free(q);
q=NULL;
return true;
}
bool ChangeList(LinkList &L,int i,ElemType e){
if(i==0) return false;
LinkList p=GetElem(L,i);
p->data=e; return true;
}
void PrintList(LinkList L)
{
printf("链表为:") ;
L = L->next;
while (L != NULL)
{
printf("%3d", L->data);//打印当前结点数据
L = L->next;//指向下一个结点
}
printf("\n");
}
int main(){
LinkList L1,L2;
printf("头插法,请输入:\n");
CreateList1(L1);
PrintList(L1);
printf("尾插法,请输入:\n");
CreateList2(L2);
printf("以下是对尾插法建立的链表,即L2的操作\n");
int i1,e1;
printf("请输入要插入的位置:\n");
scanf("%d",&i1);
printf("请输入要插入的元素:\n");
scanf("%d",&e1);
if(InsertList(L2,i1,e1)) PrintList(L2);
int i2;
printf("请输入要删除的位置:\n");
scanf("%d",&i2);
if(DeleteList(L2,i2)) PrintList(L2);
int i3,e3;
printf("请输入要修改的位置:\n");
scanf("%d",&i3);
printf("要修改为:\n");
scanf("%d",&e3);
if(ChangeList(L2,i3,e3)) PrintList(L2);
int i4;
printf("请输入要查找的位置:\n");
scanf("%d",&i4);
if(GetElem(L2,i4)!=NULL){
printf("按序号查找成功,第%d个元素为%d\n",i4,GetElem(L2,i4)->data);
}
int i5;
printf("请输入要查找的元素:\n");
scanf("%d",&i5);
if(LocationElem(L2,i5)!=NULL){
printf("按值查找成功,元素为%d\n",LocationElem(L2,i5)->data);
}
//if(ChangeList(L2,3,88)) PrintList(L2);
//PrintList(L2);
// else{
// printf("查找失败!")
// }
// if(LocationElem(L2,6)!=NULL){
// printf("按值查找成功,%d\n",LocationElem(L2,6)->data);
// }
// else{
// printf("查找失败!");
// }
// LinkList l=GetElem(L2,1);
// printf("%d\n",l->data);
// int ret;
// ret=DeleteList(L2,4);
// if(ret) PrintList(L2);
}
结果如下:
头插法,请输入:
1 2 3 4 9999
链表为: 4 3 2 1
尾插法,请输入:
1 2 3 4 9999
以下是对尾插法建立的链表,即L2的操作
请输入要插入的位置:
5
请输入要插入的元素:
5
链表为: 1 2 3 4 5
请输入要删除的位置:
1
链表为: 2 3 4 5
请输入要修改的位置:
2
要修改为:
99
链表为: 2 99 4 5
请输入要查找的位置:
2
按序号查找成功,第2个元素为99
请输入要查找的元素:
4
按值查找成功,元素为4