線性表 ----鏈表的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;
}
相關文章
相關標籤/搜索