很简单的链表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 编辑 ]









