带头结点的链表的基本运算

复制代码
#include <stdio.h>
#include <stdlib.h> 
#include <stdbool.h>

// 带头结点的链式存储


typedef int ElemType;


typedef struct LNode
{
	ElemType data;
	struct LNode* next;
}LNode, *LinkList;  // LNode 表示这个是一个结点, LinkList 表示这个是一个链表


void InitList(LinkList &L) 
{
	L = (LNode*)malloc(sizeof(LNode));
	L->next = NULL;
}

bool HeadInsertNode(LinkList &L)
{
	LNode *p;
	int key = 0;
	printf("请输入数据元素(999停止输入):"); 
	scanf("%d", &key);
	while(key != 999)
	{
		p = (LNode*)malloc(sizeof(LNode));  // 头插法相当于逆序 
		if(p == NULL) return false;
		p->data = key;
		p->next = L->next;
		L->next = p;
		scanf("%d", &key);
	}
	return true;
}

bool TailInsertNode(LinkList &L)
{
	LNode *r, *p;
	r = L;  // 在头结点尾部插入 
	while(r -> next != NULL)
	{
		r = r->next; 
	}
	int key = 0;
	printf("请输入数据元素(999停止输入):"); 
	scanf("%d", &key);
	while(key != 999)
	{
		p = (LNode*)malloc(sizeof(LNode));
		if(p == NULL) return false;
		p->data = key;
		r->next = p;
		r = p;
		scanf("%d", &key);
	}
	r->next = NULL;
	return true;
 } 
 
bool LinkListInsert(LinkList& L, int i, ElemType e)
{
	LNode *p;
	int j = 0;
	p = L;
	if (i < 1)
	{
		return false;
	}
	while(p != NULL && j < i-1)
	{
		p = p->next;
		j++;
	}
	if(p == NULL)
	{
		return false;
	}
	LNode *q = (LNode*)malloc(sizeof(LNode));
	if(q == NULL) return false;
	q->data = e;
	q->next = p->next;
	p->next = q;
	return true;
}
 
bool LinkListDelete(LinkList& L, int i, ElemType& e)
{
	LNode* p;
	int j = 0;
	p = L->next;
	if(i < 1)
	{
		return false;
	}
	while(p != NULL && j < i - 1)
	{
		p = p->next;
		j++;
	}
	if(p == NULL)
	{
		return false;
	}
	LNode* q;
	q  = p->next;
	e = q->data;
	p->next = q ->next;
	free(q);
	return true;
	
}

int LinkListLength(LinkList L)
{
	int len = 0;
	LNode *p = L->next;
	while(p != NULL)
	{
		p = p -> next;
		len++;
	}
	return len;
}


LNode* LocateNode(LinkList L, int i)
{
	if (i < 1)
	{
		return false;
	}
	LNode *p = L->next;
	int j = 0;
	while(p != NULL && j < i)
	{
		p = p->next;
		j++;
	} 
	return p;
}

LNode* ValueNode(LinkList L, ElemType e, int& i)
{
	LNode* p = L->next;
    int j = 0;
	while(p != NULL && p->data != e)
	{
		p = p->next;
		j++; 
	}
	i = j + 1; 
	return p;
}

bool DestoryLinkList(LinkList L)
{
	if(L == NULL)
	{
		return true;
	}
	LNode* p, *q;
	p = L;
	while(p != NULL)
	{
		q = p->next;
		free(p);
		p = q;
		
	}
	return true;	
}

void PrintLinkList(LinkList &L)
{
	LNode* p = L->next;
	while(p != NULL)
	{
		printf("%d ",p->data);
		p = p -> next;
	}
	printf("打印完成");
}
int main()
{
	LinkList L;
	InitList(L); 
	HeadInsertNode(L);
	LinkListLength(L);
	PrintLinkList(L);
	TailInsertNode(L);
	PrintLinkList(L);
	LinkListInsert(L, 3, 999);
	PrintLinkList(L);
	ElemType e = 0;
	LinkListDelete(L, 5, e);
	printf("删除的值%d\n",e);
	PrintLinkList(L);
	int len = LinkListLength(L);
	printf("%d\n", len);
	LNode *p = LocateNode(L, 3);
	printf("%d", p->data);
	int i = 0;
	ValueNode(L, 999, i);
    printf("下标为%d",i); 
	PrintLinkList(L);
	DestoryLinkList(L);
	return 0;
}