数据结构单链表的简单应用

因为数据结构的书上很多都是伪代码,所以在这里共享下自己摸索出来的怎么样数据结构的完整简单编程,给自学者参考,参考。

头插法的简单应用:

///定义一个节点类型
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
 int data;
 struct node *next;
}lnode,*link;
///
 link tou()                                      //头结点输入
 {
  int x;
  link l,p;
  l=(lnode*)malloc(sizeof(lnode));           //动态分配一个内存空间
  l->next=NULL;
  printf("please input some number\n");
  scanf("%d",&x);                            //输入
   while(x!=0000)
   {
    p=(lnode*)malloc(sizeof(lnode));
    p->data=x;
    p->next=l->next;
    l->next=p;
    scanf("%d",&x);
   }
   return l;
 }
 
 int tt(link l)
{
     int j;
    link p;
   p=l->next;
   j=0;
   while(p)
   {
   j++;
   p=p->next;
}
return j;
}


 void zhaoshu(link l,int i)
 {
  link p;
     p=l->next;
  while(p->data!=i && p!=NULL)
  {
   p=p->next;
  }
   if(p->data!=i)
   {
    printf("你输入的数没有相同的\n");
    exit(0);
   }
       
   else
    printf("你输入的数有相同的\n");
 }

void print(link l)
  {
  link p;
   p=l->next;
   printf("你输入的数有:\n");
   while (p!=NULL)
   {
   printf("%5d",p->data);
    p=p->next;
   }
   printf("\n");
  }
///
     void shan(link l,int t)
  {
   int x;
   lnode *p,*pre,*q;
   pre=l;
   p=l->next;
   while(p!=NULL &&  p->data!=t)
   {  
    pre=p;
    p=p->next;
   }
   if(p->data!=t)
   {
    printf("没有这个节点,所以不能删除\n");
   
   }
   else
   {
    x=p->data;
    pre->next=p->next;
    free(p);
    printf("这个带有数据%d的节点被删除\n",x);
   }
   q=l->next;
  
   while(q!=NULL)
   {
    printf("%5d",q->data);
    q=q->next;
   }
   printf("\n");
  }
 
//
      void zhengjia(link l, int i)
   {
    link s,p,q;
    int x;
    printf("请输入一个数,然后就可以插进里面去\n");
    scanf("%d",&x);
    p=l->next;
    s=(lnode*)malloc(sizeof(lnode*));
    s->data=x;
          while(p!=NULL && p->next->data!=i)
    {
     p=p->next;
    }
    s->next=p->next;
    p->next=s;
            q=l->next;
  
   while(q!=NULL)
   {
    printf("%5d",q->data);
    q=q->next;
   }
   printf("\n");
  }
//


  void   main()
 {
   int t,i,p;
   link l;
   printf("请输入一个数\n");
   scanf("%d",&i);
   l=tou();
   print(l);
   t=tt(l);
   printf("你总共输入了%d个数\n",t);
   zhaoshu(l,i);
   shan(l,i);
  scanf("%d",&p);
   zhengjia(l,p);
 }
 //

尾插法的简单应用:

//定义一个节点类型/
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
 int data;
 struct node *next;
}lnode,*link;
//通过尾插法构建一个链表//
link weicha()
{
 link l,r,p;                           //3个相同类型的指针
 int x;
 printf("请往节点中输入数字\n");
 l=(lnode*)malloc(sizeof(lnode*));     //l指针
        l->next=NULL;                         //头结点赋值为空
 r=l;                                  //r指针=l指针
 scanf("%d",&x);                       //输入
 while(x!=0000)   
 {
  p=(lnode*)malloc(sizeof(lnode*)); //动态分配一个内存空间
  p->data=x;      
  p->next=r->next;
  r->next=p;                        //在尾部插入新节点
  r=p;                              //指向新的尾节点
  scanf("%d",&x);
 }
 return l;
}
//
 void print(link l)                        //输出
 {
  link p;
  p=l->next;                             //这个类型的p指向l链表的头结点
  while(p!=NULL)
  {
        printf("%3d",p->data);              //输出
  p=p->next;
  }
  printf("\n");    
 }
 /
 void main()
 {
  link l;                              
  l=weicha();                           //定义一个
  print(l);
 }
