今天继续昨天的内容实现了一些数据的插入操作,然后修复了新建链表时的一个bug。然后其实这个链表在设计上是有一点问题的,仔细读代码的话应该不难发现,不过好在本例的目的只是学习所以没有什么影响。明天明天我需要考虑一下接下来继续完成链表的操作还是直接实现书上多项式计算的例子。
最后一个感触就是代码这东西,不经常敲真的是手生啊。
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int ElemType;
typedef int Status;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}*Link, Position;
typedef struct
{
Link head,tail;
int length;
}LinkList;
Status InitList(LinkList *L, int n);
Status ShowList(LinkList L);
Status InsNodeFirst(LinkList *L, ElemType e);
Status InsNodeLast(LinkList *L, ElemType e);
Status Append(LinkList *L, Link s);
int ListLength(LinkList L);
Link ListHead(LinkList L);
Link ListTail(LinkList L);
Status InsertList(LinkList *L, int n, ElemType e);
Status GetElem(LinkList L, int n, ElemType *e);
int GetElemPos(LinkList L, ElemType e);
int main(void)
{
printf("带有头节点和尾节点的链表\n");
LinkList myLinkList;
InitList(&myLinkList, 8);
InsNodeFirst(&myLinkList, 9);
InsNodeLast(&myLinkList, 100);
ShowList(myLinkList);
LinkList yourLinkList;
InitList(&yourLinkList, 4);
ShowList(yourLinkList);
Append(&myLinkList, yourLinkList.head->next);
ShowList(myLinkList);
InsertList(&yourLinkList, 2, 300);
ShowList(yourLinkList);
ElemType e;
GetElem(yourLinkList, 2, &e);
printf("第2个元素是%d\n",e);
printf("%d",GetElemPos(yourLinkList, 4));
system("pause");
}
Status InitList(LinkList *L, int n)
{
Link p,s;
L->head = (Link)malloc(sizeof(Link));
L->length = 0;
s = L->head;
int i = 0;
while(i<n)
{
p = (Link)malloc(sizeof(Link));
p->data = i+1;
s->next = p;
s = p;
i++;
L->length++;
}
s->next = NULL;
L->tail = s;
return OK;
}
Status ShowList(LinkList L)
{
Link p = L.head;
printf("链表的长度是%d\n", L.length);
if(!p->next)
return ERROR;
do
{
p = p->next;
printf("%d\t",p->data);
}while(p->next);
printf("\n");
return OK;
}
Status InsNodeFirst(LinkList *L, ElemType e)
{
Link p;
p = (Link)malloc(sizeof(Link));
p->data = e;
p->next = L->head->next;
L->head->next = p;
L->length ++;
return OK;
}
Status InsNodeLast(LinkList *L, ElemType e)
{
Link p;
p = L->head;
while(p->next)
{
p = p->next;
}
p->next = (Link)malloc(sizeof(Link));
p = p->next;
p->data = e;
p->next =NULL;
L->length ++;
L->tail = p;
return OK;
}
Status Append(LinkList *L, Link s)
{
Link p;
p = L->tail;
p->next = s;
while(p->next)
{
p = p->next;
L->length++;
}
L->tail = p;
return OK;
}
int ListLength(LinkList L)
{
return L.length;
}
Link ListHead(LinkList L)
{
return L.head;
}
Link ListTail(LinkList L)
{
return L.tail;
}
Status InsertList(LinkList *L, int n, ElemType e)
{
if(n>L->length+1)
return ERROR;
if(n == L->length)
{
InsNodeLast(L, e);
return OK;
}
int i = 1;
Link p,s;
p = L->head;
while( p->next && i<n )
{
p = p->next;
i++;
}
s = (Link)malloc(sizeof(Link));
s->next = p->next;
s->data = e;
p->next = s;
L->length++;
return OK;
}
Status GetElem(LinkList L, int n, ElemType *e)
{
if(n>L.length || n<1)
return ERROR;
Link p;
p = L.head->next;
int i = 1;
while(i<n)
{
p = p->next;
i++;
}
*e = p->data;
return OK;
}
int GetElemPos(LinkList L, ElemType e)
{
Link p = L.head;
int i = 0;
do
{
if(p->data==e)
return i;
i++;
p = p->next;
}while(p);
return -99;
}
此外,我也希望桐桐能够看到,其实我也还没有真正想好将来要不要和你在一起,虽然你也不愿意要我。然后希望有一天你能够看到,而且那时我还坚持着这个博客,能够让你看到我还是能够为你坚持做一件事情的。