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