单链表的基本运算
单链表的定义
1. #include <stdio.h>
2. #include <malloc.h>
3. 4. typedef char ElemType;
5. 6. typedef struct node
7. {
8. ElemType data; /*数据域*/
9. struct node *next; /*指针域*/
10. } SLink;
初始化单链表
1. void InitList(SLink *&L) /*L作为引用型参数*/
2. {
3. L=(SLink *)malloc(sizeof(SLink)); /*创建头结点*L*/
4. L->next=NULL;
5. }
求线性表的长度
1. int GetLength(SLink *L) /*求线性表的长度*/
2. {
3. int i=0;
4. SLink *p=L->next;
5. while (p!=NULL)
6. {
7. i++;
8. p=p->next;
9. }
10. return i;
11. }
求线性表中第i个元素
1. int GetElem(SLink *L,int i,ElemType &e) /*求线性表中第i个元素*/
2. {
3. int j=1;
4. SLink *p=L->next;
5. if (i<1 || i>GetLength(L))
6. return(0); /*i参数不正确,返回0*/
7. while (j<i) /*从第1个结点开始找,查找第i个结点*/
8. {
9. p=p->next;j++;
10. }
11. e=p->data;
12. return(1); /*返回1*/
13. }
按值查找
1. int Locate(SLink *L,ElemType x) /*按值查找*/
2. {
3. int i=1;
4. SLink *p=L->next;
5. while (p!=NULL && p->data!=x) /*从第1个结点开始查找data域为x的结点*/
6. {
7. p=p->next;
8. i++;
9. }
10. if (p==NULL)
11. return(0);
12. else
13. return(i);
14. }
插入结点
1. int InsElem(SLink *L,ElemType x,int i) /*插入结点*/
2. {
3. int j=1;
4. SLink *p=L,*s;
5. s=(SLink *)malloc(sizeof(SLink)); /*创建data域为x的结点*/
6. s->data=x;s->next=NULL;
7. if (i<1 || i>GetLength(L)+1)
8. return 0; /*i参数不正确,插入失败,返回0*/
9. while (j<i) /*从头结点开始找,查找第i-1个结点,由p指向它*/
10. {
11. p=p->next;j++;
12. }
13. s->next=p->next; /*将*s的next域指向*p的下一个结点(即第i个结点)*/
14. p->next=s; /*将*p的next域指向*s,这样*s变成第i个结点*/
15. return 1; /*插入运算成功,返回1*/
16. }
删除结点
1. int DelElem(SLink *L,int i) /*删除结点*/
2. {
3. int j=1;
4. SLink *p=L,*q;
5. if (i<1 || i>GetLength(L))
6. return 0; /*i参数不正确,插入失败,返回0*/
7. while (j<i) /*从头结点开始,查找第i-1个结点,由p指向它*/
8. {
9. p=p->next;j++;
10. }
11. q=p->next; /*由q指向第i个结点*/
12. p->next=q->next; /*将*p的next指向*q之后结点,即从链表中删除第i个结点*/
13. free(q); /*释放第i个结点占用的空间*/
14. return 1; /*删除运算成功,返回1*/
15. }
输出单链表
1. void DispList(SLink *L) /*输出单链表*/
2. {
3. SLink *p=L->next;
4. while (p!=NULL)
5. {
6. printf("%c ",p->data);
7. p=p->next;
8. }
9. printf("\n");
10. }
main
1. void main()
2. {
3. int i;
4. ElemType e;
5. SLink *L;
6. InitList(L); /*初始化单链表L*/
7. InsElem(L,'a',1); /*插入元素*/
8. InsElem(L,'c',2);
9. InsElem(L,'a',3);
10. InsElem(L,'e',4);
11. InsElem(L,'d',5);
12. InsElem(L,'b',6);
13. printf("线性表:");DispList(L);
14. printf("长度:%d\n",GetLength(L));
15. i=3;GetElem(L,i,e);
16. printf("第%d个元素:%c\n",i,e);
17. e='a';
18. printf("元素%c是第%d个元素\n",e,Locate(L,e));
19. i=4;printf("删除第%d个元素\n",i);
20. DelElem(L,i);
21. printf("线性表:");DispList(L);
22. }