数据结构——双链表实现

余生长醉 提交于 2020-02-02 05:43:29

试着自己实现了双向链表,因为之前学的不明白;
实现后对指针的使用有了较好的理解;
另外,指针的删除功能就没写了,因为大致思想都是一样的,
即修改指针指向;

遗留问题:什么是模板?
结构值传递;已解决; 结构只是一个类型,不是指针,如果使用结构指针,由于地址是相同的,达不到重复为不同节点赋值的效果,所以单纯不用指针直接传值,再具体修改值即可;
#include<stdio.h>
#include<stdlib.h> 
typedef struct info{
	int data;		//本来想把节点结构的data换这个类型的,但是其值传递还有问题,待修改;
}info;
typedef struct node{
	int data;
	struct node *prev, *next;
}linklist;
linklist *first_node, *last_node, *tmp_node;//首,尾,即时指针; 

linklist *list_Create(int n);
void display(linklist *plist);
//linklist *list_Del(linklist *
void *list_HeadInsert( linklist *head, int data);
void *list_TailInsert();
void *list_AtInsert(int data, linklist *first_node, int index);

int main(void)
{
	linklist *head;
	int data;
	info *pinfo;
	int n;
	printf("输入链表初始化节点数:\n");
	scanf("%d",&n);
	tmp_node = first_node = last_node 
	= head = list_Create(n);
	display(head);	//print list 
	printf("输入插头节点数据:\n");
	scanf("%d", &data); 
	list_HeadInsert(head, data);
	display(head);	//print list 
	
	list_TailInsert();
	display(head);	//print list 
	printf("输入插人链表的位置和数据:\n");
	scanf("%d %d", &n, &data);
	list_AtInsert(data, first_node, n);
	display(head);	//print list 
//	printf("输入删除的数据:\n");
//	scanf("%d",&n);
//	n = list_Del(n);
//	printf("delete %d data\n",n);
	return 0;
}
linklist *list_Create(int n)
{
	linklist* p,*p1;
	
	linklist *head = (linklist*)malloc(sizeof(linklist));
	if(head == NULL) printf("create failed\n");
	p = head;
	p->prev = NULL;
	int i=0, data;
	while(n--)
	{
		p1 = (linklist*)malloc(sizeof(linklist));
		printf("输入第%d个节点数据:", ++i);
		scanf("%d", &data);
		p1->data = data;
		p->next = p1;
		p1->prev = p;
		p = p1;
		 
	}
	last_node = p1;
	p1->next = NULL;
	return head;
}
void display(linklist *head)
{
	linklist *p = head->next;
	while(p->next)
	{
		printf("%d<->", p->data);
		p = p->next;
	}
	printf("%d\n", p->data);
	last_node = p;
}
//linklist *list_Del_index(linklist *plist, int index)//根据下标;
//{
//	
//}
//linklist *list_del_data(linklist *plist, info *pinfo)//根据data; 
//{
//		
//}

void *list_HeadInsert(linklist *head, int data)//也可以直接只用一个信息参数; 
{
	
	linklist *p = (linklist*)malloc(sizeof(linklist));
	if(p == NULL) printf("hmalloc failed\n");
	p->prev = NULL;
	p->data = data;			
	p->next = head->next;	
	p->prev = head;  		//头指针,头节点,首元指针; 
	if(p->next != NULL){
		p->next->prev = p; 
	} 
	head->next = p;
}
void *list_TailInsert()
{
	int data;
	printf("输入插尾节点数据:\n");
	scanf("%d", &data);
	linklist *p = (linklist*)malloc(sizeof(linklist));
	if(p == NULL) printf("tinsert failed\n");
	p->data = data;

	p->prev = last_node;
	last_node->next = p;
	p->next = NULL;
	last_node = p;
	
}
void *list_AtInsert(int data, linklist *head, int index)
{
	linklist *p = head,*node = (linklist*)malloc(sizeof(linklist));
	
	if(p == NULL) printf("Atinsert failed\n");
	node->data = data;
	int cnt = 1;//计数当前节点下标; 
	p = p->next;//跳过头节点--空节点; 
	while(p && cnt != index)
	{
		p = p->next;
		cnt ++;
	}
	p->prev->next = node;
	node->prev = p->prev;
	p->prev = node;
	node->next = p;
}
 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!