1. 程式人生 > >資料結構--單鏈表

資料結構--單鏈表

single_linklist.h

#ifndef __SINGLE_LINKLIST_H__
#define __SINGLE_LINKLIST_H__

#include <stdio.h>
#include <stdlib.h>

typedef int datatype;

typedef struct node{
	datatype data;
	struct node *next;
}listnode,*linklist;

linklist create_linklist(void);
linklist create_n_linklist(void);
int delete_pos_linklist(linklist L,int pos);
void clear_linklist(linklist L);

int get_length_linklist(linklist L);
linklist get_list_pos_linklist(linklist L,int pos);
linklist get_list_locate_linklist(linklist L,datatype x);

int insert_head_linklist(linklist L,datatype x);
int insert_n_head_linklist(linklist L);
int insert_end_linklist(linklist L,datatype x);
int insert_n_end_linklist(linklist L);
int insert_pos_linklist(linklist L,datatype x,int pos);
int insert_order_linklist(linklist L,datatype x);

void reverse_linklist(linklist);
void sort_linklist(linklist L);

void show_linklist(linklist L);


#endif

single_linklist.c

#include "single_linklist.h"


linklist create_linklist(void)
{
	linklist L;
	if((L=(linklist)malloc(sizeof(listnode))) == NULL)
	{
		printf("malloc no memmory!\n");
		return NULL;
	}
	L->data = 0;
	L->next = NULL;
	return L;
}
linklist create_n_linklist(void)
{
	linklist L,H,r;
	datatype x;
	if((L=(linklist)malloc(sizeof(listnode))) == NULL)
	{
		printf("malloc no memmory!\n");
		return NULL;
	}
	L->data = 0;
	L->next = NULL;
	r = L;
	while(1)
	{
		printf("Please input a number(-1 exit :");
		while(scanf("%d",&x) != 1)
		{
			printf("Please input a number(-1 exit :");
			getchar();
		}

		if(x == -1)break;
	
		if((H=(linklist)malloc(sizeof(listnode))) == NULL)
		{
			printf("malloc no memmory!\n");
			return L;
		}
		H->data = x;
		H->next = NULL;
		r->next = H;
		r=H;
	}
	return L;
	
}
int delete_pos_linklist(linklist L,int pos)
{
	linklist r,p;
	if(pos == 0)
	{
		r = L;
	}
	else
	{
		r = get_list_pos_linklist(L,pos-1);
	}
	if(r == NULL || r->next==NULL)
	{
		printf("argc is iavalid!\n");
		return -1;
	}
	else
	{
		p = r->next;
		r->next = p->next;
		free(p);
		p->next = NULL;
		return 0;
	}
}

void clear_linklist(linklist L)
{
	while(get_length_linklist(L))
	{
		delete_pos_linklist(L,get_length_linklist(L)-1);
	}
	free(L);
	L->next = NULL;
	L = NULL;
}
int get_length_linklist(linklist L)
{
	int i=0;
	linklist r;
	r = L;
	while(r->next)
	{
		r = r->next;
		i++;
	}
	return i++;
}
linklist get_list_pos_linklist(linklist L,int pos)
{
	int i=-1;
	linklist r;
	if(L->next == NULL)
	{
		printf("list is NULL!\n");
		return NULL;
	}
	if(pos<0 || pos>get_length_linklist(L)-1)
	{
		printf("input pos is invalid!");
		return NULL;
	}
	r = L;
	while(i<pos)
	{
		r = r->next;
		i++;
	}
	return r;
}
linklist get_list_locate_linklist(linklist L,datatype x)
{
	linklist r;
	if(L->next == NULL)
	{
		printf("list is NULL!\n");
		return NULL;
	}
	r = L->next;
	while(r->data != x)
	{
		if(r->next == NULL)
		{
			printf("value is not in list!\n");
			return NULL;
		}
		r = r->next;
	}
	return r;
}

