单链表的基本算法实现。

/*昨天晚上,孙蕊蕊学霸与我的对话:
 
13-软工-孙蕊蕊 2014/10/19 21:59:06
数据结构我们学的链表,你把有关的算法用c语言实现吗?

中国好利鹏 2014/10/19 21:00:37
恩,上个学期实现过。
2014/10/19 21:01:06
13-软工-孙蕊蕊 2014/10/19 21:01:06
,程序还有吗?

中国好利鹏 2014/10/19 21:01:51
没有。打算今天再写一遍,有事耽误了。明天给你

13-软工-孙蕊蕊 2014/10/19 21:02:19
好的。

真的本来打算昨天晚上就搞定的。可是。。。哎,,,没有可是了 。。。。
以下的代码,不是书上的,是老师课上讲的一些思路。比如置空表算法的合理性。
还有输出函数,是我自己写的。
希望可以帮助小伙伴们。
*/
#include "stdio.h"
#include "malloc.h"

typedef struct node{
    int data;
    struct node *next;
}LinkList;

 LinkList *create(){//创建单链表
     LinkList *p,*q,*head;
     int k;
     head=(LinkList *)malloc(sizeof(LinkList));
     q=head;
     printf("请输入int数据,以0结束\n");
     scanf("%d",&k);
     while(k!=0){
         
         p=(LinkList *)malloc(sizeof(LinkList));
         p->data = k;
         q->next = p;
         q=p;
         q->next=NULL;
         scanf("%d",&k);
     }
     return head;
 }
 
 LinkList * setnull(LinkList *L){//单链表置空表方法
      LinkList *p,*q;
      if(L->next == NULL){return L;//判断是否为空表
     }
     else{     p=L->next;
              L->next=NULL;//将头指针置空
              q=p->next;
             while(q!=NULL){//释放空间
                 free(p);
                 p=q;
                 q=q->next;
             }
     }
     return L;
 }
 
 //单链表求表长算法
 int Llength(LinkList *L){
     LinkList *p;
     int n=0;
     p = L->next;
     while(p!=NULL){
         p=p->next;
         n++;
     }
     return n;
 }
 
 
 //单链表按序号取元素算法
 LinkList *Get(LinkList *L,int i){
     int j; LinkList *p;
     p=L->next;
     j=1;
     while(p!=NULL && j<i){
         p=p->next;
         j++;
     }
     if(i == j){
         return p;
     }
     else
     return NULL;
 }
 
 
 //单链表插入算法
 void Linsert(LinkList *L,int i,int x){
     LinkList *p,*s;
     int j;
     p=L;
    j=0;
    while(p!=NULL && j<i-1){
        p=p->next;
        j++;
    }
    if(p == NULL) printf("序号错误!");
    else{
        s=(LinkList*)malloc(sizeof(LinkList));
        s->data=x;
        s->next=p->next;
        p->next=s;
    }
 }
 
 
 //单链表删除算法
 void Ldelete(LinkList *L,int i){
     LinkList *p,*u;
     int j;
     p=L;
     j=0;
     while(p!=NULL && j<i-1){
         p=p->next;
         j++;
     }
     if(p!=NULL &&p->next!=NULL){
         u=p->next;
         p->next=u->next;
         free(u);
     }
 }
 void Loutput(LinkList *L){
     if(L->next == NULL){printf("这个表为空!");//判断是否为空表
     }
     else{
     while(L->next!=NULL){
         printf("%d\t",L->next->data);
         L=L->next;
     }
     printf("结束\n");
     }
 }
 
 int main(){
     int n;
     LinkList *L,*M;
     L=create();
     printf("创建的表为:");
     Loutput(L);    
     n=Llength(L);
     printf("表长为:%d\n",n);
     M=Get(L,3);
     printf("得到第三位置的值:%d\n",M->data);
     Linsert(L,3,8);
     printf("将8插入到第三个为位置:\n");
         Loutput(L);    
     Ldelete(L,3);
     printf("删除第三个位置的值:\n");
         Loutput(L);    
     L=setnull(L);
     printf("表置空后的值:");
     Loutput(L);    
 }
 
 
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值