数据结构之线性表篇

数据结构之线性表篇

一.线性表的链式存储

1. 结点的描述

typedef struct node{
    int data;
    struct node *next;
}NODE,*Linklist;//等价于 define NODE *Linklist;

2.单链表的创建

LinkList createList(){
    LinkList head;//生成头结点
    head = (LinkList)malloc(sizeof(NODE));
    LinkList tail = head;
    tail->next = NULL;
    
    printf("请输入链表长度");
    int num;
    scanf("%d",&num);
    printf("请依次输入%d个元素\n",num);

    for(int i=num;i>0;i--){
        LinkList p = (LinkList)malloc(sizeof(NODE));
        scanf("%d",&p->data);
        //尾插法
        tail->next=p;
        tail=p;
        tail->next = NULL;
		/*
		头插法
		p->next = tail->next;
		tail->next=p;
		*/
    }
    printf("初始化成功\n");
    return head;
}

3.遍历单链表

void PrintList(LinkList head){
    LinkList p;
    p = head->next;
    while(p!=NULL){
        printf("%d ",p->data);
        p=p->next;
    }
    printf("\n");
}

4.求链表长度

int lengthList(LinkList head){
	int len;
	LinkList p = head->next;
	while(p!=NULL){	
		len++;
		p=p->next;
	}
}

5.查找元素(按序号)

LinkList getNodeByNum(LinkList head,int loc){
	if(loc<1||loc>lengthList(head)){
		printf("该元素不存在");
		return NULL;
	}
	LinkList p = head;
	int i;
	while(p->next&&i<j){
		p=p->next;
		i++;
	}
	if(i==j)
		return p;
	else
		return NULL;
}

6.查找元素(按值)

LinkList getNodeByVal(Linklist head,int value){
	LinkList p = head;
	while(p->next&&p->data!=value)
		p=p->next;
	if(p->data==value)	
		return p;
	else
		return NULL;
}

7.插入

int insertList(Linklist head,int loc,int value){
	LinkList p,r;
	if(loc==1)
		p=head;
	else{
		p=getNodeByNum(head,loc-1);
	}
	if(p==NULL)
		return 0;
	r=(LinkList)malloc(sizeof(NODE));
	r->data = value;
	r->next = p->next;
	p->next = r;
	return 1;
}

8.删除

int deleteList(LinkList head,int loc){
	LinkList p,r;
	if(loc==1)	
		p=head;
	else
		p=getNodeByNum(head,loc-1);
	if(p==NULL||p->next==NULL)//p不存在或p为最后一个结点
		return 0;
	r=p->next;
	p->next = r->next;
	free(r);
	return 1;
}

9.逆置单链表

  1. 反转指针
LinkList reverseList(LinkList head){
	LinkList pre,p=head->next,r=p->next;
	//对第一个结点操作
	p->next=NULL;
	while(r)//当r为NULL时,则p为最后一个结点
	{
		pre=p;
		p=r;
		r=r->next;
		p->next=pre;
	}
	head->next = p;
	return head;
}
  1. 头插法
LinkList reverseList(LinkList head){
	LinkList p,r;
	p=head->next;
	head->next=NULL;//先将头结点分离出去 然后使用头插法
	while(p){
		r=p->next;
		p->next=head->next;
		head->next=p;
		p=r;
	}
	return head;
}
发布了16 篇原创文章 · 获赞 1 · 访问量 1740

猜你喜欢

转载自blog.csdn.net/qq_42584241/article/details/91624312