//

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,下面是一个简单单链表通讯录的数据结构: ``` struct Contact { char name[50]; char phone[20]; char email[50]; struct Contact* next; }; typedef struct Contact* ContactPtr; ``` 上面的结构体定义了一个通讯录中联系人的信息,包括姓名、电话和电子邮件地址。每个联系人都有一个指向下一个联系人的指针。使用这个结构体,我们可以定义一个单链表的通讯录。 下面是一个简单的实现示例,包括添加联系人、查找联系人和删除联系人等基本操作: ``` #include <stdio.h> #include <stdlib.h> #include <string.h> struct Contact { char name[50]; char phone[20]; char email[50]; struct Contact* next; }; typedef struct Contact* ContactPtr; // 初始化通讯录 ContactPtr initContact() { ContactPtr head = (ContactPtr)malloc(sizeof(struct Contact)); head->next = NULL; return head; } // 添加联系人 void addContact(ContactPtr head, char name[], char phone[], char email[]) { ContactPtr newContact = (ContactPtr)malloc(sizeof(struct Contact)); strcpy(newContact->name, name); strcpy(newContact->phone, phone); strcpy(newContact->email, email); newContact->next = NULL; ContactPtr current = head; while (current->next != NULL) { current = current->next; } current->next = newContact; printf("联系人 %s 添加成功!\n", name); } // 查找联系人 void findContact(ContactPtr head, char name[]) { ContactPtr current = head->next; while (current != NULL) { if (strcmp(current->name, name) == 0) { printf("%s 的电话号码是:%s,电子邮件地址是:%s\n", current->name, current->phone, current->email); return; } current = current->next; } printf("未找到联系人 %s!\n", name); } // 删除联系人 void deleteContact(ContactPtr head, char name[]) { ContactPtr current = head; while (current->next != NULL) { if (strcmp(current->next->name, name) == 0) { ContactPtr temp = current->next; current->next = temp->next; free(temp); printf("联系人 %s 删除成功!\n", name); return; } current = current->next; } printf("未找到联系人 %s!\n", name); } // 打印所有联系人 void printContacts(ContactPtr head) { if (head->next == NULL) { printf("通讯录为空!\n"); return; } ContactPtr current = head->next; while (current != NULL) { printf("%s 的电话号码是:%s,电子邮件地址是:%s\n", current->name, current->phone, current->email); current = current->next; } } int main() { ContactPtr head = initContact(); addContact(head, "张三", "123456789", "zhangsan@example.com"); addContact(head, "李四", "987654321", "lisi@example.com"); addContact(head, "王五", "234567890", "wangwu@example.com"); printContacts(head); findContact(head, "张三"); findContact(head, "赵六"); deleteContact(head, "李四"); printContacts(head); return 0; } ``` 上面的代码实现了一个简单单链表通讯录,包括添加联系人、查找联系人和删除联系人等基本操作。 ### 回答2: 单链表通讯录是一种基于数据结构的通讯录实现方式。通讯录中的每个联系人都被封装为一个节点,节点内包含联系人的信息和一个指向下一个节点的指针。该链表的头节点指向第一个联系人,最后一个联系人的节点指针为空。 单链表通讯录的优点是插入和删除联系人的操作高效。当需要插入一个新的联系人时,只需要修改指针的指向即可,无需移动其他节点。同样,删除联系人时也只需修改指针指向,不需要进行大量的数据迁移。这样可以大大提高操作的效率。 然而,单链表通讯录的缺点是查找联系人的效率相对较低。由于只能按顺序查找,当查找的联系人位于链表的末尾时,需要遍历整个链表寻找,时间复杂度较高。为了解决这个问题,可以使用更高效的数据结构,如哈希表来实现通讯录。 除了基本的插入、删除和查找操作,单链表通讯录还可以进行其他一些常见的操作,如修改联系人信息、排序联系人。修改联系人信息时,可以根据给定的姓名或其他关键字,遍历链表找到指定联系人并修改其信息。排序联系人时,可以使用冒泡排序等算法进行排序,将链表中的联系人按照一定的规则排序。 总的来说,单链表通讯录是一种简单而高效的通讯录实现方式。它具有插入、删除操作高效的优点,但查找效率相对较低。可以根据实际需求选择合适的数据结构来实现通讯录。 ### 回答3: 单链表通讯录是一种常见的数据结构,用于存储和管理联系人信息。通讯录中的每个联系人被表示为一个节点,节点包含姓名、电话号码等信息,并且有一个指向下一个节点的指针。 单链表通讯录的优点是插入、删除和查找操作都很高效。在插入操作时,只需将新的联系人节点插入到链表中,并更新相应的指针,即可完成插入操作。在删除操作时,只需修改相应节点的指针,即可将该联系人节点从链表中删除。在查找操作时,只需从头节点开始,依次遍历每个节点,直到找到目标联系人节点为止。 另一个优点是单链表通讯录能够动态地存储联系人信息。链表的长度可以根据需要进行动态调整,不需要预先分配固定的内存空间。这使得单链表通讯录更加灵活和节省内存空间。 然而,单链表通讯录也有一些缺点。首先,查询某个特定联系人节点的效率较低,需要遍历整个链表,尤其在链表较长时,效率较低。其次,在内存分配上可能存在空间浪费的问题,因为每个节点的指针需要占用额外的内存空间。 综上所述,单链表通讯录是一种高效、灵活的数据结构,适合用于存储和管理通讯录信息。但在应用中需要根据具体需求权衡其优缺点,选择合适的数据结构来实现通讯录功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值