void push(int);
int pop();
int *pi,*tos;
main()
{
int v;
pi=(int *)malloc(50*sizeof(int));
if(!pi)
{
printf(allocation failure\n);
exit(0);
}
tos=pi;
do
{
printf(please input value,push it;enter 0 then pop;(enter -1 then stop)\n);
scanf(%d,&v);
if(v!=0) push(v);
else printf(pop this is it %d\n,pop());
}
while(v!=-1);
}
void push(int i)
{
pi++;
if(pi==(tos+50))
{
printf(stack overflow\n);
exit(0);
}
*pi=i;
}
int pop()
{
if(pi==tos)
{
printf(stack underflow\n);
exit(0);
}
pi--;
return *(pi+1);
}
程序分配100字節的堆空間,轉換成int型賦給pi,當pi為NULL時,表示沒有可用的空間了,則顯示allocation failure。輸入一個整數,壓入棧中,當超過50時,則顯示stack overflow.當輸入0時,則把棧中的數據彈出。這個程序也演示了棧的後進先出的特點。
struct address
{
char name[30];
char street[40];
char city[20];
char state[10];
char zip[6];
struct address *next; /*pointer to next entry*/
}list_entry;
該結構中前五個成員是該節點的信息部分,最後一個成員是指向同一個結構類型的指針。即next又指向一個同樣結構類型的節點。
#include stdlib.h
#include alloc.h
#include stdio.h
#include string.h
struct address
{
char name[30];
char street[40];
char city[20];
char state[10];
char zip[6];
struct address *next;
}list_entry;
void inputs(char *,char *,int);
void dls_store(struct address*);
main()
{
struct address *info;
int i;
for(i=0;i<5;i++)
{
info=(struct address *)malloc(sizeof(list_entry));
inputs(enter name:,info->name,30);
inputs(enter street:,info->street,40);
inputs(enter city:,info->city,20);
inputs(enter state:,info->state,10);
inputs(enter zip:,info->zip,6);
dls_store(info);
}
}
void inputs(char *prompt,char *s,int count)
{
char p[255];
do
{
printf(prompt);
gets(p);
if(strlen(p)>count) printf(\n too long \n);
}
while(strlen(p)>count);
strcpy(s,p);
}
void dls_store(struct address *in)
{
static struct address *last=NULL;
if(!last) last=in;
else last->next=in;
in->next=NULL;
last=in;
}
inputs()函數比較簡單,就不說明了。
/*刪除節點函數*/
void delete(struct address *info,struct address *old)
{
if(info)
{
if(info==start) start=info->next; /*刪除的是第一個節點*/
else
{
old->next=info->next; /*被刪除節點前的指針指向下一個節點*/
last=old; /*若節點是鏈表尾,則該節點前的節點指針指向NULL*/
}
free(info); /*釋放刪除節點占用空間*/
}
}
/*查找鏈表中是否有該數據*/
struct address *search(struct address *top,char *n)
{
while(top)
{
if(!strcmp(n,top->name)) return top; /*找到要刪除的節點指針*/
top=top->next; /*繼續找*/
}
return NULL; /*沒有找到*/
}
/*鏈表的輸出*/
void display(struct address *top)
{
while(top)
{
printf(top->name);
top=top->next;
}
}
鏈表問題比較復雜,但又是很重要的概念。上面說的輸入,查找,刪除,插入等功能一定要理解,可以參考別的一些資料看看。
上面說的單鏈表,但是單鏈表有一個缺點,就是無法反向操作,當某一個鏈因破壞而斷裂,則整個鏈就被破壞而無法恢復。雙鏈表可以彌補這個缺點,所謂雙鏈表是指每個節點有兩個指針項,一個指針指向其前面的節點,而另一個指針指向後面的節點。關於雙鏈表的使用相對要復雜一些,這裡就不介紹了,可以找其他一些資料看看。