单链表
#include <stdio.h>
#include <stdlib.h>
//#define NUM 8
//定义单链表结点类型
typedef struct node
{
int data;
struct node* next;
}linklist;
//创建单链表
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;
scanf("%d",&(p->data));
p->next = NULL;
while (p->data != -1)
{
q->next = p;
q = p;
p= (linklist*)malloc(sizeof(struct node));
scanf("%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;
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;
}
//显示单链表
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");
}
}
//主菜单
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(" 0. 退出\n");
printf("\n***********************************\n");
}
void menu_bye()
{
printf("\n***********************************\n");
printf("\n 欢迎再次使用\n");
printf("\n");
printf("\n 再见!\n");
printf("\n***********************************\n");
}
linklist* h;
//主函数
int main()
{
menu(); //程序首先执行菜单
int n;
//linklist* h;
//h = creat();
while (1)
{
printf("请输入(1-7):");
scanf("%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输入要插入结点的值和位置:\n");
scanf("%d%d", &number, &pos);
insertlinklist(h, number, pos);
Print(h);
break;
case 3:
int num;
printf("\n输入要删除的结点序号:\n");
scanf("%d", &num);
deletelinklist(h, num);
Print(h);
break;
case 4:
int data, position;
scanf("%d", &data);
position = locatelinklist(h, data);
printf("位置是:%d", position);
break;
case 5:
int x, cnt;
printf("请输入要查找的值:");
scanf("%d", &x);
cnt = count(h, x);
printf("成绩为%d的学生人数是:%d", x, cnt);
break;
case 6:
linklist * head;
printf("排序结果如下:\n");
head = bubblesort(h);
Print(head);
break;
case 7:
printf("删除重复结点,输入y或Y执行删除\n");
int j;
getchar();
j = getchar();
if (j == 'y' || j == 'Y')
{
purgelist(h);
Print(h);
}
else
printf("没有重复结点!\n");
break;
default:
break;
}
}
system("pause");
return 1;
}

浙公网安备 33010602011771号