线性表 ----链表的C语言实现

本人刚开始研究数据结构,欢迎拍砖!!!node

首先从最简单的线性表开始数组

1.线性表存储结构数据结构

a。顺序存储,最简单来讲就是数组了吧,这里就不说了。测试

b。链式存储,就是来讲链表了。指针

2.链表code

在这里使用的是有head的链表,头部不含数据信息。it

如图所示链表结构io

首先是节点信息class

//链表节点结构
typedef struct node{
	int data;            //节点值域
	struct node* next;		//节点指针域
}NODE;

下面介绍关于链表的简单操做,仍是直接贴代码吧。。。

一共三个文件。List

linkList.H

/************************************************************************/
/* 操做单链表,该链表带有头部空节点                                                                     */
/* */
/**********************************************************************/

//链表节点结构
typedef struct node{
	int data;            //节点值域
	struct node* next;		//节点指针域
}NODE;

//查找链表中第K个元素
//存在返回该节点指针,不存在返回null

NODE* find_List(NODE* head, int k);

//在第K个元素以前插入新的节点
NODE* insert_List(NODE* head, int k, int newItem);

//删除第K个节点
int delete_List(NODE* head, int k);

而后是linkList.cpp

#include  "linkList.h"
#include <stdio.h>
#include <MALLOC.H>
NODE* find_List(NODE* head, int k){
	if (k<1)
	{
		return NULL;
	}
	int i = 1;
	NODE* p = head->next;
	while( NULL != p && i < k)
	{
		p = p->next;
		++i;
	}
	return p;
}

NODE* insert_List(NODE* head, int k, int newItem){
	NODE* p;
	NODE* s = (NODE*)malloc(sizeof(NODE));//建立新的节点
	s->data = newItem;
	if (k ==0 ) //空链表
	{
		head->next = s;
		s->next = NULL;
		return s;
	}
	else if (k == 1)      //在第一个元素以前插入
	{
		p = head;

	}else{
		p = find_List(head,k-1);//查找第k-1个元素
	}
	
	if (p==NULL)
	{
		free(s);
		return NULL;
	}



	s->next = p->next;
	p->next = s;

	return s;
}

int delete_List(NODE* head, int k){
	NODE* p;
	if (k==1)
	{
		p = head;
	}else
	{
		p = find_List(head,k-1);
	}
	if (p==NULL || p->next == NULL) //表中不存在
	{
		return 0;
	}
	NODE* s = p->next;
	p->next = s->next;
	free(s);
	return 1;
}

而后是一个测试。

#include "linkList.h"
#include <STDIO.H>
#include <MALLOC.H>
int main(){

	//构建链表
	NODE* head = (NODE*)malloc(sizeof(NODE));
	head->next = NULL;
	for (int i = 0; i < 10; i++)
	{

		insert_List(head,i,i);
	}

	//打印全部节点
	NODE* p = head->next;
		while(p != NULL)
		{

			printf("%d\n",p->data);
			p = p->next;
		}
	//删除奇数位置节点
	for(int j = 1; j<10; j = j+1)
	{
		delete_List(head,j);
	}
	//打印全部节点
	 p = head->next;
	while(p != NULL)
	{
		
		printf("%d\n",p->data);
		p = p->next;
		}

	return 0;
}
相关文章
相关标签/搜索