閱讀553 返回首頁    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高級編程--利用信號實現進程間通信