最近想系统的学习一下数据结构的算法,我的C语言一般,目前还在学习阶段,编写的代码不是很好,如有错误,也是正常,希望大家帮忙指正;
单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。(来自百度)
/*建立一个整数链表*/
/*
1.创建有头结点链表;
2.插入链表
3.删除链表
4.销毁链表
5.打印链表
*/
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef void ElemTypeVoid;
typedef struct linklist
{
ElemType value;
struct linklist *next;
} Link_List,*LinkList;
//创建链表
LinkList Create_List(ElemType n)
{
LinkList frist;//头结点指针
LinkList q, p;
ElemType x = 0, i = 0;
frist= (LinkList)malloc (sizeof (Link_List));//头结点分配内存
frist->next = NULL;//头结点指针域清空
q = frist;//将头结点首地址赋值给q
for(i = 1; i < n + 1; ++i)/*输入一个整型的数据*/
{
printf("请输入您的第 %d 数据:",i);
scanf("%d",&x);
p = (LinkList)malloc (sizeof (Link_List));
/*首先为要新创建的表元p开辟一个内存空间*/
if(p == NULL)
{
printf("\n\r Memory allocation failure.\n\r");
return 0;
}
p->value = x;
q->next = p;//将P指向的新结点加入到链表中
q = p;//起着指向下一个结点的作用
}
p->next = NULL;//最后一个结点的指针域清空
printf("\n\r Linked lists are successful!!!\n\r");
return frist;
}
//插入第N个数据
ElemTypeVoid Insert_List(LinkList head)
{
LinkList p, q;
ElemType m, n;
if(head == NULL)
{
printf(" 哪有链表,骗子\n\r");
return;
}
p = head;//将头结点首地址赋值给p
q = (LinkList)malloc(sizeof(Link_List));
if(q == NULL)
{
printf("memory allocated fail\n\r");
return;
}
printf("请输入你想添加的链表号:\n\r");
scanf("%d",&n);
printf("请输入你想添加的链表数据:\n\r");
scanf("%d",&m);
q->value = m;
for(m = 0; m < n - 1; ++m)
{
p = p->next;
}//找到添加的位置
q->next = p->next;//将p->next地址赋给q->next
p->next = q;//相当于p->next = p->next->next
}
//删除第N个数据
ElemTypeVoid Delete_List(LinkList head)
{
LinkList p, q;
ElemType m;
ElemType n;
if(head == NULL)
{
printf("您需要创建一个链表,您骗我乱删数据\n\r");
return;
}
p = head;
printf("请输入你想删除的链表号:\n\r");
scanf("%d",&n);
for(m = 1; m < n; ++m)
{
p = p->next;
}
q = p->next;//将p->next地址赋给q
p->next = q->next;//这块是将q覆盖掉(p->next =p->next->next)
q->next = NULL;//q就是被选定的删除结点
free(q);//删除链表节点第n个
}
//销毁链表
ElemTypeVoid Destroy_List(LinkList head)
{
LinkList p;
if(head == NULL)
{
printf("\n\r 您需要创建一个链表,我不能为你打死他(销毁)。\n\r");
return;
}
while(head)
{
p = head->next;
free(head);
head = p;
}//从头到脚一个一个销毁
printf("\n\r 小弟,已经帮您把链表销毁了。(链表已经不存在)\n\r");
}
//打印链表信息
ElemTypeVoid Print_List(LinkList head)
{
LinkList p;
ElemType n = 0;
if(head == NULL)
{
printf("\n\r 您需要创建一个链表,我不能为你打印。\n\r");
return;
}
p = head->next;
while(p!=NULL)
{
printf("%4d",p->value);
p = p->next;
n++;
if(n%5 == 0)
printf("\n\r");//只是为了看代码输出整洁
}
printf("\n\r链表总共%d个元素\n\r", n);
}
//菜单
ElemTypeVoid menu()
{
printf("\n\r/****************************/\n\r");
printf("\n\r 1. 创建链表Create_List() \n\r");
printf("\n\r 2. 链表插入Insert_List() \n\r");
printf("\n\r 3. 链表删除Delete_List() \n\r");
printf("\n\r 4. 链表销毁Destroy_List()\n\r");
printf("\n\r 5. 链表打印Print_List() \n\r");
printf("\n\r 0. 退出 \n\r");
printf("\n\r/****************************/\n\r");
}
//主函数
void main()
{
LinkList head;
ElemType i = 1, n = 0;
while ( 1 )
{
menu();
printf("输出你的选项:n =");
scanf("%d",&i);
switch( i )
{
case 1:
printf("请创建您的链表,您想创建多大的链表.\n");
printf("请输入您创建的个数 n = \n");
scanf("%d", &n);
head = Create_List(n);
break;
case 2:
Insert_List(head);
break;
case 3:
Delete_List(head);
break;
case 4:
Destroy_List(head);
break;
case 5:
Print_List(head);
break;
case 0:
return;
default:
printf("您在逗我吗?I am really silly.您再试试吧!\n\r");
break;
}
}
}