c语言自实现带头结点的链表

// MyList.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
typedef struct node
{
int _data;
struct node * _per;
struct node * _next;
}Node;

//初始化头节点数据 尾插法
Node * createListHeadTail()
{
Node * head = (Node*)malloc(sizeof(Node));
head->_next = head;
head->_per = head;
Node * tail = head;
Node * current=NULL;
int data = 0;
scanf("%d", &data);
while (data)
{
current= (Node*)malloc(sizeof(Node));
current->_data = data;
tail->_next = current;
current->_per = tail;
tail = current;
scanf("%d", &data);
}
current->_next = head;
head->_per = current;
return head;
}

//初始化头节点数据 头插法
Node * createListHead()
{
Node * head = (Node*)malloc(sizeof(Node));
head->_next = head;
head->_per = head;
int data = 0;
scanf("%d",&data);
while (data)
{
Node * current = (Node*)malloc(sizeof(Node));
current->_data = data;
current->_next = head->_next;
current->_per = head;
head->_next = current;
current->_next->_per = current;
scanf("%d",&data);
}
return head;
}

//遍历打印数据
void printList(Node * head)
{
Node * tHead = head;
head = head->_next;
while (head!= tHead)
{
printf("%d\n", head->_data);
head = head->_next;
}
}

//释放链表数据
void freeList(Node * head)
{
Node * tHead = head;
Node * tNode = NULL;
head = head->_next;
while (head != tHead)
{
tNode = head->_next;
delete head;
head = tNode;
}
delete head;
}

//获取链表节点数据
int getCount(Node * head)
{
int count = 0;
Node * tHead = head;
head = head->_next;
while (head != tHead)
{
count++;
head = head->_next;
}
return count;
}

//查询链接数据节点
Node * selListNode(Node * head,int number)
{
Node * tHead = head;
head = head->_next;
while (head != tHead)
{
if (head->_data == number) break;
head = head->_next;
}
return head;
}

//删除链表指定节点
void delListNode(Node * head, Node * delNode)
{
Node * tHead = head;
head = head->_next;
while (head != tHead)
{
if (head == delNode)
{
delNode->_per->_next = delNode->_next;
delNode->_next->_per = delNode->_per;
free(delNode);
break;
}
head = head->_next;
}
}

//对链表进行排序
void sortList(Node * head)
{
int size = getCount(head);
Node * tNode = NULL;
for (int i = 0; i < size-1;i++)
{
Node * sh = head;
Node * p = sh->_next;
Node * q = p->_next;
for (int j = 0; j < size - i - 1;j++)
{
if (p->_data>q->_data)
{
sh->_next = q;
q->_per = p;
p->_next = q->_next;
q->_next = p;
p->_per = q;
q->_next->_per = p;

tNode = q;
q = p;
p = tNode;
}
sh = sh->_next;
p = p->_next;
q = q->_next;
}
}
}

int _tmain(int argc, _TCHAR* argv[])
{
//1:初始化链表节点数据
Node * head = createListHeadTail();//尾插法创建
//Node * head = createListHead();//头插法创建
//2:对链表数据进行排序
sortList(head);//排序
//3:打印
printList(head);//打印
//4:获取链表节点数
int count = getCount(head);//数量
//5:根据数据查找链表节点
Node * selNode = selListNode(head, 99);//查询
//6:删除节点
delListNode(head, selNode);//删除
//7:释放内存
freeList(head);//释放
system("pause");
return 0;
}

 

posted on 2017-07-24 09:17  阿兴的平凡世界  阅读(126)  评论(0)    收藏  举报

导航