#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Node
{
int id;
struct Node* next;
}Node;
Node* SListCreate()
{
Node* head = NULL;
//头节点作为有效标志,不存储有效数据
head = (Node*)malloc(sizeof(Node));
if (head == NULL)
{
return NULL;
}
//给head的成员变量赋值
head->id = 1;
head->next = NULL;
Node* pCur = head;
Node* pNew = NULL;
int data;
while (1)
{
printf("请输入数据:");
scanf("%d", &data);
if (data == -1) //输入-1,退出
{
break;
}
//新节点动态分配空间
pNew = (Node*)malloc(sizeof(Node));
if (pNew == NULL)
{
continue;
}
//给pNew成员变量赋值
pNew->id = data;
pNew->next = NULL;
//链表建立关系
//当前节点的next指向pNew
pCur->next = pNew;
//pNew下一个节点指向NULL;
pNew->next = NULL;
//把pCur移动到pNew,pCur指向pNew
pCur = pNew;
}
return head;
}
int SListPrint(Node* head)
{
if (head == NULL)
{
return -1;
}
//取出第一个有效节点(头节点的next)
Node* pCur = head->next;
printf("head-> ");
while (pCur != NULL)
{
printf("%d -> ", pCur->id);
pCur = pCur->next;
}
printf("NULL\n");
return 0;
}
int SListNodeInsert(Node* head, int x, int y)
{
if (head == NULL)
{
return -1;
}
Node* pCur = head;
Node* pInsert = (Node*)malloc(sizeof(Node));
while (pCur->next != NULL)
{
if (pCur->next->id == x)
{
pInsert->next = pCur->next;
pInsert->id = y;
pCur->next = pInsert;
return 0;
}
pCur = pCur->next;
}
return 0;
}
int SListNodeDel(Node* head, int x)
{
if (head == NULL)
{
return -1;
}
Node* pCur = head;
Node* tmp = NULL;
while (pCur->next != NULL)
{
if (pCur->next->id == x)
{
tmp = pCur->next->next;
free(pCur->next);
pCur->next = NULL;
pCur->next = tmp;
return 0;
}
pCur = pCur->next;
}
return 0;
}
int SListNodeDestory(Node* head)
{
if (head == NULL)
{
return -1;
}
Node* tmp = NULL;
int i = 0;
while (head != NULL)
{
tmp = head->next;
free(head);
head = NULL;
head = tmp;
i++;
}
printf("%d", i);
return 0;
}
int SListNodeSort(Node* head)
{
if (head == NULL || head->next == NULL)
{
return -1;
}
Node* pPre = NULL;
Node* pCur = NULL;
Node tmp;
for (pPre = head->next; pPre->next != NULL; pPre = pPre->next)
{
for (pCur = pPre->next; pCur != NULL; pCur = pCur->next)
{
if (pPre->id > pCur->id)
{
tmp.id = pCur->id;
pCur->id = pPre->id;
pPre->id = tmp.id;
/*tmp = *pCur;
*pCur = *pPre;
*pPre = tmp;
tmp.next = pCur->next;
pCur->next = pPre->next;
pPre->next = tmp.next;*/
}
}
}
return 0;
}
//翻转链表的节点(不是排序,是翻转)
int SlistNodeReverse(Node* head)
{
if (head == NULL || head->next == NULL || head->next->next == NULL)
{
return -1;
}
Node* pPre = head->next;
Node* pCur = head->next->next;
Node* tmp;
pPre->next = NULL;
while (pCur != NULL)
{
if (pCur->next == NULL)
{
head->next = pCur;
}
tmp = pCur->next;
pCur->next = pPre;
pPre = pCur;
pCur = tmp;
}
return 0;
}
int main(void)
{
Node* head = NULL;
head = SListCreate();
SListPrint(head);
SListNodeInsert(head, 5, 4);
printf("在5的前面插入4后\n");
SListPrint(head);
SListNodeDel(head, 5);
printf("5删除后\n");
SListPrint(head);
SlistNodeReverse(head);
printf("翻转后\n");
SListPrint(head);
SListNodeSort(head);
printf("排序后\n");
SListPrint(head);
printf("清除了");
SListNodeDestory(head);
printf("次\n");
printf("\n");
return 0;
}
C语言单向链表操作
最新推荐文章于 2022-09-12 16:29:18 发布