6-7 求单链表的表长 (11分)

 

本题要求实现一个函数,求带头结点的单链表的表长。

函数接口定义:

int Length ( LinkList L );

其中LinkList结构定义如下:

typedef struct LNode
{
    ElemType data;
    struct LNode *next;
}LNode,*LinkList;

L是带头结点的单链表的头指针,函数Length返回单链表的长度。

裁判测试程序样例:


#include <stdio.h>
#include <stdlib.h>

typedef int ElemType;
typedef struct LNode
{
    ElemType data;
    struct LNode *next;
}LNode,*LinkList;

LinkList Create();/* 细节在此不表 */

int Length ( LinkList L );

int main()
{
    LinkList L = Create();
    printf("%d\n", Length(L));
    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

2 1 4 5 3 -1

输出样例:

5

代码: 

int Length ( LinkList L )
{
	int l = 0;
	if(L==NULL)//空链表返回0
		return 0;
		
	while(L->next!=NULL&&L->data!=-1)//一直读到-1为止
	{
		l++;
		L=L->next;
		
	}
	return l;
	

}

建立链表代码:

LinkList Create()
{
	LinkList L, p, s;
	int e;
	L = (LinkList)malloc(sizeof(LNode));
	L->next = NULL;
	p = L;
	scanf("%d", &e);
	while (e != -1)
	{
		s = (LinkList)malloc(sizeof(LNode));
		s->data = e;
		p->next=s;
		p = s;
		scanf("%d", &e);
	}
	p->next = NULL;
	return L;
}

 

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我已经理解了你的要。以下是单链表的实现代码,你可以根据需要进行修改: ```c++ #include <iostream> using namespace std; // 定义单链表节点结构体 struct ListNode { int val; ListNode* next; ListNode(int x) : val(x), next(NULL) {} }; // 初始化单链表 ListNode* initList(int n, int* arr) { ListNode* head = new ListNode(-1); ListNode* tail = head; for (int i = 0; i < n; i++) { ListNode* node = new ListNode(arr[i]); tail->next = node; tail = node; } return head->next; } // 在单链表第 i 个数后面插入一个数 x ListNode* insert(ListNode* head, int i, int x) { ListNode* p = head; while (i > 1 && p != NULL) { p = p->next; i--; } if (p != NULL) { ListNode* node = new ListNode(x); node->next = p->next; p->next = node; } return head; } // 删除单链表第 i 个数 ListNode* remove(ListNode* head, int i) { ListNode* p = head; while (i > 1 && p != NULL) { p = p->next; i--; } if (p != NULL && p->next != NULL) { ListNode* q = p->next; p->next = q->next; delete q; } return head; } // 将单链表的奇偶位相互交换 ListNode* swap(ListNode* head) { ListNode* odd = head; ListNode* even = head->next; ListNode* evenHead = even; while (even != NULL && even->next != NULL) { odd->next = even->next; odd = odd->next; even->next = odd->next; even = even->next; } odd->next = evenHead; return head; } // 将单链表前 i 个数整体往后移动 x 位 ListNode* move(ListNode* head, int i, int x) { ListNode* p = head; while (i > 1 && p != NULL) { p = p->next; i--; } if (p != NULL) { ListNode* tail = p; while (x > 0 && tail->next != NULL) { tail = tail->next; x--; } if (tail != p) { ListNode* q = p->next; p->next = tail->next; tail->next = NULL; tail = q; while (tail != NULL && tail->next != NULL) { tail = tail->next; } tail->next = q; } } return head; } // 输出单链表第 i 个数 int get(ListNode* head, int i) { ListNode* p = head; while (i > 0 && p != NULL) { p = p->next; i--; } if (p != NULL) { return p->val; } else { return -1; } } // 输出整个单链表,使用空格隔开 void printList(ListNode* head) { ListNode* p = head; while (p != NULL) { cout << p->val << " "; p = p->next; } cout << endl; } // 释放单链表内存 void freeList(ListNode* head) { ListNode* p = head; while (p != NULL) { ListNode* q = p->next; delete p; p = q; } } int main() { int n, m; cin >> n; int* arr = new int[n]; for (int i = 0; i < n; i++) { cin >> arr[i]; } ListNode* head = initList(n, arr); cin >> m; for (int i = 0; i < m; i++) { int op; cin >> op; switch (op) { case 1: { // 在单链表第 i 个数后面插入一个数 x int i, x; cin >> i >> x; head = insert(head, i, x); break; } case 2: { // 删除单链表第 i 个数 int i; cin >> i; head = remove(head, i); break; } case 3: { // 将单链表的奇偶位相互交换 head = swap(head); break; } case 4: { // 将单链表前 i 个数整体往后移动 x 位 int i, x; cin >> i >> x; head = move(head, i, x); break; } case 5: { // 输出单链表第 i 个数 int i; cin >> i; cout << get(head, i) << endl; break; } case 6: { // 输出整个单链表,使用空格隔开 printList(head); break; } } } freeList(head); delete[] arr; return 0; } ``` 注意,在使用完单链表后,需要调用 `freeList` 函数释放单链表的内存。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值