当前位置: 代码迷 >> 综合 >> 单链表的增删减除、查找、计算长度
  详细解决方案

单链表的增删减除、查找、计算长度

热度:94   发布时间:2024-02-27 09:47:12.0

C语言:单链表的增删减除、查找、计算长度

#include<stdio.h>
#include<stdlib.h> 
#define ElemType int
typedef struct  Node
{
    ElemType date;
    struct Node *next;
}Node,*ListLink;

// 链表初始化
ListLink Link_(ListLink *L)
{
    *L=(ListLink)malloc(sizeof(Node));
    (*L)->next=NULL;

// 利用头插法建立链表 
int greate(ListLink L)
{
    Node *s;
    char c;
    printf("请输入一串数字");
    while(1)
    {
        scanf("%d",&c);
        if(c==-1)  return NULL;
        s=(ListLink)malloc(sizeof(Node));
        s->date=c;
        s->next=L->next;
        L->next=s; 
    }

// 查找单链表中的第 i 个节点
ListLink get(ListLink L,int i)
{
    int j;
    Node *p;
    if(i<=0) return NULL;
    p=L;j=0;
    while((p->next!=NULL)&&(j<i))
    {
        p=p->next;
        j++;
    } 
    if(i==j)  
        printf("查找节点的值:%d ",p) ;
        return p;

// 查找单链表值为 key 的节点
ListLink Zget(ListLink L,ElemType e)
{
    Node *p; 
    int j;
    p=L->next; 
    while(p!=NULL)
    {
        if(p->date!=e)
        {
            p=p->next;
        }
        else break;
    }
    return p;
    printf("查找的节点位置为:%d",p); 

// 求单链表的长度
int Length(ListLink L) 
{
    Node *p;
    p=L->next;
    int j=0;
    while(p!=NULL)
    {
        p=p->next;
        j++;
    } 
    printf("该单链表的长度为:%d",j); 
    return j; 
}

// 单链表中的插入操作
void IntList(ListLink L,int i,ElemType e)  
// 在第 i 个位置插入新节点 e
{
    Node *p,*r;
    int k;
    if(i<=0)
    {
        printf("操作不合理"); 
    }
    p=L;
    k=0;
    while(p!=NULL&&k<i-1)
    {
        p=p->next;
        k=k+1;
    } 
    if(p==NULL)
    {
        printf("操作不合理"); 
    }
    r=(Node *)malloc(sizeof(Node));
    r->date=e;
    r->next=p->next;
    p->next=r;
    printf("添加后的链表:"); 

// 单链表的删除操作
void delList(ListLink L,int i,ElemType e) 
{
    Node *p,*r;
    int k;p=L;k=0;
    while(p->next!=NULL&&k<i-1)
    {
        p=p->next;
        k=k+1; 
    }
    if(p->next==NULL)
    {
        printf("删除节点不合理");
    }
    r=(Node *)malloc(sizeof(Node));
    r=p->next;
    p->next=r->next;
    e=r->date;
    free(r); 
    printf("删除后的链表:");     
}

// 输出链表
void Output(ListLink L)//输出链表的各个元素 
{
    int i;
    for( i = 0; L->next!=NULL;i++)
    {
        printf("%d  ",L->next->date);
        L=L->next;        
    }
    printf("\n");
}

int main()
{
    ListLink L;
    int c,i,j;
    int d,z;
    Link_(&L);
    greate(L);
    printf("输入的链表为:");
    Output(L);
    printf("请输入插入的位置和大小");
    scanf("%d,%d",&i,&d); 
    IntList(L,i,d);
    Output(L);
    printf("请输入删除的位置和大小");
    scanf("%d,%d",&j,&z); 
    delList(L,j,z); 
    Output(L);
    Length( L);
    printf("请选择查找方式:1、按地址查找  2、按值查找");
    scanf("%d",&c); 
    switch(c)
    {
        int i,j;
        case 1:
            printf("请输入查找的节点");
            scanf("%d",&i); 
            get(L,i);
            break;
        case 2:
            printf("请输入查找的值");
            scanf("%d",&j); 
            Zget(L,j);
            break;        
    }