由于使用 引用更加方便,所以以后采用数据结构一书中的代码格式
代码如下:
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
/*
头部插入法 从空表开始,生成新结点,将读取的数据存放进入新结点的数据域中。
LinkList List_HeadInsert(LinkList &L);
尾部插入法 从空表开始,生成新结点,将读取的数据存放进入新结点的数据域中。
LinkList List_TailInsert(LinkList &L);
按照序号查找操作
LinkList GetElem(LinkList L,int i);
按结点查找操作
LinkList LocateElem(LinkList L,ElemType e);
给定序号前插
bool ListFrontInsert(LinkList L,int i,ElemType e);
删除结点操作
bool ListDelete(LinkList L,int i);
求表长操作
int GetLenght(LinkList L);
输出链表中的数据
void PrintList(LinkList L);
*/
// ***********实现
LinkList List_HeadInsert(LinkList &L){
LinkList s;
int x;
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
printf("you can quit,if you input 9999\n");
scanf("%d",&x);
while(x!=9999){
s = (LinkList)malloc(sizeof(LNode));
s->data = x;
s->next = L->next;
L->next = s;
scanf("%d",&x);
}
return L;
}
LinkList List_TailInsert(LinkList &L){
int x;
L = (LinkList)malloc(sizeof(LNode));
LinkList s,r = L;
printf("you can quit,if you input 9999\n");
scanf("%d",&x);
while(x!=9999){
s = (LinkList)malloc(sizeof(LNode));
s->data = x;
r->next = s;
r = s;
scanf("%d",&x);
}
r->next=NULL;
return L;
}
LinkList GetElem(LinkList L,int i){
if(i==0) return L;
if(i<0) return NULL;
int j = 1;
LinkList p = L->next;
while(p!=NULL&&j<i){
p = p->next;
j++;
}
return p;
}
LinkList LocateElem(LinkList L,ElemType e){
if(NULL==e) return NULL;
LinkList r = L->next;
while(r!=NULL&&r->data!=e)
r= r->next;
return r;
}
bool ListFrontInsert(LinkList L,int i,ElemType e){
LinkList p = GetElem(L,i-1);
if(p==NULL) return false;
LinkList s = (LinkList)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
bool ListDelete(LinkList L,int i){
LinkList q,p = GetElem(L,i-1);
if(p==NULL)return false;
q = p->next;
p->next = q->next;
free(q);
return true;
}
int GetLenght(LinkList L){
int len = 0;
LinkList p = L->next;
while(p!=NULL){
p = p->next;
len++;
}
return len;
}
void PrintList(LinkList L){
L=L->next;
while(L!=NULL){
printf("%d ",L->data);
L=L->next;
}
printf("\n");
}
int main(){
LinkList L;
LinkList search;
// List_HeadInsert(L);
/*
输入数据为 3 4 5 6 7 9999
输出数据为 7 6 5 4 3
*/
List_TailInsert(L);
/*
输入数据为 3 4 5 6 7 9999
输出数据为 3 4 5 6 7
*/
PrintList(L);
search = GetElem(L,2);
if(search!=NULL){
printf("successfully GetElem\n");
printf("%d\n",search->data);
}
search = LocateElem(L,3);
if(search!=NULL){
printf("successfully locateElem\n");
printf("%d\n",search->data);
}
ListFrontInsert(L,2,99);
PrintList(L);
printf("the lenght of list %d\n",GetLenght(L));
ListDelete(L,4);
PrintList(L);
printf("the lenght of list %d\n",GetLenght(L));
}
/*
you can out,if you input 9999
3 4 5 6 7 9999
3 4 5 6 7
按序号查找成功
4
按值查找成功
3
3 99 4 5 6 7
长度为 63 99 4 6 7
长度为 5
*/
双链表与单链表其中代码大量相似代码如下:
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct DNode{
ElemType data;
struct DNode *prior,*next;
}DNode,*DLinkList;
/*
DLinkList Dlist_HeadInsert(DLinkList &DL);
DLinkList Dlist_TailInsert(DLinkList &DL);
DLinkList GetElem(DLinkList DL,int i);
DLinkList LocateElem(DLinkList DL,ElemType e);
bool DListFrontInsert(DLinkList DL,int i,ElemType e);
bool DListDelete(DLinkList DL,int i);
void PrintDList(DLinkList DL);
*/
DLinkList Dlist_HeadInsert(DLinkList &DL){
DLinkList s;
int x;
DL = (DLinkList)malloc(sizeof(DNode));
DL->prior = NULL;
DL->next = NULL;
printf("you can quit,if you input 9999\n");
scanf("%d",&x);
while(x!=9999){
s = (DLinkList)malloc(sizeof(DNode));
s->data = x;
s->next = DL->next;
if(DL->next!=NULL){
DL->next->prior = s;
}
DL->next = s;
s->prior = DL;
scanf("%d",&x);
}
return DL;
}
DLinkList Dlist_TailInsert(DLinkList &DL){
DLinkList s,r;
int x;
DL = (DLinkList)malloc(sizeof(DNode));
r = DL;
DL->prior = NULL;
DL->next = NULL;
printf("you can quit,if you input 9999\n");
scanf("%d",&x);
while(x!=9999){
s = (DLinkList)malloc(sizeof(DNode));
s->data = x;
s->next = r->next;
s->prior = r;
r->next = s;
r = s;
scanf("%d",&x);
}
return DL;
}
DLinkList GetElem(DLinkList DL,int i){
if(i==0)
return DL;
if(i<1)
return NULL;
int j = 1;
DLinkList p = DL->next;
while (p!=NULL&&j<i){
p = p->next;
j++;
}
return p;
}
DLinkList LocateElem(DLinkList DL,ElemType e){
if(NULL==e) return NULL;
DLinkList p = DL->next;
while(p!=NULL&&p->data!=e)
p = p->next;
return p;
}
bool DListFrontInsert(DLinkList DL,int i,ElemType e){
if(NULL==e) return false;
if(i<=0) return false;
DLinkList p = GetElem(DL,i-1);
DLinkList r = (DLinkList)malloc(sizeof(DL));
r->data = e;
r->next = p->next;
r->prior = p;
p->next->prior = r;
p->next = r;
return true;
}
bool DListDelete(DLinkList DL,int i){
if(i<=0)return false;
DLinkList p = GetElem(DL,i);
p->prior->next = p->next;
if(NULL!=p->next){
p->next->prior = p->prior;
}
free(p);
return true;
}
void PrintDList(DLinkList DL){
DLinkList p = DL->next;
while(p!=NULL){
printf("%d ",p->data);
p = p->next;
}
printf("\n");
}
int main(){
DLinkList DL;
DLinkList search;
// Dlist_HeadInsert(DL);
Dlist_TailInsert(DL); // input data : 3 4 5 6 7 9999
PrintDList(DL);
search=GetElem(DL,2);
if(search!=NULL){
printf("successfully GetElem\n");
printf("%d\n",search->data);
}
search=LocateElem(DL,4);
if(search!=NULL){
printf("successfully locateElem\n");
printf("%d\n",search->data);
}
DListFrontInsert(DL,3,99);
PrintDList(DL);
DListDelete(DL,2);
PrintDList(DL);
}