线性表单链表的实现
Posted 路人姜。
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线性表单链表的实现相关的知识,希望对你有一定的参考价值。
一、基本操作
1)定义
typedef int ElementType;
typedef LNode *PtrToLNode;//指向结点的指针
struct LNode{
ElementType data;
PtrToLNode next;
};
typedef PtrToLNode List;
2)初始化
List L;
L=(LNode *)malloc(sizeof(LNode));//生成头结点
L->next=NULL;
3)单链表的建立
①头插法
void CreateListF(List *L){
int i;
for(i=1;i<=5;i++){
PtrToLNode q;
q=(PtrToLNode)malloc(sizeof(Node));//初始化!!!
q->data=i;
q->next=(*L)->next;
(*L)->next=q;
}
}
②尾插法
void CreateListR(List *L){
int i;
PtrToLNode r;//尾指针
r=*L;
for(i=1;i<=5;i++){
PtrToLNode q;
q=(PtrToLNode)malloc(sizeof(Node));
q->data=i;
r->next=q;
r=q;
}
r->next=NULL;//!!!
}
4)遍历单链表并且求其长度
int GetListLength(List *L){
PtrToLNode ptr;
ptr=(*L)->next;
int length=0;
while(ptr!=NULL){
length++;
printf("%d ",ptr->data);
ptr=ptr->next;
}
printf("\n");
return length;
}
5)在第i个位置前插入新结点
//有头结点,在第i个位置前插入某个元素,所以i大于等于1小于等于表长
Status ListInsert(List *L,int i,ElementType e){
int j=0;
PtrToLNode t,q;
t=(PtrToLNode)malloc(sizeof(Node));
q=*L;//不是p->(*L)->next;
//q指向第i-1个结点
while(j<i-1&&q){
j++;
q=q->next;
}
if(j>i-1||!q){//如果i<=1,j<i-1;如果i>表长,q=NULL
return ERROR;
}
t->data=e;
t->next=q->next;
q->next=t;
return OK;
}
6)删除第i个结点
//单链表删除和插入操作都要找第i个位置的前一个结点!
Status ListDelete(List *L,int i,ElementType *e){
int j=0;
PtrToLNode t,q;
t=(PtrToLNode)malloc(sizeof(Node));
q=*L;
while(j<i-1&&q){
j++;
q=q->next;
}
if(j>i-1||!q){
return ERROR;
}
t=q->next;
*e=t->data;
q->next=t->next;
return OK;
}
二、栗子
#include <stdio.h> #include <stdlib.h> #define ERROR -1 #define OK 1 typedef int Status;//函数返回状态 typedef int ElementType; typedef struct LNode *PtrToLNode;//指向结点的指针 struct LNode{ ElementType data; PtrToLNode next; }; typedef struct LNode Node; typedef PtrToLNode List; void CreateListF(List *L); void CreateListR(List *L); int GetListLength(List *L); Status ListInsert(List *L,int i,ElementType e); Status ListDelete(List *L,int i,ElementType *e); int main() { List L; int length; //初始化 L=(PtrToLNode)malloc(sizeof(Node));//生成头结点 L->next=NULL; //头插法 CreateListF(&L); //遍历单链表并且求其长度 printf("头插法:"); length=GetListLength(&L); printf("长度:%d\n",length); //尾插法 CreateListR(&L); //遍历单链表并且求其长度 printf("尾插法:"); length=GetListLength(&L); printf("长度:%d\n",length); //在第i个位置前插入新结点 int t=ListInsert(&L,1,666); if(t==1){ printf("链表长度为:%d\n",GetListLength(&L)); } else if(t==-1){ printf("插入位置越界\n"); } //删除第i个结点 int e; t=ListDelete(&L,1,&e); if(t==1){ length=GetListLength(&L); printf("长度:%d\n",length); printf("删除的元素为:%d\n",e); } else if(t==-1){ printf("删除位置越界\n"); } return 0; } void CreateListF(List *L){ int i; for(i=1;i<=5;i++){ PtrToLNode q; q=(PtrToLNode)malloc(sizeof(Node));//初始化!!! q->data=i; q->next=(*L)->next; (*L)->next=q; } } void CreateListR(List *L){ int i; PtrToLNode r;//尾指针 r=*L; for(i=1;i<=5;i++){ PtrToLNode q; q=(PtrToLNode)malloc(sizeof(Node)); q->data=i; r->next=q; r=q; } r->next=NULL;//!!! } int GetListLength(List *L){ PtrToLNode ptr; ptr=(*L)->next; int length=0; while(ptr!=NULL){ length++; printf("%d ",ptr->data); ptr=ptr->next; } printf("\n"); return length; } //有头结点,在第i个位置前插入某个元素,所以i大于等于1小于等于表长 Status ListInsert(List *L,int i,ElementType e){ int j=0; PtrToLNode t,q; t=(PtrToLNode)malloc(sizeof(Node)); q=*L;//不是p->(*L)->next; //q指向第i-1个结点 while(j<i-1&&q){ j++; q=q->next; } if(j>i-1||!q){//如果i<=1,j<i-1;如果i>表长,q=NULL return ERROR; } t->data=e; t->next=q->next; q->next=t; return OK; } Status ListDelete(List *L,int i,ElementType *e){ int j=0; PtrToLNode t,q; t=(PtrToLNode)malloc(sizeof(Node)); q=*L; while(j<i-1&&q){ j++; q=q->next; } if(j>i-1||!q){ return ERROR; } t=q->next; *e=t->data; q->next=t->next; return OK; }
三、总结
1)存储结构:链式存储结构
2)特点:存储单元不连续
3)存取方式:顺序存取
4)有头结点和无头结点的操作差异
5)删除和插入第i个结点,都是要找到第i-1个结点
以上是关于线性表单链表的实现的主要内容,如果未能解决你的问题,请参考以下文章