| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 324 人关注过本帖
标题:很简单的链表C程序,不知道怎么修改,求大神
取消只看楼主 加入收藏
一个初学者
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2013-12-11
结帖率:0
收藏
已结贴  问题点数:20 回复次数:0 
很简单的链表C程序,不知道怎么修改,求大神

图片附件: 游客没有浏览图片的权限,请 登录注册
图片附件: 游客没有浏览图片的权限,请 登录注册
代码如下
程序代码:
#include "llist.h"
#define N 10
void main(){
    List L = ListInit();
    for (int i=0; i<N; i++) {
        ListInsert(L, i, 0);
    }
    ListPrint(L);
    ListDelete(L, 1);
    printf("\n删除第1个元素后:\n");
    ListPrint(L);
}
void Error(char* s){
    printf("%s\n", s);
    exit(0);
}
//创建一个新的结点
link NewNode()
{
    link l =(link) malloc(sizeof(Node));
    if (l == NULL)
        Error("结点创建失败!");
    return l;
}

//链表初始化
List ListInit()
{
    List L = (List)malloc( sizeof(*L) );
    if(L == NULL)
        Error("链表创建失败!");
    L->first = NULL;
    return L;
}
int ListLength( List L )//求取链表的长度
{

    link p = L->first;
    int count = 0;
    while ( p != NULL ) {
        count++;
        p = p->next;
    }
    return count;
}
int ListEmpty(List L)//判断链表是否为空
{
    return L->first==NULL?1:0;
}
ListItem ListRetrieve(List L, int k)//检索表L中的第K个元素
{
    if(L == NULL)
        Error("链表不存在,检索失败!");
    if (k<1 || k>ListLength(L))
        Error("不存在第k个元素,检索失败!");

    link p = L->first;
    int count = 1;
    while (count < k) {
        p = p->next;
        count++;
    }
    return p->data;
}
int ListLocate(List L, ListItem x)//返回x在L中的位置
{
    if(L==NULL || L->first==NULL)
        Error("链表不存在或为空表,无法定位!");
    link p = L->first;
    int k = 1;
    while (p && x != p->data) {
        p = p->next;
        k++;
    }
    if(p == NULL)
        return 0;
    else
        return k;
}
void ListInsert(List L, ListItem x, int k)//在L中的第k个元素后面插入元素x,[0,length]
{
    if(L==NULL)
        Error("链表不存在,无法插入!");
    if(k<0||k>ListLength(L))
        Error("插入位置不合法,无法插入");
    //创建新结点
    link y = NewNode();
    y->data = x;

    //分情况:1)k=0  2)k>0


    if (k == 0) {
        //表首插入
        y->next = L->first;
        L->first = y;
    }
    else
    {
    //查找插入位置
    link p = L->first;
    int pos = 1;
    while (pos < k) {
        p = p->next;
        pos++;
    }

    y->next = p->next;
    p->next = y;
    }

}
ListItem ListDelete(List L, int k)//删除表L中的第k个元素
{


    if(L == NULL || L->first ==NULL)
        Error("空表或表不存在,不能删除!");
    if(k<1 || k>ListLength(L) )
        Error("删除位置不合法,无法删除!");
    link p = L->first;
    int pos = 1;
    ListItem x ;
    if(k == 1)
    {
        L->first = p->next;
        x= p->data;
    }
    else{
        //查找第k-1个元素

        while (pos < k-1) {
            p = p->next;
            pos++;
        }
   
        link q = p->next;
        p->next = q->next;
        x = q->data;
        free(q);
   
   
    }

    return x;
}
void ListPrint(List L)//打印表L中的所有元素
{
    if (L == NULL || L->first==NULL)
        Error("表不存在或空表,无法打印!");
    link p = L->first;
    while (p) {
        ItemShow(p);
        p = p->next;
    }
}
void ItemShow(link x)//打印一个节点
{
    printf("%d ", x->data);
}
代码运行后的窗口是第二张截图:只能实现删除功能。

我想实现的效果是第一张截图:能实现创建链表 添加 查找 删除 检索

好像要在main函数里添加一些代码就可以了。我不是很懂。求大神!!!

llist.h的代码如下


#include <stdio.h>
#include <stdlib.h>
typedef int ListItem;
typedef struct node{
    ListItem data;
    struct node* next;
}Node, *link;

typedef struct llist{
    link first;
}Llist, *List;

link NewNode();//创建一个新的结点
List ListInit();//链表初始化
int ListLength( List L );//求取链表的长度
int ListEmpty(List L);//判断链表是否为空
ListItem ListRetrieve(List L, int k);//检索表L中的第K个元素
int ListLocate(List L, ListItem x);//返回x在L中的位置
void ListInsert(List L, ListItem x, int k);//在L中的第k个元素后面插入元素x
ListItem ListDelete(List L, int k);//删除表L中的第k个元素
void ListPrint(List L);//打印表L中的所有元素
void ItemShow(link x);//打印一个节点









[ 本帖最后由 一个初学者 于 2013-12-11 22:48 编辑 ]
2013-12-11 22:39
快速回复:很简单的链表C程序,不知道怎么修改,求大神
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017936 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved