不带表头结点的单向链表总结

来源:互联网 发布:噪音监测软件 编辑:程序博客网 时间:2024/05/17 01:09
程序代码:


#include <stdio.h>
#include <stdlib.h>


struct node
{
char name[20];
int num;


struct node *next;
};


typedef struct node Node;
typedef struct node * Link;


void creat_link(Link *head)
{
*head = NULL;
}


void creat_new_node(Link* new_node)
{
    *new_node = (Link)malloc(sizeof(Node));


if(*new_node == NULL)
{
printf("malloc is error!\n");
exit(-1);
}
}


void insert_node_head(Link *head,Link new_node)
{
new_node->next = *head;
*head = new_node;
}


void insert_node_tail(Link *head,Link new_node)
{
Link p = NULL;
if(*head == NULL)
{
new_node->next = *head;
*head = new_node;


}
else
{
        p = *head;


        while(p->next != NULL)
    {
    p = p->next;
    }
p->next = new_node;
new_node->next = NULL;
}
}


void display_link(Link head)
{
    Link p = head;


if(head == NULL)
{
printf("Link is empty!\n");
}


while(p != NULL)
{
        printf("%d  %s\n",p->num,p->name);
printf("\n");


p = p->next;
}
}


void free_link(Link *head)
{
Link p;


while(*head != NULL)
{
p = *head;
*head = (*head)->next;
free(p);
}


if(*head == NULL)
{
printf("释放成功!\n");
}
}


int len(Link head)
{
int n = 0; 
Link p = head;


while(p->next != NULL)
{
        n++;
p = p->next;
}
return n+1;
}


Link search(Link * head,int m)
{
    Link p = *head;
if(*head == NULL)
{
printf("the list is empty!\n");
return;
    }
while(p != NULL && (p->num) != m)
{
p = p->next;
}


return p;
}


void delete(Link *head,int n)
{
Link p = *head;
Link q = *head;


if(*head == NULL)
{
printf("the list is empty!\n");
}
    else if(((*head)->num) == n)
{
   *head  = (p->next);
free(p);


    display_link(*head);
}
else
{
    while(p != NULL && (p->num) != n)
    {
    q = p;
    p = p->next;
    }
if(p == NULL)
{
printf("no exist!\n");
}
else
{
q->next = (p->next);
free(p);
        display_link(*head);
}
        
}


}


void insert(Link *head,int loc)
{
Link q = *head;
Link p = *head;
Link new_node = NULL;


    creat_new_node(&new_node);


printf("enter the number:");
scanf("%d",&(new_node->num));
printf("enter the name:");
scanf("%s",new_node->name);


if(*head == NULL)
{
printf("the list is empty!\n");
}
    else if(((*head)->num) == loc)
{
        new_node->next = *head;
*head = new_node;
}
else
{
while(p != NULL && (p->num) != loc)
{
q = p;
p = p->next;
}


if(p == NULL)
{
printf("没有这个学号!\n");
}
else
{
           q->next = new_node;
  new_node->next = p;
}


}


}




void reverse(Link *head)
{
    Link p1 = *head;
Link p2;
Link p3;


if(*head == NULL)
{
printf("链表是空的\n");
}
else if((*head)->next == NULL)
{
printf("链表只有一个节点\n");
}
else
{
    p2 = p1->next;
    p3 = p2->next;
p2->next = p1;


while(p3 != NULL)
{
            p1 = p2;
p2 = p3;
p3 = p3->next;
p2->next = p1;
}

(*head)->next = NULL;
*head = p2;
}


}


void insert_sort(Link *head,Link new_node)
{
Link p = *head;
Link q = *head;


if(*head == NULL)
{
*head = new_node;
}
    else if((*head)->next == NULL)
{
if((new_node->num) > ((*head)->num))
{
            insert_node_tail(head,new_node);
}
else
{
            insert_node_head(head,new_node);
}
}
else
{
while(p!= NULL && p->num < (new_node->num))
{
q = p;
p = p->next;
}
if(p == *head)
{
            insert_node_head(head,new_node);
}
else
{
            new_node->next = p;
   q->next = new_node;
}
}


}


int main()
{
int i,t,m,n,d,loc;
Link head = NULL;
Link f = NULL;


creat_link(&head);


Link new_node = NULL;


printf("你想输入几个姓名:");
scanf("%d",&t);
printf("输入学号和姓名:\n");


for(i = 0;i < t;i++)
{
        creat_new_node(&new_node);


scanf("%d%s",&(new_node->num),new_node->name);


    // insert_node_head(&head,new_node);
// insert_node_tail(&head,new_node);

    insert_sort(&head,new_node);
}


/* printf("由小到大排序输出:\n");


display_link(head);


printf("链表长度为 : %d\n",len(head));
printf("输入你想查询的学号:\n");
scanf("%d",&m);
printf("\n");


    f = search(&head,m);
if(f != NULL)
{
printf("查询结果是:\n");
   printf("%d  ",f->num);
    printf("%s\n",f->name);
}
    else
{
printf("没有这个数!\n");
}


printf("输入你想删除的那个数:\n");
scanf("%d",&n);
    delete(&head,n);


printf("输入你想插入的位置上的那个数 :\n");
scanf("%d",&loc);


insert(&head,loc);


printf("插入后的结果是\n");
display_link(head);*/




printf("倒序输出是:\n");
reverse(&head);


display_link(head);


free_link(&head);


    return 0;
}
0 0
原创粉丝点击