满意答案
日木子多灾多难
推荐于 2018.04.13
采纳率:40% 等级:7
已帮助:460人
哈哈 碰巧也是返回来学数据结构,让后自己看着书一个一个去实现,下面的代码绝对是我一个代码一个代码打上去得,(你的分就不要啦,给你做个参考吧,结果太多我也就不打啦),带头结点的哦!!ListLink.c文件:
Status initList(LinkList *L){//初始化表
LinkList head;
head=(LinkList)malloc(sizeof(Lnode));
if(NULL==head)
exit(OVERFLOW);
head->next=NULL;
*L=head;
return OK;
}
Status listEmpty(LinkList L){//判断是否为空表
if(NULL==L->next)
return TRUE;
return FALSE;
}
Status listLeng(LinkList L,int *l){//返回表长
LinkList Link;
int i=0;
Link=L->next;
if(Link==NULL){
*l=i;
return OK;
}
while(1){
Link=Link->next;
i++;
if(Link==NULL)
break;
}
*l=i;
return OK;
}
Status ClearList(LinkList *L){//将线性链表L重置为空表,释放原链表结点空间,注意算法
LinkList q,p;
q=p=*L;
if(p->next==NULL)
return OK;
p=q->next;
q->next=NULL;
while(p!=NULL){
q=p;
p=p->next;
free(q);
}
return OK;
}
Status DestroyList(LinkList *L){//销毁一个链表
ClearList(L);
free(*L);
return OK;
}
Status Append(LinkList *L,Lnode *s){//增加一个节点
LinkList link;
link=(*L)->next;
if(link==NULL){
((*L)->next)=s;
return OK;
}
while(NULL!=(link->next)){
link=link->next;
}
(link->next)=s;
return OK;
}
Status PriorPos(LinkList L,ElemType e,LinkList *ln){//返回直接前驱
LinkList link;
link=L->next;
if(link==NULL)
return ERROR;
while(1){
if(e==(link->next->data)){
*ln=link;
return OK;
}
if(link->next==NULL)
return ERROR;
link=link->next;
}
}
Status Remove(LinkList *L,LinkList *q){//删除最后一个节点并返回它
LinkList link;
link=(*L)->next;
if(link==NULL)
return ERROR;
while(link->next->next!=NULL){
link=link->next;
}
*q=link->next;
link->next=NULL;
return OK;
}
Status InsBefore(LinkList *L,LinkList p,Lnode s)//将s结点插入在p所指结点之前,并修改指针p指向新插入的结点
{
LinkList link;
link=*L;
while(link->next){
if(link->next==p){
s.next=p;
*(link->next)=s;
*p=s;
return OK;
}
link=link->next;
}
return ERROR;
}
Status InsAfter(LinkList *L,LinkList p,Lnode s)//将s所指结点插入在p所指结点之后并修改指针p指向新插入的结点
{
LinkList link;
link=*L;
while(link){
if(link->next==p){
if(p->next==NULL){
*(p->next)=s;
*p=s;
return OK;
}
s.next=p->next;
*(p->next)=s;
*p=s;
return OK;
}
link=link->next;
}
return ERROR;
}
Status LocateList(LinkList L,int i,Lnode *p)//用p返回线性链表L中第i个结点的位置
{LinkList link;
int j=1;
link=L;
if(i<1)
return ERROR;
while(1){
link=link->next;
if(j==i){
p=link;
return OK;
}
if(link->next==NULL)
return ERROR;
j++;
}
}
Status LocateElem(LinkList L,ElemType e,int *i)//回线性链表L中第1个data为e的元素的位置
{
int j=1;
LinkList link;
link=L->next;
while(1){
if(link->data==e){
*i=j;
return OK;
}
if(link->next==NULL)
return ERROR;
j++;
}
}
Status ListOut(LinkList L)//输出每个元素
{
LinkList link;
link=L->next;
if(link==NULL){
printf("此为空表.\n");
return 0;
}
while(link!=NULL){
printf("%4d",link->data);
link=link->next;
}
printf("\n");
return OK;
}
宏定义文件和以下引用头文件和结构体定义文件:addhead.h:
#include
#include
#include //注意exit()
#include
#include //INT_MAX等
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef int ElemType;
typedef struct node{
ElemType data;
struct node *next;
}Lnode,*LinkList;
最后就是main文件啦:main.c
#include "addhead.h"
#include "LinkList.c"
void main(void){
LinkList L=NULL;
int e_tmp=3;
int i=0;
int num=0;
Lnode *ln[10];
Lnode *lnode;
for(i=0;i<10;i++){
ln[i]=(LinkList)malloc(sizeof(Lnode));
}
if(initList(&L))
printf("初始化L成功!\n");
for(i=0;i<10;i++){
ln[i]->data=i*e_tmp;
ln[i]->next=NULL;
}
for(i=0;i<10;i++){
printf("%4d",ln[i]->data);
}
printf("\n");
printf("将节点添加到L中:\n");
for(i=0;i<10;i++){
Append(&L,ln[i]);
}
ListOut(L);
printf("\n");
if(listLeng(L,&num))
printf("表的长度%d\n",num);
if(PriorPos(L,9,&lnode))
printf("该前驱的数据域%d\n",lnode->data);
ListOut(L);
if(Remove(&L,&lnode))
printf("删除成功,删除的节点数据域%d\n",lnode->data);
ListOut(L);
if(listLeng(L,&num))
printf("表的长度%d\n",num);
if(ClearList(&L))
printf("表清空成功!\n");
if(listLeng(L,&num))
printf("清空后表的长度%d\n",num);
if(DestroyList(&L))
printf("销毁成功!\n");
getchar();
}
50分享举报