Last updated on

数据结构(二) - 双向链表


这次我就写了最基本的创建、插入、删除、遍历这四个基本的 函数

啥也不说了 上代码

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

typedef struct linklist{
	struct linklist * lastnode;
	int data;
	struct linklist * nextnode;
} link;

bool create_link(link * head, int times);
void foreach_link(link * head); 
bool insert_element(link * head, int n, int num);
bool delete_element(link * head, int n);

int main(int argc, char *argv[])
{
	link * list = (link *)malloc(sizeof(link));
	create_link(list,5);
	printf("\n");
	foreach_link(list);
	printf("\n个数:%d\n",list->data); 
	insert_element(list, 5,13);
	printf("\n");
	foreach_link(list);
	printf("\n个数:%d\n",list->data); 
	delete_element(list,5);
	printf("\n个数:%d\n",list->data); 
	foreach_link(list); 
	delete_element(list,0);
	printf("\n个数:%d\n",list->data);
	foreach_link(list);
	return 0;
}
//建立链表 
bool create_link(link * head, int times)
{
	/*if(!head){
		printf("head has point\n");
		return false;
	}*/
	head->lastnode = NULL;
	head->nextnode = NULL;
	link * last = head;
	int temp_num;
	for(int i=0;i<times;i++){
		scanf("%d",&temp_num);
		link * temp = (link *) malloc(sizeof(link));
		temp->lastnode = last;
		temp->nextnode = NULL; 
		if(i == 0){
			head->nextnode = temp;
			temp->data = temp_num;
		}
		else{
			last->nextnode = temp;
			temp->data = temp_num;
		}
		last = temp;
	}
	head->data = times;
	return true;
}
//遍历链表
void foreach_link(link * head)
{
	link * node = head->nextnode;
	while(node)
	{
		printf("%d ",node->data);
		node = node->nextnode;
	}
}
//插入元素(之后) 下标为准 
bool insert_element(link * head, int n, int num)
{
	link * temp = (link *)malloc(sizeof(link));
	link * last = head; 
	temp->data = num;
	for(int i = 0;i < n; i++){
		last = last->nextnode;
	}
	if(n == head->data){
		last->nextnode=temp;
		temp->lastnode=last;
		head->data++;
		printf("seccess %d insert %d",n,num);
		return true;
	}
	else{
		last->nextnode->lastnode = temp;
		temp->nextnode = last->nextnode;
		temp->lastnode = last;
		last->nextnode =  temp;
		head->data++;
		printf("seccess %d insert %d",n,num);
		return true;
	}
	return false;
} 
//删除元素(之后) 下表为准 
bool delete_element(link * head, int n)
{
	link * last = head;
	link * del;
	for(int i = 0; i<n; i++){
		last = last->nextnode;
	}
	if(n == (head->data-1)){
		//free(last->nextnode);
		last->nextnode = NULL;
		head->data--;
		printf("seccess %d delete",n);
		return true;
	}
	else{
		del = last->nextnode;
		last->nextnode = del->nextnode;
		del->nextnode->lastnode = last;
		//free(del);
		head->data--; 
		printf("seccess %d delete",n);
		return true; 
	}
	return false;
}