单链表的c语言实现-8个功能(VS2019运行成功)

menu.h

#pragma once
#include <stdio.h>
#include <stdlib.h>
#if!defined(menu_H)
#define menu_h

//定义单链表结点类型
typedef struct node
{
int data;
struct node* next;
}linklist;

//主菜单
void menu()
{
printf("\n****************************************\n");
printf(" 1. 创建单链表(首选执行该项)\n");
printf(" 2. 单链表中插入一个结点\n");
printf(" 3. 单链表中删除指定位置上结点\n");
printf(" 4. 单链表中定位某个结点位置\n");
printf(" 5. 单链表中查找重复值\n");
printf(" 6. 单链表结点排序\n");
printf(" 7. 单链表删除重复值结点\n");
printf(" 8. 单链表的长度\n");
printf(" 0. 退出\n");
printf("\n****************************************\n");
}

void menu_bye()
{
printf("\n****************************************\n");
printf("\n 欢迎再次使用\n");
printf("\n");
printf("\n 再见!\n");
printf("\n****************************************\n");
}

#endif

 

danlinklist.cpp

#include "menu.h"

//创建单链表
linklist* creat()
{
linklist* head, * p, * q;
head = (linklist *)malloc(sizeof(struct node));
head->next=NULL;
p = q = (linklist*)malloc(sizeof(struct node));
head->next = p; //连接头结点和首结点
p->next = NULL;
scanf_s("%d", &(p->data));
while (p->data != -1)
{
q->next = p;
q = p;
p= (linklist*)malloc(sizeof(struct node));
scanf_s("%d", &(p->data));
}
q->next = NULL;
return head;
}

//统计单链表中某个值的个数
int count(linklist* head, int num)
{
linklist* p;
int n = 0;
p = head;
while (p != NULL)
{
if (p->data == num)
n++;
p = p->next;
}
return n;
}

//定位单链表中某个值的位置
int locatelinklist(linklist* head, int x)
{
linklist* p = head;
int i = 0;
while (p != NULL && p->data != x)
{
i++;
p = p->next;
}
if (p != NULL)
return i;
else
return 0;
}

//向单链表中第i个位置插入一个结点
void insertlinklist(linklist* head, int x, int i)
{
linklist* p, * q = head;
if (i == 1)
q = head;
else
{
q = q->next;
int c = 1;
while (c < i - 1 && q != NULL)
{
q = q->next;
c++;
}
}
if (q != NULL && q->next != NULL)
{
p = (linklist *)malloc(sizeof(struct node));
p->data = x;
p->next = q->next;
q->next = p;
}
else
{
printf("找不到插入位置!");
}
}

//删除单链表中的一个结点
void deletelinklist(linklist* head, int i)
{
linklist* p, * q = head;
if (i == 1)
q = head;
else
{
q = q->next;
int c = 1;
while (c < i - 1 && q != NULL)
{
q = q->next;
c++;
}
}
if (q != NULL && q->next != NULL)
{
p = q->next;
q->next = p->next;
free(p);
}
else
{
printf("没有找到要删除的结点!");
}
}

//删除重复的结点
void purgelist(linklist* head)
{
linklist* p, * q, * r;
q = head->next;
while (q != NULL)
{
p = q;
while (p->next != NULL)
{
if (p->next->data == q->data)
{
r = p->next; //r指向的即是被删除的重复结点
p->next = r->next;
free(r);
}
else
p = p->next;
}
q = q->next;
}
}

//单链表的排序
linklist* bubblesort(linklist* head)
{
linklist* p, * tail, * ne;
int temp;
if (head->next == NULL)
return head;
for (p = head->next; p->next!= NULL; p = p->next)
;
tail = p->next; //确定尾结点的位置
while (tail != head->next->next)
{
for (p = head->next; p->next != tail; p = p->next)
{
ne = p->next;
if (p->data > ne->data)
{
temp = p->data;
p->data = ne->data;
ne->data = temp;
}
}
tail = p;
}
return head;
}

//单链表的长度
int lengthlinklist(linklist* head)
{
linklist* p = head;
int cnt = 0;
while (p->next != NULL)
{
p = p->next;
cnt++;
}
return cnt;
}

//输出单链表
void Print(linklist* head)
{
linklist* p;
p = head->next;
if (p == NULL)
{
printf("空链表!");
}
else
{
do
{
printf("%4d",p->data);
p = p->next;
} while (p != NULL);
}
printf("\n");
}

 

linklist* h;

//主函数
int main()
{
menu();
int n;
while (1)
{
printf("请输入(1 - 7):");
scanf_s("%d", &n);
if (n < 0 || n>7)
printf("没有此值,请重输入!\n");

switch (n)
{
case 0:
system("cls");
menu_bye();
exit(0);
case 1:
printf("请输入一串整数,以空格分隔,以“-1”结束\n");
h = creat();
Print(h);
break;
case 2:
int number, pos;
printf("\n输入要插入结点的值和位置:");
scanf_s("%d%d", &number, &pos);
insertlinklist(h, number, pos);
Print(h);
break;
case 3:
int num;
printf("\n输入要删除的结点序号:");
scanf_s("%d", &num);
deletelinklist(h, num);
Print(h);
break;
case 4:
int data, position;
printf("\n单链表中定位某个结点位置:");
scanf_s("%d", &data);
position = locatelinklist(h, data);
printf("位置是:%d\n", position);
break;
case 5:
int x, cnt;
printf("\n输入要查找的值:");
scanf_s("%d", &x);
cnt = count(h, x);
printf("值为%d的个数是:%d\n", x, cnt);
break;
case 6:
linklist * head;
printf("排序结果如下:\n");
head = bubblesort(h);
Print(h);
case 7:
printf("删除重复结点,输入y或Y执行删除:");
char j;
getchar();
j = getchar();
if (j == 'y' || j == 'Y')
{
purgelist(h);
Print(h);
}
else
printf("没有重复结点!\n");
break;
case 8:
int count;
count = lengthlinklist(h);
printf("\n链表长度为:%d", count);
default:
break;
}
}
system("pause");
return 1;
}

运行结果:

posted @ 2020-06-13 12:35  bobo哥  阅读(76)  评论(0)    收藏  举报