阅读553 返回首页    go 阿里云 go 技术社区[云栖]


C双向链表

写了一个很简单的双向链表


#include <stdio.h>
#include <STDLIB.H>
#include <MALLOC.H>

//一个简单链表,只有一条链

typedef struct FUCK{
	int data;
	struct FUCK * pre;
	struct FUCK * next;
}Node;

Node *head=NULL;

void initList()
{
	head=(Node*)malloc(sizeof(Node));
	head->next=NULL;
	head->pre=NULL;
}


Node* find(int a)
{
	//找到插入点,在插入点的后面插入a元素
	Node *point=NULL;
	point=head->next;
	while(1)
	{
		if (a<=point->data)
		{
			return point->pre;
		}

		if (point->next==NULL) break;
		
		point=point->next;
	}
	return point;
}


void insertE(int a)
{
	Node *p=NULL;
	p=(Node *)malloc(sizeof(Node));

	//写入新节点内容
	p->data=a;
	p->next=NULL;
	p->pre=NULL;

	if(head->next==NULL)
	{
		//证明链表现在是空的
		head->next=p;
		p->pre=head;
	}

	else
	{
		//链表不空,找到插入点
		Node* insPoint=find(a);
		Node* insPNext=insPoint->next;   //记录原插入点的后一个节点

		//处理前一个点
		insPoint->next=p;
		p->pre=insPoint;

		//处理后一个点,情况稍微复杂一点,要考虑null的情况
		if(insPNext!=NULL)
		{
			insPNext->pre=p;
			p->next=insPNext;
		}

		else
		{
			p->next=NULL;  //这句可以不写,因为前面有初始化,但是为了清楚还是写上
		}
		
	}
	//至此已成功插入
}


void traversal()
{
	Node *point;
	point=head->next;
	while(point!=NULL)
	{
		printf("%d ",point->data);
		point=point->next;
	}

	printf("\n");
}


int main()
{
	initList();

	insertE(1);
	insertE(2);
	insertE(15);
	insertE(9);

	//遍历链表
	traversal();
	
	return 0;
}


输出结果:1 2 9 15 



#include <stdio.h>
#include <STDLIB.H>
#include <MALLOC.H>

//一个简单链表,只有一条链

typedef struct FUCK{
	int data;
	struct FUCK * pre;
	struct FUCK * next;
}Node;

Node *head=NULL;

void initList()
{
	head=(Node*)malloc(sizeof(Node));
	head->next=NULL;
	head->pre=NULL;
}


Node* find(int a)
{
	//找到插入点,在插入点的后面插入a元素
	Node *point=NULL;
	point=head->next;
	while(1)
	{
		if (a<=point->data)
		{
			return point->pre;
		}
		
		if (point->next==NULL) break;
		
		point=point->next;
	}
	return point;
}


void insertE(int a)
{
	Node *p=NULL;
	p=(Node *)malloc(sizeof(Node));
	
	//写入新节点内容
	p->data=a;
	p->next=NULL;
	p->pre=NULL;
	
	if(head->next==NULL)
	{
		//证明链表现在是空的
		head->next=p;
		p->pre=head;
	}
	
	else
	{
		//链表不空,找到插入点
		Node* insPoint=find(a);
		Node* insPNext=insPoint->next;   //记录原插入点的后一个节点
		
		//处理前一个点
		insPoint->next=p;
		p->pre=insPoint;
		
		//处理后一个点,情况稍微复杂一点,要考虑null的情况
		if(insPNext!=NULL)
		{
			insPNext->pre=p;
			p->next=insPNext;
		}
		
		else
		{
			p->next=NULL;  //这句可以不写,因为前面有初始化,但是为了清楚还是写上
		}
		
	}
	//至此已成功插入
}


void traversal()
{
	Node *point;
	point=head->next;
	while(point!=NULL)
	{
		printf("%d ",point->data);
		point=point->next;
	}
	
	printf("\n");
}


int main()
{
	initList();
	
	int a;
	while(1)
	{
		printf("please enter an insert number:\n");

		scanf("%d",&a);
		insertE(a);

		printf("now the numbers in the list are:\n");
		//遍历链表
		traversal();

		getchar();
		getchar();
		system("CLS");
	}
	
	return 0;
}



界面变成了:



最后更新:2017-04-03 05:39:11

  上一篇:go Scala的foldLeft和foldRight
  下一篇:go UC高级编程--利用信号实现进程间通信