线性表ya

本文详细介绍了顺序表和单链表的数据结构及其操作,包括初始化、插入、删除、更新、求长度、定位、遍历、创建和逆置等基本操作。此外,还探讨了单向循环链表的插入和删除方法。这些内容对于理解和掌握链表操作至关重要。
摘要由CSDN通过智能技术生成

一.顺序表

二.单链表

 

1.定义

typedef struct node{
ElemType data;
strcut node *next;
}Node,*LinkList;

2.初始化

int InitLinkList(LinkList *L){
(*L)=(LinkList)malloc(sizeof(Node));
if((*L)==NULL)  return 0;
(*L)->next=NULL;
return 1;
}

3.插入(易错j<i-1,找到第i-1的位置)

int insertLinkLinst(LinkList L,ElemType e,int i){
LinkList p=L,q;
int j=0;
if(i<=0) {printf("输入位置不对\n"); return 0;}
if(q=(LinkList)malloc(sizeof(Node))==NULL){printf("申请空间失败\n"); return 0;}
q->data=e;
while(p!=NULL&&j<i-1){
p=p->next;
j++;
}
if(p==NULL) {printf("插入位置越上界\n"); return 0;}
q->next=p->next;
p->next=q;
return 1;
}

4.删除(易错p->next!=NULL)

int deletLinkList(LinkList L,int i,ElemType *e){
LinkList p=L,q;
int j=0;
if(i<=0) {printf("删除位置不对\n"); return 0;}
while(p->next!=NULL&&j<i-1){
p=p->next;
j++;
}
if(p==NULL) {printf("删除位置错误\n"); return 0;}
q=p->next;
p->next=q->next;
*e=q->data;
free(q);
return 1;
}

5.更新/修改

int updataLinkList(LinkList L,int i,ElemType e){
LinkList p=L;
int j=0;
if(i<=0) {printf("位置不对\n"); return 0;}
while(p!=NULL&&j<i){
p=p->next;
j++;
}
if(p==NUll){printf("越上界,修改失败\n");return 0;}
p->data=e;
return 1;
}

6.求长度

int LinkListLength(LinkList L){
LinkList p=L->next;
int n=0;
while(p){
p=p->next;
n++;
}
printf("链表长度是%d",n);
return 1;
}

7.定位

int LactionLinkList(LinkList L,ElemType e){
LinkList p=L->neXt;
int i=0;
while(p&&strcmp(e,p->data)){
p=p->next;
i++;}
if(p==NULL) {printf("没有查找到\n"); return 0;}
printf("在第%d个位置\n",i);
return 1;
}

8.遍历

int disLinkList(LinkList L){
LinkList p=L->next;
while(p){
printf("%s  %d\n",p->data.name,p->data.number);
p=p->next;
}
return 1;
}

9.创建 

void createLinkList(LinkList *L){
int n=1,i;
ElemType e;
InitLinkList(L);
do{
printf("请输入插入对象\n");
scanf("%s%d",e.name,&e.number);
insertLinkList(*L,n++,e);
printf("请问要继续输入吗?1是/0否");
scanf("%d\n",&i);
}while(i);
}

10.逆置 

void inverLinkList(LinkList L){
LinkList p=L->next,q;
L->next=NULL;
while(p){
q=p;
p=q->next;
q->next=L->next;
L->next=q;
}
} 

三.单向循环链表

1.定义(同单链表)

2.初始化

int InitLinkList(LinkList *L){
*L=(LinkList)malloc(sizeof(Node));
if(*L==NULL) exit(0);
(*L)->next=*L;
return 1;
}

 3.插入

int insertLinkList(LinkList L,int i,ElemType e){
LinkList q,p=L;
int j=0;
if(i<=0) {printf("输入位置不对\n"); return 0;}
if(q=(LinkList)malloc(sizeof(Node))==NULL){printf("申请空间失败\n"); return 0;}
q->data=e;
while(p->next!=L&&j<i-1){
p=p->next;
j++;
}
if(p->next==L){printf("插入位置越上界\n"); return 0;}
if(j>i-1)
q->next=p->next;
p->next=q;
return 1;
}

4.删除

int deleLinkList(LinkList L,int i){
LinkList L=p,q;
int j=0;
if(L->next==L){printf("链表为空\n"); return 0;}
while(p->next!=L&&j<i-1){
p=p->next;
j++;
}
if(p->next==L){printf("位置越上界\n"); return 0;}
q=p->next;
p->next=q->next;
free(q);
return 1;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值