考研数据结构与算法(4)----有头节点和尾节点的链表

本文介绍了链表的基本操作,包括初始化、插入、显示等,并通过具体代码实现了这些功能。此外,还讨论了代码实践的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    今天继续昨天的内容实现了一些数据的插入操作,然后修复了新建链表时的一个bug。然后其实这个链表在设计上是有一点问题的,仔细读代码的话应该不难发现,不过好在本例的目的只是学习所以没有什么影响。明天明天我需要考虑一下接下来继续完成链表的操作还是直接实现书上多项式计算的例子。

    最后一个感触就是代码这东西,不经常敲真的是手生啊。

#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int ElemType;
typedef int Status;
typedef struct LNode
{
	ElemType data;
	struct LNode *next;
}*Link, Position;
typedef struct
{
	Link head,tail;
	int length;
}LinkList;
Status InitList(LinkList *L, int n);
Status ShowList(LinkList L);
Status InsNodeFirst(LinkList *L, ElemType e);
Status InsNodeLast(LinkList *L, ElemType e);
Status Append(LinkList *L, Link s);
int ListLength(LinkList L);
Link ListHead(LinkList L);
Link ListTail(LinkList L);
Status InsertList(LinkList *L, int n, ElemType e);
Status GetElem(LinkList L, int n, ElemType *e);
int GetElemPos(LinkList L, ElemType e);
int main(void)
{
	printf("带有头节点和尾节点的链表\n");
	LinkList myLinkList;
	InitList(&myLinkList, 8);
	InsNodeFirst(&myLinkList, 9);
	InsNodeLast(&myLinkList, 100);
	ShowList(myLinkList);
	LinkList yourLinkList;
	InitList(&yourLinkList, 4);
	ShowList(yourLinkList);
	Append(&myLinkList, yourLinkList.head->next);
	ShowList(myLinkList);
	InsertList(&yourLinkList, 2, 300);
	ShowList(yourLinkList);
	ElemType e;
	GetElem(yourLinkList, 2, &e);
	printf("第2个元素是%d\n",e);
	printf("%d",GetElemPos(yourLinkList, 4));
	system("pause");
}
Status InitList(LinkList *L, int n)
{
	Link p,s;
	L->head = (Link)malloc(sizeof(Link));
	L->length = 0;
	s = L->head;
	int i = 0;
	while(i<n)
	{
		p = (Link)malloc(sizeof(Link));
		p->data = i+1;
		s->next = p;
		s = p;
		i++;
		L->length++;
	}
	s->next = NULL;
	L->tail = s;
	return OK;
}
Status ShowList(LinkList L)
{
	Link p = L.head;
	printf("链表的长度是%d\n", L.length);
	if(!p->next)
		return ERROR;
	do
	{
		p = p->next;
		printf("%d\t",p->data);
	}while(p->next);
	printf("\n");
	return OK;
}
Status InsNodeFirst(LinkList *L, ElemType e)
{
	Link p;
	p = (Link)malloc(sizeof(Link));
	p->data = e;
	p->next = L->head->next;
	L->head->next = p;
	L->length ++;
	return OK;
}
Status InsNodeLast(LinkList *L, ElemType e)
{
	Link p;
	p = L->head;
	while(p->next)
	{
		p = p->next;
	}
	p->next = (Link)malloc(sizeof(Link));
	p = p->next;
	p->data = e;
	p->next =NULL;
	L->length ++;
	L->tail = p;
	return OK;
}
Status Append(LinkList *L, Link s)
{
	Link p;
	p = L->tail;
	p->next = s;
	while(p->next)
	{
		p = p->next;
		L->length++;
	}
	L->tail = p;
	return OK;
}
int ListLength(LinkList L)
{
	return L.length;
}
Link ListHead(LinkList L)
{
	return L.head;
}
Link ListTail(LinkList L)
{
	return L.tail;
}
Status InsertList(LinkList *L, int n, ElemType e)
{
	if(n>L->length+1)
		return ERROR;
	if(n == L->length)
	{
		InsNodeLast(L, e);
		return OK;
	}
	int i = 1;
	Link p,s;
	p = L->head;
	while( p->next && i<n )
	{
		p = p->next;
		i++;
	}
	s = (Link)malloc(sizeof(Link));
	s->next = p->next;
	s->data = e;
	p->next = s;
	L->length++;
	return OK;
}
Status GetElem(LinkList L, int n, ElemType *e)
{
	if(n>L.length || n<1)
		return ERROR;
	Link p;
	p = L.head->next;
	int i = 1;
	while(i<n)
	{
		p = p->next;
		i++;
	}
	*e = p->data;
	return OK;
}
int GetElemPos(LinkList L, ElemType e)
{
	Link p = L.head;
	int i = 0;
	do
	{
		if(p->data==e)
			return i;
		i++;
		p = p->next;
	}while(p);
	return -99;
}

此外,我也希望桐桐能够看到,其实我也还没有真正想好将来要不要和你在一起,虽然你也不愿意要我。然后希望有一天你能够看到,而且那时我还坚持着这个博客,能够让你看到我还是能够为你坚持做一件事情的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值