Fork me on GitHub

单链表的基本操作(查找,插入,删除)

这周老师给的作业跟上周貌似差不多。只是用了单链表。

完成单链表的基本操作函数。
1)      初始化单链表
2)      给定的数据元素存放在一维数组中,分别完成头插法和尾插法建立单链表
3)      将数据元素从键盘依次输入,分别完成头插法和尾插法建立单链表
4)      输出单链表的长度
5)      实现按位查找和按值查找
6)      实现插入和删除操作
7)      实现遍历单链表操作
#include <cstdio>
#include <cstring>
#include <cstdlib>
//查找1.内容2.序号
//插入
//删除
typedef struct student
{
 int num;
 char name[10];
}STU;
typedef struct Node
{
 STU data;
 struct Node * next;
}Node;

void denglu(Node *L);//登录函数
void chazhao(Node *L);//查找函数
void Printf(Node *L);//输出函数
void CreateFromHead(Node *L);//头插法
void CreateFormTail(Node *L);//尾插法
void panduan(Node *L);//判断头插还是尾插
void Get(Node *L);//按序号结点查找
void Locate(Node *L);//按内容查找(值)
void Inslist(Node *L);//插入
void Dellist(Node *L);//删除

void Dellist(Node *L)//删除
{
 system("CLS");
 int n;
 printf("请输入要删除的结点\n");
 scanf("%d",&n);
 if(n<=0){
  printf("输入的数据不合法,请重新输入\n");
  Dellist(L);
 }
 Node *pre,*r;
 int k=0;
 pre=L;
 while(pre->next !=NULL&&k<n-1){
  pre=pre->next;
  k=k+1;
 }
 if(pre->next==NULL){
  printf("没有找到该结点,请重新输入\n");
  Dellist(L);
 }
 r=pre->next;
 pre->next=r->next;
 free(r);
 printf("删除成功!\n");
 denglu(L);
}
void Inslist(Node *L)//插入
{
 system("CLS");
 int n;
 printf("请输入在第几个位置插入数据\n");
 scanf("%d",&n);
 printf("请输入插入的学号,姓名\n");
 int num1;
 char name1[10];
 scanf("%d %s",&num1,name1);
 Node *pre,*s;
 int k=0;
 if(n<=0){
  printf("输入的数据不合法,请重新输入\n");
  Inslist(L);
 }
 pre=L;
 while(pre!=NULL&&k<n-1){
  pre=pre->next;
  k=k+1;
 }
 if(pre==NULL){
  printf("无法找到该节点,请重新输入\n");
  Inslist(L);
 }
 s=(Node*)malloc(sizeof(Node));
 strcpy(s->data .name ,name1);
 s->data.num=num1;
 s->next =pre->next ;
 pre->next =s;
 printf("插入成功!\n");
 denglu(L);
}


void Locate(Node *L)//按内容查找(值)
{
 system("CLS");
 int n;
 printf("请输入要查找的学号\n");
 scanf("%d",&n);
 Node *p;
 p=L->next;
 while(p!=NULL){
  if(p->data.num!=n){
   p=p->next;
  }else
   break;
 }
 printf("你要查找的学号所对应的信息为%d %s\n",p->data.num,p->data.name);
 denglu(L);
}
void Get(Node *L)//按序号结点查找
{
 system("CLS");
 int n;
 printf("请输入你要查找的结点\n");
 scanf("%d",&n);
 if(n<=0){
  printf("输入的数据不合法,请重新输入\n");
  Get(L);
 }
 Node *p;
 p=L;
 int j=0;
 while((p->next!=NULL)&&(j<n)){
  p=p->next;
  j++;
 }
 if(n==j){
  printf("你要查找的结点的储存位置的数据为%d %s\n",p->data.num,p->data.name);
 }
 denglu(L);
}
void Printf(Node *L)
{
 int q=0;
 Node *p=L->next;
 while(p!=NULL)
 {
  q++;
  printf("%d %s\n",p->data.num,p->data.name);
  p=p->next;
 }
 printf("单链表长度为%d\n",q);
 denglu(L);
}
void chazhao(Node *L)
{
    printf("1.按序号查找\n");
    printf("2.按内容查找\n");
    printf("3.返回主界面\n");
    int aa;
    scanf("%d",&aa);
    switch(aa){
        case 1:Get(L);
        case 2:Locate(L);
        case 3:denglu(L);break;
        default:
                 printf("输入错误请重新输入\n");
                 chazhao(L);
    }
}

void denglu(Node *L)
{
    int a;
    printf("请选择你要做什么\n");
    printf("1.查找\n");
    printf("2.插入\n");
    printf("3.删除\n");
    printf("4.打印现有的学生信息及单链表长度\n");
    printf("5.退出\n");
    scanf("%d",&a);
    switch(a){
        case 1:chazhao(L);
        case 2:Inslist(L);
        case 3:Dellist(L);
        case 4:Printf(L);
        case 5:printf("谢谢使用\n");exit(0);
        default:
                 printf("输入错误请重新输入\n");
                 denglu(L);
    }
}
void CreateFromHead(Node *L)//头插法
{
 Node *s;
 int n;//n为元素个数
 printf("请输入元素个数\n");
 scanf("%d",&n);
 printf("请输入学号姓名\n");
 for(int i=1;i<=n;i++)
 {
  s=(Node *)malloc(sizeof(Node));
  scanf("%d %s",&s->data.num,s->data.name);
  s->next=L->next;
  L->next=s;
 }
}
void CreateFormTail(Node *L)//尾插法
{
 Node *s,*r;
 r=L;
 int n;//n为元素个数
 printf("请输入元素个数\n");
 scanf("%d",&n);
 printf("请输入学号姓名\n");
 for(int i=1;i<=n;i++)
 {
  s=(Node *)malloc(sizeof(Node));
  scanf("%d %s",&s->data.num,s->data.name);
  r->next=s;
  r=s;
  if(i==n){
   r->next=NULL;
  }
 }
}
Node *InitList(Node *L)//初始化单链表
{
 L=(Node *)malloc(sizeof(Node));
 L->next=NULL;
 return L;
}
void panduan(Node *L)
{
 int q;
 printf("请选择用哪种方式建立链表\n");
 printf("1.头插法\n");
 printf("2.尾插法\n");
 scanf("%d",&q);
 switch(q){
      case (1):
    CreateFromHead(L);
    printf("输入成功!\n");
    break;
   case (2):
    CreateFormTail(L);
    printf("输入成功!\n");
    break;
   default:
    printf("输入错误请重新输入\n");
    panduan(L);
 }
}


int main()
{
    Node *L=NULL;
    L=InitList(L);
    panduan(L);
    denglu(L);

    return 0;
}

 

ps.贴上来的代码空格有点小奇怪啊。不用应该没什么太大影响。= =处女座强迫症伤不起 。

posted @ 2016-09-25 17:11  Jinkelababy  阅读(2455)  评论(0编辑  收藏  举报