int insert_head_linklist(linklist L,datatype x)
{
	linklist H;
	if((H=(linklist)malloc(sizeof(listnode))) == NULL)
	{
		printf("malloc no memmory\n");
		return -1;
	}
	H->data = x;
	H->next = L->next;
	L->next = H;
	return 0;
}
int insert_n_head_linklist(linklist L)
{
	datatype x;

	while(1)
	{
		printf("Please input a number(-1 exit:");
		while(scanf("%d",&x) != 1)
		{
			printf("Please input a number:(-1 exit");
			getchar();
		}
		if(x == -1)break;
		insert_head_linklist(L,x);
	}
	return 0;
}
int insert_end_linklist(linklist L,datatype x)
{
	linklist r,H;
	if((H = (linklist)malloc(sizeof(listnode))) == 	NULL)
	{
		printf("malloc no memmory!");
		return -1;
	}
	r = L;
	while(r->next)
	{
		r = r->next;
	}
	H->next = NULL;
	H->data = x;
	r->next = H;
	return 0;
}
int insert_n_end_linklist(linklist L)
{
	datatype x;

	while(1)
	{
		printf("Please input a number(-1 exit:");
		while(scanf("%d",&x) != 1)
		{
			printf("Please input a number:(-1 exit");
			getchar();
		}
		if(x == -1)break;
		insert_end_linklist(L,x);
	}
	return 0;

}
int insert_pos_linklist(linklist L,datatype x,int pos)
{
	linklist K,r;
	if(pos == 0)
	{
		r = L;
	}
	else
	{
		r = get_list_pos_linklist(L,pos-1);
	}
	if(r == NULL)
	{
		printf("argc is invalid!\n");
		return -1;
	}
	else
	{
		if((K = (linklist)malloc(sizeof(listnode))) == 	NULL)
		{
			printf("malloc no memmory!");
			return -1;
		}
		K->data = x;
		K->next = r->next;
		r->next = K;		
	}
	return 0;
}
int insert_order_linklist(linklist L,datatype x)
{
	linklist r,H;
	if((H = (linklist)malloc(sizeof(listnode))) == NULL)
	{
		printf("malloc no memmory!\n");
		return -1;
	}
	H->data = x;
	
	r = L;
	while(r->next && r->next->data<x)
	{
		r = r->next;
	}
	H->next = r->next;
	r->next = H;
	return 0;
}
void reverse_linklist(linklist L)
{
	linklist r,p;

	if(L->next == NULL)
	{
		printf("list is NULL!\n");
		return ;
	}
	
	r = L->next;
	L->next = NULL;
	while(r)
	{
		p = r;
		r = r->next;
		
		p->next = L->next;
		L->next = p;
	}
	return ;
}
void sort_linklist(linklist L)
{
	linklist r,p,q;
	if(L == NULL)
	{
		printf("list is NULL!\n");
		return ;
	}
	r = L->next;
	L->next = NULL;
	while(r)
	{
		p = r;
		r = r->next;

		q = L;
		while(q->next && q->next->data < p->data)
		{
			q = q->next;
		}
		p->next = q->next;
		q->next = p;
	}
}

void show_linklist(linklist L)
{
	if(L->next == NULL)
	{
		printf("list is NULL!\n");
		return ;
	}
	while(L->next)
	{
		printf("%d\t",L->next->data);
		L = L->next;
	}
	puts("");
	return ;
}

main.c

#include "single_linklist.h"


int main(int argc, const char *argv[])
{
	int n=0;
	linklist K;
	puts("##########--homework one--##############");
	K = create_linklist(); 
	for(n=2;n<7;n++)
	{
		insert_end_linklist(K,n*2);
	}
	show_linklist(K);

	while(1)
	{	
		printf("Please input a number (-1 exit :");
		while(scanf("%d",&n) != 1)
		{
			printf("Please input a number (-1 exit :");
			getchar();
		}
		if(n == -1)break;
		insert_order_linklist(K,n);	
		show_linklist(K);
	}

	puts("##########--homework two--##############");
	reverse_linklist(K);
	show_linklist(K);

	clear_linklist(K);
	show_linklist(K);
	return 0;

}

執行結果 在這裡插入圖片描述