实现一个函数,求带头结点的单链表的表长
接口:
int Length ( LinkList L );
其中LinkList结构定义如下:
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
实现:
int Length ( LinkList L )
{
int n = 0;
LinkList cur = L;
while(cur->next)
{
cur = cur->next;
n++;
}
return n;
}
接口:
int Locate ( LinkList L, ElemType e);
L是带头结点的单链表的头指针,e是要查找的元素值。如果e在单链表中存在,函数Locate返回其序号(序号从1开始);否则,返回0。
int Locate ( LinkList L, ElemType e)
{
int n = 1;
LinkList cur = L->next;
while(cur)
{
if(cur->data == e)
return n;
n++;
cur = cur->next;
}
return 0;
}
本题要求实现一个函数,求单链表L
结点的阶乘和。这里默认所有结点的值非负,且题目保证结果在int
范围内。
接口:
int FactorialSum( List L );
其中单链表List
的定义如下:
typedef struct Node *PtrToNode;
struct Node {
int Data; /* 存储结点数据 */
PtrToNode Next; /* 指向下一个结点的指针 */
};
typedef PtrToNode List; /* 定义单链表类型 */
实现:
int factorial(int data)
{
if (data == 0)
return 1;
else
{
int ret = data;
while (--data)
{
ret *= data;
}
return ret;
}
}
int FactorialSum( List L )
{
if(L==NULL)
return 0;
int ret = 0;
List cur = L;
while(cur)
{
ret += factorial(cur->Data);
cur = cur->Next;
}
return ret;
}
实现一个函数,按输入数据的逆序建立一个链表。
接口:
struct ListNode *createlist();
函数createlist
利用scanf
从输入中获取一系列正整数,当读到−1时表示输入结束。按输入数据的逆序建立一个链表,并返回链表头指针。链表节点结构定义如下:
struct ListNode {
int data;
struct ListNode *next;
};
可以直接头插,这里为了多写一个反转链表,特意搞了尾插再反转
实现:
struct ListNode* reverseList(struct ListNode* head)
{
struct ListNode* newhead = NULL, * cur = head;
while (cur)
{
struct ListNode* next = cur->next;
cur->next = newhead;
newhead = cur;
cur = next;
}
return newhead;
}
struct ListNode* BuySLTNode(int x)
{
struct ListNode* newnode = (struct ListNode*)malloc(sizeof(struct ListNode));
if (newnode == NULL)
{
perror("malloc fail");
return;
}
newnode->data = x;
newnode->next = NULL;
return newnode;
}
void SLTPushBack(struct ListNode** pphead, int x)
{
struct ListNode* newnode = BuySLTNode(x);
if (*pphead == NULL)
{
*pphead = newnode;
}
else
{
struct ListNode* tail = *pphead;
while (tail->next != NULL)
{
tail = tail->next;
}
tail->next = newnode;
}
}
struct ListNode* createlist()
{
struct ListNode* head = NULL;
int n = 0;
while (1)
{
scanf("%d", &n);
if (n == -1)
break;
SLTPushBack(&head, n);
}
struct ListNode* ret = reverseList(head);
return ret;
}
#include
#include
typedef struct ListNode
{
int data;
struct ListNode* next;
}ListNode;
ListNode* BuySLTNode(int x)
{
ListNode* newnode = (ListNode*)malloc(sizeof(ListNode));
if (newnode == NULL)
{
perror("malloc fail");
return;
}
newnode->data = x;
newnode->next = NULL;
return newnode;
}
void SLTPushBack(ListNode** pphead, int x)
{
ListNode* newnode = BuySLTNode(x);
if (*pphead == NULL)
{
*pphead = newnode;
}
else
{
ListNode* tail = *pphead;
while (tail->next != NULL)
{
tail = tail->next;
}
tail->next = newnode;
}
}
int main()
{
int n = 0;
scanf("%d", &n);
if(n == 0)
return 0;
ListNode* head = NULL;
while (n--)
{
int c = 0;
scanf("%d", &c);
SLTPushBack(&head, c);
}
ListNode* cur = head;
printf("%d", cur->data);
cur = cur->next;
while (cur)
{
printf(" %d", cur->data);
cur = cur->next;
}
return 0;
}