C语言实现单链表的初始化、创建、遍历等操作

编译环境:VC++6.0

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

typedef struct LNode
{
    int data;
    struct LNode *next;
}LNode,*LinkList;

LinkList Init_LNode()        //链表初始化
{
    LNode *L;
    L = (LinkList)malloc(sizeof(LNode));
    if(L == NULL)
    {
        printf("初始化失败!\n");
        exit(-1);
    }
    L->next = NULL;
        return L;
}

void Creat_List1(LNode *L)        //头插法
{
    int i,n,num;
    LNode *pnew;
    
    printf("请输入要输入的元素个数:n = ");
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        printf("请输入第%d个数:",i+1);
        scanf("%d",&num);
        pnew = (LinkList)malloc(sizeof(LNode));
        pnew->data = num;
        pnew->next = L->next;
        L->next = pnew;
    }
}
void Creat_List(LNode *L)        //创建  尾插法
{
    int i,n,num;
    LNode *p,*pnew;
    p = L;
    printf("请输入要输入的元素个数:n = ");
    scanf("%d",&n);

    for(i=0;i<n;i++)
    {
        printf("请输入第%d个数:",i+1);
        scanf("%d",&num);
        pnew = (LinkList)malloc(sizeof(LNode));
        if(pnew == NULL)
        {
            printf("初始化失败!\n");
            exit(-1);
        }
        pnew->data = num;
        p->next = pnew;
        p = pnew;
    }
    p->next =NULL;
}

void Show_Linst(LNode *L)        //遍历
{
    LNode *p;
    p =L->next;

    while(p!=NULL)
    {
        printf("%d ",p->data);
        p = p->next;
        
    }
    printf("\n");
}

void Insert_List(LNode *L)        //插入
{
    int i , n , val;
    LNode *p,*s;
    p = L;
    i=1;
    printf("请输入你要插入的位置:n=");
    scanf("%d",&n);
    printf("请输入你要插入的元素:val=");
    scanf("%d",&val);
    while(p&&i<n)
    {
        p = p->next;
        ++i;
    }
    if(!p || i>n)
        printf("无法插入!\n");
    s = (LinkList)malloc(sizeof(LNode));
    s->data = val;
    s->next = p->next;
    p->next = s;

}

void Delete_List(LNode *L)        //删除
{
    int i , n ;
    LNode *p,*s;
    p = L;
    i=1;
    printf("请输入你要删除的位置:n=");
    scanf("%d",&n);
    while(p&&i<n)
    {
        p = p->next;
        ++i;
    }
    if(!(p->next) || i>n)
        printf("删除的位置不合法!\n");
//    p->next =p->next->next;
    s = p->next;
    p->next = s->next;
    free(s);
    
}

void Query_List(LNode *L)        //查询
{
    int i , n ,val;
    LNode *p;
    p = L->next;
    i=1;
    printf("请输入你要查询的位置:n=");
    scanf("%d",&n);
    while(p&&i<n)
    {
        p = p->next;
        ++i;
    }
    if(!(p->next) || i>n)
        printf("查询的元素不存在!\n");
    val = p->data;
    printf("你查询的元素值为:%d\n",val);
}


void Destroy_List(LNode *L)        //销毁
{
    LinkList p,q;
    p = L->next;    //p指向第一个结点
    while(p)
    {
        q = p->next;
        free(p);
        p = q;
    }
    L->next = NULL;
}
int Show_Menu()        //主菜单
{
    int num;
    printf("********************************************\n");
    printf("\n  【1】创建            【2】插入\n");
    printf("\n  【3】删除            【4】查询\n");
    printf("\n  【5】遍历            【6】退出\n");
    printf("\n********************************************\n");
    printf("请输入你的操作序号:");
    if(scanf("%d",&num)==0)
    {
        printf("请重新输入!\n");
    }
    return num;
}
int main(int argc,char *argv[])
{
    LinkList S;
    int val;
    S = Init_LNode();
    if(S == NULL)
    {
        printf("初始化失败!\n");
    }
    while(val!=6)
    {
    val = Show_Menu();
    switch(val)
    {
    case 1:
            Creat_List(S);        //尾插法
            //Creat_List1(S);    //头插法
            break;
    case 2:
            Insert_List(S);        //插入
            break;
    case 3:
            Delete_List(S);        //删除
            break;
    case 4:
            Query_List(S);        //查询
            break;
    case 5:
            Show_Linst(S);        //显示
            break;
    case 6:
            Destroy_List(S);    //销毁
            exit(0);
            break;
    }
    }
}


  • 15
    点赞
  • 114
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
非常感谢您的提问!以下是单链表的查找、删除、添加和遍历操作C语言代码示例: // 定义单链表节点结构体 typedef struct Node { int data; // 数据域 struct Node* next; // 指针域 } Node; // 初始化单链表 Node* initList() { Node* head = (Node*)malloc(sizeof(Node)); // 创建头节点 head->next = NULL; // 头节点的指针域为空 return head; } // 在单链表末尾添加元素 void addElement(Node* head, int data) { Node* p = head; while (p->next != NULL) { p = p->next; } Node* newNode = (Node*)malloc(sizeof(Node)); // 创建新节点 newNode->data = data; newNode->next = NULL; p->next = newNode; } // 在单链表指定位置插入元素 void insertElement(Node* head, int index, int data) { Node* p = head; int i = 0; while (p != NULL && i < index) { p = p->next; i++; } if (p == NULL) { printf("插入位置无效!\n"); return; } Node* newNode = (Node*)malloc(sizeof(Node)); // 创建新节点 newNode->data = data; newNode->next = p->next; p->next = newNode; } // 在单链表中查找元素 int findElement(Node* head, int data) { Node* p = head->next; int i = 0; while (p != NULL) { if (p->data == data) { return i; } p = p->next; i++; } return -1; } // 在单链表中删除元素 void deleteElement(Node* head, int data) { Node* p = head; while (p->next != NULL) { if (p->next->data == data) { Node* temp = p->next; p->next = temp->next; free(temp); return; } p = p->next; } printf("未找到要删除的元素!\n"); } // 遍历单链表并输出所有元素 void traverseList(Node* head) { Node* p = head->next; while (p != NULL) { printf("%d ", p->data); p = p->next; } printf("\n"); } // 主函数 int main() { Node* head = initList(); // 初始化单链表 int n, data; printf("请输入要添加的元素个数:"); scanf("%d", &n); printf("请输入%d个元素:", n); for (int i = 0; i < n; i++) { scanf("%d", &data); addElement(head, data); // 在单链表末尾添加元素 } printf("单链表中的元素为:"); traverseList(head); // 遍历单链表并输出所有元素 printf("请输入要插入的元素位置和值:"); int index; scanf("%d%d", &index, &data); insertElement(head, index, data); // 在单链表指定位置插入元素 printf("插入后单链表中的元素为:"); traverseList(head); printf("请输入要查找的元素值:"); scanf("%d", &data); int pos = findElement(head, data); // 在单链表中查找元素 if (pos == -1) { printf("未找到该元素!\n"); } else { printf("该元素在单链表中的位置为:%d\n", pos); } printf("请输入要删除的元素值:"); scanf("%d", &data); deleteElement(head, data); // 在单链表中删除元素 printf("删除后单链表中的元素为:"); traverseList(head); return 0; } 希望这个代码示例能够帮助您!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值